From d24e990e0f5de61154798349a26d094bd7743c5d Mon Sep 17 00:00:00 2001 From: Sven Hoexter Date: Tue, 13 Aug 2024 11:41:23 +0200 Subject: [PATCH] New upstream version 1.2.5 --- Makefile.am | 1 + Makefile.in | 1 + NEWS | 21 +++++ configure | 20 ++-- dump/dump.c | 5 +- exfat2img/exfat2img.c | 2 +- fsck/fsck.c | 54 +++++------ fsck/repair.c | 79 +++++++++------- fsck/repair.h | 3 +- include/exfat_ondisk.h | 18 ++-- include/libexfat.h | 3 +- include/version.h | 2 +- label/label.c | 5 +- lib/exfat_dir.c | 3 +- lib/exfat_fs.c | 6 +- lib/libexfat.c | 38 +++++++- mkfs/mkfs.c | 3 +- tests/2tb_disk/exfat.img.tar.xz | Bin 0 -> 13368 bytes tests/bad_bitmap/exfat.img.tar.xz | Bin 0 -> 4056 bytes tests/bad_dentries/exfat.img.tar.xz | Bin 0 -> 9628 bytes tests/bad_dentries2/exfat.img.tar.xz | Bin 0 -> 9724 bytes tests/bad_file_size/exfat.img.tar.xz | Bin 0 -> 4052 bytes tests/bad_first_clu/exfat.img.tar.xz | Bin 0 -> 3232 bytes tests/bad_num_chain/config | 1 + tests/bad_num_chain/exfat.img.tar.xz | Bin 0 -> 4064 bytes tests/bad_root/exfat.img.tar.xz | Bin 0 -> 4528 bytes tests/bs_bad_csum/exfat.img.tar.xz | Bin 0 -> 3036 bytes tests/de_bad_csum/exfat.img.tar.xz | Bin 0 -> 3196 bytes tests/duplicate_clu/exfat.img.tar.xz | Bin 0 -> 4048 bytes tests/duplicated_name/exfat.img.tar.xz | Bin 0 -> 3940 bytes tests/file_invalid_clus/exfat.img.tar.xz | Bin 0 -> 3392 bytes tests/invalid_name/exfat.img.tar.xz | Bin 0 -> 4444 bytes .../large_file_invalid_clus/exfat.img.tar.xz | Bin 0 -> 17280 bytes tests/loop_chain/config | 1 + tests/loop_chain/exfat.img.tar.xz | Bin 0 -> 4052 bytes tests/rename_dot_entry/exfat.img.tar.xz | Bin 0 -> 7336 bytes tests/test_fsck.sh | 88 ++++++++++++++++++ tune/tune.c | 5 +- 38 files changed, 256 insertions(+), 103 deletions(-) create mode 100644 tests/2tb_disk/exfat.img.tar.xz create mode 100644 tests/bad_bitmap/exfat.img.tar.xz create mode 100644 tests/bad_dentries/exfat.img.tar.xz create mode 100644 tests/bad_dentries2/exfat.img.tar.xz create mode 100644 tests/bad_file_size/exfat.img.tar.xz create mode 100644 tests/bad_first_clu/exfat.img.tar.xz create mode 100644 tests/bad_num_chain/config create mode 100644 tests/bad_num_chain/exfat.img.tar.xz create mode 100644 tests/bad_root/exfat.img.tar.xz create mode 100644 tests/bs_bad_csum/exfat.img.tar.xz create mode 100644 tests/de_bad_csum/exfat.img.tar.xz create mode 100644 tests/duplicate_clu/exfat.img.tar.xz create mode 100644 tests/duplicated_name/exfat.img.tar.xz create mode 100644 tests/file_invalid_clus/exfat.img.tar.xz create mode 100644 tests/invalid_name/exfat.img.tar.xz create mode 100644 tests/large_file_invalid_clus/exfat.img.tar.xz create mode 100644 tests/loop_chain/config create mode 100644 tests/loop_chain/exfat.img.tar.xz create mode 100644 tests/rename_dot_entry/exfat.img.tar.xz create mode 100755 tests/test_fsck.sh diff --git a/Makefile.am b/Makefile.am index 3e36f55..51c2c34 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,6 +16,7 @@ dist_man8_MANS = \ # other stuff EXTRA_DIST = \ include \ + tests \ Android.bp \ lib/Android.bp \ mkfs/Android.bp \ diff --git a/Makefile.in b/Makefile.in index 914c23f..3186b63 100644 --- a/Makefile.in +++ b/Makefile.in @@ -374,6 +374,7 @@ dist_man8_MANS = \ # other stuff EXTRA_DIST = \ include \ + tests \ Android.bp \ lib/Android.bp \ mkfs/Android.bp \ diff --git a/NEWS b/NEWS index 072344e..ffbbdc1 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,24 @@ +exfatprogs 1.2.5 - released 2024-08-06 +====================================== + +CHANGES : + * exfatprogs: remove the limitation that the device + path length cannot exceed 254 bytes. + * exfatprogs: include the test images in the release + package. + +NEW FEATURES : + * fsck.exfat: check and repair the filename which has + invalid characters. + +BUG FIXES : + * tune.exfat: check whether the volume has invalid + characters correctly. + * fsck.exfat: check whether the filename and volume + has invalid characters correctly. + * fsck.exfat: fix endianess issues which happen + in the big-endian system. + exfatprogs 1.2.4 - released 2024-06-17 ====================================== diff --git a/configure b/configure index f1e6d79..8e6d08b 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for exfatprogs 1.2.4. +# Generated by GNU Autoconf 2.69 for exfatprogs 1.2.5. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='exfatprogs' PACKAGE_TARNAME='exfatprogs' -PACKAGE_VERSION='1.2.4' -PACKAGE_STRING='exfatprogs 1.2.4' +PACKAGE_VERSION='1.2.5' +PACKAGE_STRING='exfatprogs 1.2.5' PACKAGE_BUGREPORT='linkinjeon@kernel.org' PACKAGE_URL='https://github.com/exfatprogs/exfatprogs' @@ -1325,7 +1325,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures exfatprogs 1.2.4 to adapt to many kinds of systems. +\`configure' configures exfatprogs 1.2.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1396,7 +1396,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of exfatprogs 1.2.4:";; + short | recursive ) echo "Configuration of exfatprogs 1.2.5:";; esac cat <<\_ACEOF @@ -1508,7 +1508,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -exfatprogs configure 1.2.4 +exfatprogs configure 1.2.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1786,7 +1786,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by exfatprogs $as_me 1.2.4, which was +It was created by exfatprogs $as_me 1.2.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2654,7 +2654,7 @@ fi # Define the identity of the package. PACKAGE='exfatprogs' - VERSION='1.2.4' + VERSION='1.2.5' cat >>confdefs.h <<_ACEOF @@ -13253,7 +13253,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by exfatprogs $as_me 1.2.4, which was +This file was extended by exfatprogs $as_me 1.2.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -13320,7 +13320,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -exfatprogs config.status 1.2.4 +exfatprogs config.status 1.2.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/dump/dump.c b/dump/dump.c index 73a231a..e15e195 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -244,11 +244,10 @@ int main(int argc, char *argv[]) if (version_only) exit(EXIT_FAILURE); - if (argc < 2) + if (argc - optind != 1) usage(); - memset(ui.dev_name, 0, sizeof(ui.dev_name)); - snprintf(ui.dev_name, sizeof(ui.dev_name), "%s", argv[1]); + ui.dev_name = argv[1]; ret = exfat_get_blk_dev_info(&ui, &bd); if (ret < 0) diff --git a/exfat2img/exfat2img.c b/exfat2img/exfat2img.c index bd9db44..e75b42f 100644 --- a/exfat2img/exfat2img.c +++ b/exfat2img/exfat2img.c @@ -926,7 +926,7 @@ int main(int argc, char * const argv[]) } memset(&ui, 0, sizeof(ui)); - snprintf(ui.dev_name, sizeof(ui.dev_name), "%s", blkdev_path); + ui.dev_name = blkdev_path; if (restore) ui.writeable = true; else diff --git a/fsck/fsck.c b/fsck/fsck.c index fe8a122..48e64cd 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -647,7 +647,6 @@ static int handle_duplicated_filename(struct exfat_de_iter *iter, { int ret; struct exfat_lookup_filter filter; - char filename[PATH_MAX + 1] = {0}; ret = exfat_lookup_file_by_utf16name(iter->exfat, iter->parent, inode->name, &filter); @@ -660,14 +659,7 @@ static int handle_duplicated_filename(struct exfat_de_iter *iter, if (exfat_de_iter_device_offset(iter) == filter.out.dev_offset) return 0; - ret = exfat_utf16_dec(inode->name, NAME_BUFFER_SIZE, filename, - PATH_MAX); - if (ret < 0) { - exfat_err("failed to decode filename\n"); - return ret; - } - - return exfat_repair_rename_ask(&exfat_fsck, iter, filename, + return exfat_repair_rename_ask(&exfat_fsck, iter, inode->name, ER_DE_DUPLICATED_NAME, "filename is duplicated"); } @@ -682,7 +674,7 @@ static int check_name_dentry_set(struct exfat_de_iter *iter, exfat_de_iter_get(iter, 1, &stream_de); name_len = exfat_utf16_len(inode->name, NAME_BUFFER_SIZE); - if (stream_de->stream_name_len != name_len) { + if (name_len && stream_de->stream_name_len != name_len) { if (repair_file_ask(iter, NULL, ER_DE_NAME_LEN, "the name length of a file is wrong")) { exfat_de_iter_get_dirty(iter, 1, &stream_de); @@ -693,6 +685,18 @@ static int check_name_dentry_set(struct exfat_de_iter *iter, } } + ret = exfat_check_name(inode->name, stream_de->stream_name_len); + if (ret != stream_de->stream_name_len) { + char err_msg[36]; + + snprintf(err_msg, sizeof(err_msg), + "filename has invalid character '%c'", + le16_to_cpu(inode->name[ret])); + + return exfat_repair_rename_ask(&exfat_fsck, iter, inode->name, + ER_DE_INVALID_NAME, err_msg); + } + hash = exfat_calc_name_hash(iter->exfat, inode->name, (int)name_len); if (cpu_to_le16(hash) != stream_de->stream_name_hash) { if (repair_file_ask(iter, NULL, ER_DE_NAME_HASH, @@ -713,21 +717,18 @@ static int check_name_dentry_set(struct exfat_de_iter *iter, return ret; } -const __le16 MSDOS_DOT[ENTRY_NAME_MAX] = {cpu_to_le16(46), 0, }; -const __le16 MSDOS_DOTDOT[ENTRY_NAME_MAX] = {cpu_to_le16(46), cpu_to_le16(46), 0, }; - static int handle_dot_dotdot_filename(struct exfat_de_iter *iter, - struct exfat_dentry *dentry, + __le16 *filename, int strm_name_len) { - char *filename; + int i; - if (!memcmp(dentry->name_unicode, MSDOS_DOT, strm_name_len * 2)) - filename = "."; - else if (!memcmp(dentry->name_unicode, MSDOS_DOTDOT, - strm_name_len * 2)) - filename = ".."; - else + for (i = 0; i < strm_name_len; i++) { + if (filename[i] != UTF16_DOT) + return 0; + } + + if (filename[i]) return 0; return exfat_repair_rename_ask(&exfat_fsck, iter, filename, @@ -817,7 +818,7 @@ static int read_file_dentry_set(struct exfat_de_iter *iter, } if (file_de->file_num_ext == 2 && stream_de->stream_name_len <= 2) { - ret = handle_dot_dotdot_filename(iter, dentry, + ret = handle_dot_dotdot_filename(iter, node->name, stream_de->stream_name_len); if (ret < 0) { *skip_dentries = file_de->file_num_ext + 1; @@ -1005,7 +1006,7 @@ static int read_bitmap(struct exfat *exfat) exfat->disk_bitmap_size = DIV_ROUND_UP(exfat->clus_count, 8); exfat_bitmap_set_range(exfat, exfat->alloc_bitmap, - le64_to_cpu(dentry->bitmap_start_clu), + le32_to_cpu(dentry->bitmap_start_clu), DIV_ROUND_UP(exfat->disk_bitmap_size, exfat->clus_size)); free(filter.out.dentry_set); @@ -1034,9 +1035,8 @@ static int decompress_upcase_table(const __le16 *in_table, size_t in_len, ch = le16_to_cpu(in_table[i]); if (ch == 0xFFFF && i + 1 < in_len) { - uint16_t len = le16_to_cpu(in_table[++i]); - - k += len; + ++i; + k += le16_to_cpu(in_table[i]); } else { out_table[k++] = ch; } @@ -1616,7 +1616,7 @@ int main(int argc, char * const argv[]) exfat_fsck.options = ui.options; - snprintf(ui.ei.dev_name, sizeof(ui.ei.dev_name), "%s", argv[optind]); + ui.ei.dev_name = argv[optind]; ret = exfat_get_blk_dev_info(&ui.ei, &bd); if (ret < 0) { exfat_err("failed to open %s. %d\n", ui.ei.dev_name, ret); diff --git a/fsck/repair.c b/fsck/repair.c index 6179b65..420b1fb 100644 --- a/fsck/repair.c +++ b/fsck/repair.c @@ -55,6 +55,7 @@ static struct exfat_repair_problem problems[] = { {ER_DE_NAME_LEN, ERF_PREEN_YES, ERP_FIX, 0, 0, 0}, {ER_DE_DOT_NAME, ERF_PREEN_YES, ERP_RENAME, 2, 3, 4}, {ER_DE_DUPLICATED_NAME, ERF_PREEN_YES, ERP_RENAME, 2, 3, 4}, + {ER_DE_INVALID_NAME, ERF_PREEN_YES, ERP_RENAME, 2, 3, 4}, {ER_FILE_VALID_SIZE, ERF_PREEN_YES, ERP_FIX, 0, 0, 0}, {ER_FILE_INVALID_CLUS, ERF_PREEN_YES, ERP_TRUNCATE, 0, 0, 0}, {ER_FILE_FIRST_CLUS, ERF_PREEN_YES, ERP_TRUNCATE, 0, 0, 0}, @@ -160,36 +161,37 @@ int exfat_repair_ask(struct exfat_fsck *fsck, er_problem_code_t prcode, return repair; } -static int check_bad_char(char w) -{ - return (w < 0x0020) || (w == '*') || (w == '?') || (w == '<') || - (w == '>') || (w == '|') || (w == '"') || (w == ':') || - (w == '/') || (w == '\\'); -} - -static char *get_rename_from_user(struct exfat_de_iter *iter) +static int get_rename_from_user(struct exfat_de_iter *iter, + __le16 *utf16_name, int name_size) { + int len = 0; char *rename = malloc(ENTRY_NAME_MAX + 2); if (!rename) - return NULL; + return -ENOMEM; retry: /* +2 means LF(Line Feed) and NULL terminator */ memset(rename, 0x1, ENTRY_NAME_MAX + 2); printf("New name: "); if (fgets(rename, ENTRY_NAME_MAX + 2, stdin)) { - int i, len, err; + int err; struct exfat_lookup_filter filter; len = strlen(rename); /* Remove LF in filename */ rename[len - 1] = '\0'; - for (i = 0; i < len - 1; i++) { - if (check_bad_char(rename[i])) { - printf("filename contain invalid character(%c)\n", rename[i]); - goto retry; - } + + memset(utf16_name, 0, name_size); + len = exfat_utf16_enc(rename, utf16_name, name_size); + if (len < 0) + goto out; + + err = exfat_check_name(utf16_name, len >> 1); + if (err != len >> 1) { + printf("filename contain invalid character(%c)\n", + le16_to_cpu(utf16_name[err])); + goto retry; } exfat_de_iter_flush(iter); @@ -200,23 +202,27 @@ retry: } } - return rename; +out: + free(rename); + + return len; } -static char *generate_rename(struct exfat_de_iter *iter) +static int generate_rename(struct exfat_de_iter *iter, __le16 *utf16_name, + int name_size) { + int err; char *rename; if (iter->invalid_name_num > INVALID_NAME_NUM_MAX) - return NULL; + return -ERANGE; rename = malloc(ENTRY_NAME_MAX + 1); if (!rename) - return NULL; + return -ENOMEM; while (1) { struct exfat_lookup_filter filter; - int err; snprintf(rename, ENTRY_NAME_MAX + 1, "FILE%07d.CHK", iter->invalid_name_num++); @@ -227,13 +233,23 @@ static char *generate_rename(struct exfat_de_iter *iter) break; } - return rename; + memset(utf16_name, 0, name_size); + err = exfat_utf16_enc(rename, utf16_name, name_size); + free(rename); + + return err; } int exfat_repair_rename_ask(struct exfat_fsck *fsck, struct exfat_de_iter *iter, - char *old_name, er_problem_code_t prcode, char *error_msg) + __le16 *uname, er_problem_code_t prcode, char *error_msg) { int num; + char old_name[PATH_MAX + 1] = {0}; + + if (exfat_utf16_dec(uname, NAME_BUFFER_SIZE, old_name, PATH_MAX) <= 0) { + exfat_err("failed to decode filename\n"); + return -EINVAL; + } ask_again: num = exfat_repair_ask(fsck, prcode, "ERROR: '%s' %s.\n%s", @@ -243,38 +259,31 @@ ask_again: " [3] Bypass this check(No repair)\n"); if (num) { __le16 utf16_name[ENTRY_NAME_MAX]; - char *rename = NULL; __u16 hash; struct exfat_dentry *dentry; int ret; switch (num) { case 1: - rename = get_rename_from_user(iter); + ret = get_rename_from_user(iter, utf16_name, + sizeof(utf16_name)); break; case 2: - rename = generate_rename(iter); + ret = generate_rename(iter, utf16_name, + sizeof(utf16_name)); break; case 3: - break; + return -EINVAL; default: exfat_info("select 1 or 2 number instead of %d\n", num); goto ask_again; } - if (!rename) + if (ret < 0) return -EINVAL; - exfat_info("%s filename is renamed to %s\n", old_name, rename); - exfat_de_iter_get_dirty(iter, 2, &dentry); - memset(utf16_name, 0, sizeof(utf16_name)); - ret = exfat_utf16_enc(rename, utf16_name, sizeof(utf16_name)); - free(rename); - if (ret < 0) - return ret; - ret >>= 1; memcpy(dentry->name_unicode, utf16_name, ENTRY_NAME_MAX * 2); hash = exfat_calc_name_hash(iter->exfat, utf16_name, ret); diff --git a/fsck/repair.h b/fsck/repair.h index f1cde24..2d46b8e 100644 --- a/fsck/repair.h +++ b/fsck/repair.h @@ -19,6 +19,7 @@ #define ER_DE_NAME_LEN 0x00001032 #define ER_DE_DOT_NAME 0x00001033 #define ER_DE_DUPLICATED_NAME 0x00001034 +#define ER_DE_INVALID_NAME 0x00001035 #define ER_FILE_VALID_SIZE 0x00002001 #define ER_FILE_INVALID_CLUS 0x00002002 #define ER_FILE_FIRST_CLUS 0x00002003 @@ -35,5 +36,5 @@ int exfat_repair_ask(struct exfat_fsck *fsck, er_problem_code_t prcode, const char *fmt, ...); int exfat_repair_rename_ask(struct exfat_fsck *fsck, struct exfat_de_iter *iter, - char *old_name, er_problem_code_t prcode, char *error_msg); + __le16 *uname, er_problem_code_t prcode, char *error_msg); #endif diff --git a/include/exfat_ondisk.h b/include/exfat_ondisk.h index 2137226..636f5ea 100644 --- a/include/exfat_ondisk.h +++ b/include/exfat_ondisk.h @@ -7,23 +7,29 @@ #define _EXFAT_H #include +#include #include #ifdef HAVE_CONFIG_H #include #endif +#define UTF16_NULL 0x0000 + #ifdef WORDS_BIGENDIAN -#define cpu_to_le16(x) ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)) -#define cpu_to_le32(x) \ - ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ - (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) -#define cpu_to_le64(x) (cpu_to_le32((uint64_t)(x)) << 32 | \ - cpu_to_le32((uint64_t)(x) >> 32)) +#define cpu_to_le16(x) bswap_16(x) +#define cpu_to_le32(x) bswap_32(x) +#define cpu_to_le64(x) bswap_64(x) + +#define UTF16_DOT 0x2E00 /* . */ +#define UTF16_SLASH 0x2F00 /* / */ #else #define cpu_to_le16(x) (x) #define cpu_to_le32(x) (x) #define cpu_to_le64(x) (x) + +#define UTF16_DOT 0x002E /* . */ +#define UTF16_SLASH 0x002F /* / */ #endif #define le64_to_cpu(x) ((uint64_t)cpu_to_le64(x)) diff --git a/include/libexfat.h b/include/libexfat.h index 2ed9aa7..bcab23a 100644 --- a/include/libexfat.h +++ b/include/libexfat.h @@ -78,7 +78,7 @@ struct exfat_blk_dev { }; struct exfat_user_input { - char dev_name[255]; + const char *dev_name; bool writeable; unsigned int sector_size; unsigned int cluster_size; @@ -190,6 +190,7 @@ bool exfat_heap_clus(struct exfat *exfat, clus_t clus); int exfat_root_clus_count(struct exfat *exfat); int read_boot_sect(struct exfat_blk_dev *bdev, struct pbr **bs); int exfat_parse_ulong(const char *s, unsigned long *out); +int exfat_check_name(__le16 *utf16_name, int len); /* * Exfat Print diff --git a/include/version.h b/include/version.h index 31f150e..e324363 100644 --- a/include/version.h +++ b/include/version.h @@ -5,6 +5,6 @@ #ifndef _VERSION_H -#define EXFAT_PROGS_VERSION "1.2.4" +#define EXFAT_PROGS_VERSION "1.2.5" #endif /* !_VERSION_H */ diff --git a/label/label.c b/label/label.c index 2780143..12d027b 100644 --- a/label/label.c +++ b/label/label.c @@ -78,11 +78,10 @@ int main(int argc, char *argv[]) if (version_only) exit(EXIT_FAILURE); - if (argc < 2) + if (argc - optind != 1) usage(); - memset(ui.dev_name, 0, sizeof(ui.dev_name)); - snprintf(ui.dev_name, sizeof(ui.dev_name), "%s", argv[serial_mode + 1]); + ui.dev_name = argv[serial_mode + 1]; ret = exfat_get_blk_dev_info(&ui, &bd); if (ret < 0) diff --git a/lib/exfat_dir.c b/lib/exfat_dir.c index 7b99af1..f6e0d01 100644 --- a/lib/exfat_dir.c +++ b/lib/exfat_dir.c @@ -577,7 +577,6 @@ uint16_t exfat_calc_name_hash(struct exfat *exfat, for (i = 0; i < len; i++) { ch = exfat->upcase_table[le16_to_cpu(name[i])]; - ch = cpu_to_le16(ch); /* use += to avoid promotion to int; UBSan complaints about signed overflow */ chksum = (chksum << 15) | (chksum >> 1); @@ -692,7 +691,7 @@ int exfat_update_file_dentry_set(struct exfat *exfat, dset[1].dentry.stream.name_len = (__u8)name_len; dset[1].dentry.stream.name_hash = - exfat_calc_name_hash(exfat, utf16_name, name_len); + cpu_to_le16(exfat_calc_name_hash(exfat, utf16_name, name_len)); for (i = 2; i < dcount; i++) { dset[i].type = EXFAT_NAME; diff --git a/lib/exfat_fs.c b/lib/exfat_fs.c index b24f532..ee87bb1 100644 --- a/lib/exfat_fs.c +++ b/lib/exfat_fs.c @@ -249,8 +249,6 @@ int exfat_resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child) int depth, i; int name_len; __le16 *utf16_path; - static const __le16 utf16_slash = cpu_to_le16(0x002F); - static const __le16 utf16_null = cpu_to_le16(0x0000); size_t in_size; ctx->local_path[0] = '\0'; @@ -268,13 +266,13 @@ int exfat_resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child) memcpy((char *)utf16_path, (char *)ctx->ancestors[i]->name, name_len * 2); utf16_path += name_len; - memcpy((char *)utf16_path, &utf16_slash, sizeof(utf16_slash)); + *utf16_path = UTF16_SLASH; utf16_path++; } if (depth > 1) utf16_path--; - memcpy((char *)utf16_path, &utf16_null, sizeof(utf16_null)); + *utf16_path = UTF16_NULL; utf16_path++; in_size = (utf16_path - ctx->utf16_path) * sizeof(__le16); diff --git a/lib/libexfat.c b/lib/libexfat.c index 9cc184f..6d45358 100644 --- a/lib/libexfat.c +++ b/lib/libexfat.c @@ -496,12 +496,20 @@ int exfat_set_volume_label(struct exfat *exfat, char *label_input) volume_label, sizeof(volume_label)); if (volume_label_len < 0) { exfat_err("failed to encode volume label\n"); - free(pvol); - return -1; + err = -1; + goto out; } - memcpy(pvol->vol_label, volume_label, volume_label_len); pvol->vol_char_cnt = volume_label_len/2; + err = exfat_check_name(volume_label, pvol->vol_char_cnt); + if (err != pvol->vol_char_cnt) { + exfat_err("volume label contain invalid character(%c)\n", + le16_to_cpu(label_input[err])); + err = -1; + goto out; + } + + memcpy(pvol->vol_label, volume_label, volume_label_len); loc.parent = exfat->root; loc.file_offset = filter.out.file_offset; @@ -509,6 +517,7 @@ int exfat_set_volume_label(struct exfat *exfat, char *label_input) err = exfat_add_dentry_set(exfat, &loc, pvol, dcount, false); exfat_info("new label: %s\n", label_input); +out: free(pvol); return err; @@ -759,7 +768,7 @@ int exfat_show_volume_serial(int fd) goto free_ppbr; } - exfat_info("volume serial : 0x%x\n", ppbr->bsx.vol_serial); + exfat_info("volume serial : 0x%x\n", le32_to_cpu(ppbr->bsx.vol_serial)); free_ppbr: free(ppbr); @@ -919,6 +928,8 @@ int exfat_set_fat(struct exfat *exfat, clus_t clus, clus_t next_clus) exfat->bs->bsx.sect_size_bits; offset += sizeof(clus_t) * clus; + next_clus = cpu_to_le32(next_clus); + if (exfat_write(exfat->blk_dev->dev_fd, &next_clus, sizeof(next_clus), offset) != sizeof(next_clus)) return -EIO; @@ -1058,3 +1069,22 @@ int exfat_parse_ulong(const char *s, unsigned long *out) return 0; } + +static inline int check_bad_utf16_char(unsigned short w) +{ + return (w < 0x0020) || (w == '*') || (w == '?') || (w == '<') || + (w == '>') || (w == '|') || (w == '"') || (w == ':') || + (w == '/') || (w == '\\'); +} + +int exfat_check_name(__le16 *utf16_name, int len) +{ + int i; + + for (i = 0; i < len; i++) { + if (check_bad_utf16_char(le16_to_cpu(utf16_name[i]))) + break; + } + + return i; +} diff --git a/mkfs/mkfs.c b/mkfs/mkfs.c index f9286c1..71f2b10 100644 --- a/mkfs/mkfs.c +++ b/mkfs/mkfs.c @@ -737,8 +737,7 @@ int main(int argc, char *argv[]) goto out; } - memset(ui.dev_name, 0, sizeof(ui.dev_name)); - snprintf(ui.dev_name, sizeof(ui.dev_name), "%s", argv[optind]); + ui.dev_name = argv[optind]; ret = exfat_get_blk_dev_info(&ui, &bd); if (ret < 0) diff --git a/tests/2tb_disk/exfat.img.tar.xz b/tests/2tb_disk/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..f979bdebd0996a3558aa0fe609b6e667211f236f GIT binary patch literal 13368 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 Li2oImAPoKibU^nr literal 0 HcmV?d00001 diff --git a/tests/bad_dentries/exfat.img.tar.xz b/tests/bad_dentries/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..32643caf9987934a819819f7d4eb45f11c73ac27 GIT binary patch literal 9628 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 G>%RbLbhx|# literal 0 HcmV?d00001 diff --git a/tests/bad_dentries2/exfat.img.tar.xz b/tests/bad_dentries2/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..f266741fa57aa424ec0d11c39fad9ab6514c7163 GIT binary patch literal 9724 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 literal 0 HcmV?d00001 diff --git a/tests/bad_file_size/exfat.img.tar.xz b/tests/bad_file_size/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..df7ff1471fc98f5800f96ebe1d858c91a4dd757f GIT binary patch literal 4052 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 VgLwA0dS^|K(-rZ5g`}2N{{b8_<*Wbz literal 0 HcmV?d00001 diff --git a/tests/bad_first_clu/exfat.img.tar.xz b/tests/bad_first_clu/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..3dc29ec88f48824da4cd486d4fbf8cf25815a11b GIT binary patch literal 3232 zcmV;R3}5s8H+ooF000E$*0e?f03iVu0001VFXf})@Ba*6T>vtk2=9huXrK&lK<@Vg z0k5KkC?^p68%q|#fY(JMd)tS$S>qk$Ce?vr?f)sAB>2AG)i_TFiFWwYbgZZhJ z9TNZ6v0q?ffTDp6>9*7B-+Uu21qyx>F&pSLJbA@2WztH+my>bXlqg+#^d#l|BWLnx z?r4$$mOu29!ob(?OCoQUonT3Zq2N+R zdWmlfllEIRz#VZufYPwUO`oMXm76zkjZ|K=;FS3+(_1^AiGT?vx|^>!K0A);Ei;@z zI@FheH>p;!xMCOp{wNS?kS(QWiygnq=7_kGP808a<9W^0*jqHk;0v2xSz3Evk(GajRVWsSt zc=8I{x>kaYkcl`6Z4kB3$U>mrfYaNlo8ZDi-0s1#3592F`A279D zTb;b8%P6w2I90dt}n;v!rGBT;Xhem_Zcl;3S%uUm}=YfqO zZN}0bx?lpPfwBlRk9OrW8Bq~~R5I=vjzT96tOJ7XO zQFPp5uuSygCF6kn+BSrrI$=v`uAFody@)U13D^b`W{r*S$v6&28NJlC+HA5R#0vZF5k}qS<)L)V<4IZD>4vb+*!T)+Cquo$khpiA)z~lg0b0iyJaC2F zezM+rT2tiV*+ygYW;IIMk*T@?2mR!lVEb2_Qdp4i!Dq7}|3`k{BnM3h`TgDhHi)Md zG@7(T@^O8FIJGn5ASP#%9u%voFSZYRdQy8gp;sikLy%3G+QRKf9ybu8axKv5JBBk)bEE1CrinP{EO>}V$MuZ;UDx2b49}j|P3KJV9H4H>ALM>OHe? zWM_Mi9`+O2@5T3yJ=E3D?U#;+3rjHvJc&y~nm>vN#B(E{Ak81C4R^p+k)=2{mmt@} zwZw69>0zic5XN4UJBTn0L)!b?o2u?R-JW?}22nkAbLiDXVJhG-eS{nTPTB2G0e))u zA*I@0-h-(dbF;=kK0)hPJ^~-*G_R+w;pejyd)h294q4XPwUl-qE5sVH23*~QN{D$P z`JMmkH^+G>aj4hsaLRswNf&S{&9h>?#jJA8aq3l~2Fl#2)A0~-)(wPgsAGVz0{V!dZ{rU5pE-~{t9!)9sT?Pz33-_n6vVS;H(u>M+NGK z8BEof4Ibth-w%G6tK6&CXkK4;zYFr08KaPT?*$4)sTDJ{#`sm7ib~MS`G7s_2EO07 zW_}lL6~(BNFu@A+hN!EgILxss1K`qdy;CO2&fN8bs}1sJS_8|;18%_NKxo-gTB~RA zy&v_7kCgW9ahcCLo>23@EZK|KD-3Z_Uk)Wuv#do&6pT#5Wm^ST+V#i!?sxlK`;;DE zjwN*n1WdLSK)}D?{qLnrAg+ORK`mtpmzz8UExBZE!Zz>BQ58p_{fEN6k>}dUDWKgd z+MMx47zdW+i9;e!tF9z-d7F@AjfD#(d;-}%M`nGl0jGw>tSin_KDbmqHeB1&ARa%2 zD{2|*rkxK|cS0&dRAElp-j@1QbQdIQTx~|5Fb+3Mp#|9utpL>GR?}X_n$tQijj4Ik z7h`tl!P5MA`NsO!WahSA8HW3Q#ak^p>LxsHKA&$5u>N1b@iBETe=KpX3t?JLF()Qx358fTklfg>oO)X66;rgdDiYj66q13xVE-*)u6V(k2YSG?S%~^BG zY_PV?&c(#!VsiyeNvwRgT?v+4&TNh>+Q9GKYzMMO)@yUoV}W*eDJHWJo;;is@S>NSfB9Nr zv{uU{03!psE7Qt!la*u}r?lOXFZP8UpCS4ftLuq4y8r+y60*B{+X0{e0s9z$-~#|0 S)CPmG#Ao{g000001X)@}WJA*c literal 0 HcmV?d00001 diff --git a/tests/bad_num_chain/config b/tests/bad_num_chain/config new file mode 100644 index 0000000..f62cec1 --- /dev/null +++ b/tests/bad_num_chain/config @@ -0,0 +1 @@ +#OPTS: -s diff --git a/tests/bad_num_chain/exfat.img.tar.xz b/tests/bad_num_chain/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..68b8605644f3e37a9d5f7b0316073789f6397e78 GIT binary patch literal 4064 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 ATmS$7 literal 0 HcmV?d00001 diff --git a/tests/bad_root/exfat.img.tar.xz b/tests/bad_root/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..de0066fce1780745da4b8978b2080ac9829ae855 GIT binary patch literal 4528 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 literal 0 HcmV?d00001 diff --git a/tests/de_bad_csum/exfat.img.tar.xz b/tests/de_bad_csum/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..f753e82ba92b5fcdc694023b9027fc517e328bef GIT binary patch literal 3196 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 literal 0 HcmV?d00001 diff --git a/tests/duplicate_clu/exfat.img.tar.xz b/tests/duplicate_clu/exfat.img.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..bf3fdd856992377d1f3e29af33ac19bc4208e7c0 GIT binary patch literal 4048 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 TRNvtk2=9huXrK&lK<@Vg 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