diff options
-rw-r--r-- | fsck/dump.c | 12 | ||||
-rw-r--r-- | fsck/fsck.c | 58 | ||||
-rw-r--r-- | fsck/fsck.h | 3 | ||||
-rw-r--r-- | fsck/mount.c | 10 | ||||
-rw-r--r-- | include/f2fs_fs.h | 4 |
5 files changed, 40 insertions, 47 deletions
diff --git a/fsck/dump.c b/fsck/dump.c index 07dc2fc..390361d 100644 --- a/fsck/dump.c +++ b/fsck/dump.c @@ -627,8 +627,8 @@ static void dump_dirent(u32 blk_addr, int is_inline, int enc_name) while (i < d.max) { struct f2fs_dir_entry *de; - unsigned char en[F2FS_NAME_LEN + 1]; - u16 en_len, name_len; + char en[F2FS_PRINT_NAMELEN]; + u16 name_len; int enc; if (!test_bit_le(i, d.bitmap)) { @@ -654,18 +654,16 @@ static void dump_dirent(u32 blk_addr, int is_inline, int enc_name) } } - en_len = convert_encrypted_name(d.filename[i], - le16_to_cpu(de->name_len), en, enc); - en[en_len] = '\0'; + pretty_print_filename(d.filename[i], name_len, en, enc); DBG(1, "bitmap pos[0x%x] name[%s] len[0x%x] hash[0x%x] ino[0x%x] type[0x%x]\n", i, en, - le16_to_cpu(de->name_len), + name_len, le32_to_cpu(de->hash_code), le32_to_cpu(de->ino), de->file_type); - i += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); + i += GET_DENTRY_SLOTS(name_len); } free(blk); diff --git a/fsck/fsck.c b/fsck/fsck.c index 3b54878..23a32ab 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -660,7 +660,7 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, u64 i_size = le64_to_cpu(node_blk->i.i_size); u64 i_blocks = le64_to_cpu(node_blk->i.i_blocks); int ofs; - unsigned char *en; + char *en; u32 namelen; unsigned int idx = 0; unsigned short i_gc_failures; @@ -907,7 +907,7 @@ check: } } skip_blkcnt_fix: - en = malloc(F2FS_NAME_LEN + 1); + en = malloc(F2FS_PRINT_NAMELEN); ASSERT(en); namelen = le32_to_cpu(node_blk->i.i_namelen); @@ -926,9 +926,8 @@ skip_blkcnt_fix: } else namelen = F2FS_NAME_LEN; } - namelen = convert_encrypted_name(node_blk->i.i_name, namelen, - en, file_enc_name(&node_blk->i)); - en[namelen] = '\0'; + pretty_print_filename(node_blk->i.i_name, namelen, en, + file_enc_name(&node_blk->i)); if (ftype == F2FS_FT_ORPHAN) DBG(1, "Orphan Inode: 0x%x [%s] i_blocks: %u\n\n", le32_to_cpu(node_blk->footer.ino), @@ -1168,45 +1167,40 @@ static const char *lookup_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; /** - * digest_encode() - + * base64_encode() - * - * Encodes the input digest using characters from the set [a-zA-Z0-9_+]. + * Encodes the input string using characters from the set [A-Za-z0-9+,]. * The encoded string is roughly 4/3 times the size of the input string. */ -static int digest_encode(const char *src, int len, char *dst) +static int base64_encode(const u8 *src, int len, char *dst) { - int i = 0, bits = 0, ac = 0; + int i, bits = 0, ac = 0; char *cp = dst; - while (i < len && i < 24) { - ac += (((unsigned char) src[i]) << bits); + for (i = 0; i < len; i++) { + ac += src[i] << bits; bits += 8; do { *cp++ = lookup_table[ac & 0x3f]; ac >>= 6; bits -= 6; } while (bits >= 6); - i++; } if (bits) *cp++ = lookup_table[ac & 0x3f]; - *cp = 0; return cp - dst; } -int convert_encrypted_name(unsigned char *name, u32 len, - unsigned char *new, int enc_name) +void pretty_print_filename(const u8 *raw_name, u32 len, + char out[F2FS_PRINT_NAMELEN], int enc_name) { - if (!enc_name) { - if (len > F2FS_NAME_LEN) - len = F2FS_NAME_LEN; - memcpy(new, name, len); - new[len] = 0; - return len; - } + len = min(len, (u32)F2FS_NAME_LEN); - *new = '_'; - return digest_encode((const char *)name, len, (char *)new + 1); + if (enc_name) + len = base64_encode(raw_name, len, out); + else + memcpy(out, raw_name, len); + out[len] = 0; } static void print_dentry(__u32 depth, __u8 *name, @@ -1218,7 +1212,7 @@ static void print_dentry(__u32 depth, __u8 *name, u32 name_len; unsigned int i; int bit_offset; - unsigned char new[F2FS_NAME_LEN + 1]; + char new[F2FS_PRINT_NAMELEN]; if (!c.show_dentry) return; @@ -1248,7 +1242,7 @@ static void print_dentry(__u32 depth, __u8 *name, for (i = 1; i < depth; i++) printf("%c ", tree_mark[i]); - convert_encrypted_name(name, name_len, new, enc_name); + pretty_print_filename(name, name_len, new, enc_name); printf("%c-- %s <ino = 0x%x>, <encrypted (%d)>\n", last_de ? '`' : '|', @@ -1263,10 +1257,9 @@ static int f2fs_check_hash_code(struct f2fs_dir_entry *dentry, /* fix hash_code made by old buggy code */ if (dentry->hash_code != hash_code) { - unsigned char new[F2FS_NAME_LEN + 1]; + char new[F2FS_PRINT_NAMELEN]; - convert_encrypted_name((unsigned char *)name, len, - new, enc_name); + pretty_print_filename(name, len, new, enc_name); FIX_MSG("Mismatch hash_code for \"%s\" [%x:%x]", new, le32_to_cpu(dentry->hash_code), hash_code); @@ -1380,8 +1373,8 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child, int dentries = 0; u32 blk_cnt; u8 *name; - unsigned char en[F2FS_NAME_LEN + 1]; - u16 name_len, en_len; + char en[F2FS_PRINT_NAMELEN]; + u16 name_len; int ret = 0; int fixed = 0; int i, slots; @@ -1507,8 +1500,7 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child, } } - en_len = convert_encrypted_name(name, name_len, en, enc_name); - en[en_len] = '\0'; + pretty_print_filename(name, name_len, en, enc_name); DBG(1, "[%3u]-[0x%x] name[%s] len[0x%x] ino[0x%x] type[0x%x]\n", fsck->dentry_depth, i, en, name_len, le32_to_cpu(dentry[i].ino), diff --git a/fsck/fsck.h b/fsck/fsck.h index cbd6e93..d09c0d8 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -156,7 +156,8 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *, struct child_info *); int fsck_chk_meta(struct f2fs_sb_info *sbi); int fsck_chk_curseg_info(struct f2fs_sb_info *); -int convert_encrypted_name(unsigned char *, u32, unsigned char *, int); +void pretty_print_filename(const u8 *raw_name, u32 len, + char out[F2FS_PRINT_NAMELEN], int enc_name); extern void update_free_segments(struct f2fs_sb_info *); void print_cp_state(u32); diff --git a/fsck/mount.c b/fsck/mount.c index aa64e93..b0acc9a 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -173,16 +173,14 @@ void print_inode_info(struct f2fs_sb_info *sbi, struct f2fs_inode *inode = &node->i; void *xattr_addr; struct f2fs_xattr_entry *ent; - unsigned char en[F2FS_NAME_LEN + 1]; + char en[F2FS_PRINT_NAMELEN]; unsigned int i = 0; u32 namelen = le32_to_cpu(inode->i_namelen); int enc_name = file_enc_name(inode); int ofs = __get_extra_isize(inode); - namelen = convert_encrypted_name(inode->i_name, namelen, en, enc_name); - en[namelen] = '\0'; - if (name && namelen) { - inode->i_name[namelen] = '\0'; + pretty_print_filename(inode->i_name, namelen, en, enc_name); + if (name && en[0]) { MSG(0, " - File name : %s%s\n", en, enc_name ? " <encrypted>" : ""); setlocale(LC_ALL, ""); @@ -214,7 +212,7 @@ void print_inode_info(struct f2fs_sb_info *sbi, DISP_u32(inode, i_pino); DISP_u32(inode, i_dir_level); - if (namelen) { + if (en[0]) { DISP_u32(inode, i_namelen); printf("%-30s\t\t[%s]\n", "i_name", en); } diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index b4f992f..f0d2bcf 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -721,6 +721,10 @@ struct f2fs_extent { } __attribute__((packed)); #define F2FS_NAME_LEN 255 + +/* max output length of pretty_print_filename() including null terminator */ +#define F2FS_PRINT_NAMELEN (4 * ((F2FS_NAME_LEN + 2) / 3) + 1) + /* 200 bytes for inline xattrs by default */ #define DEFAULT_INLINE_XATTR_ADDRS 50 #define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */ |