X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Fexfatprogs.git;a=blobdiff_plain;f=lib%2Flibexfat.c;h=1c0bbc010e95a46d2bbb594aade5c4bb56bdcd48;hp=24f682b58673c219c73a46c04ba5a2f19b97e922;hb=ca9b0f7353eba0cfbee98236d3487bbb6a8ec26f;hpb=f7feb8f190bd23ec253bf9fe705738049d9cedd7 diff --git a/lib/libexfat.c b/lib/libexfat.c index 24f682b..1c0bbc0 100644 --- a/lib/libexfat.c +++ b/lib/libexfat.c @@ -165,6 +165,9 @@ int exfat_get_blk_dev_info(struct exfat_user_input *ui, if (!ui->cluster_size) exfat_set_default_cluster_size(bd, ui); + if (!ui->boundary_align) + ui->boundary_align = DEFAULT_BOUNDARY_ALIGNMENT; + if (ioctl(fd, BLKSSZGET, &bd->sector_size) < 0) bd->sector_size = DEFAULT_SECTOR_SIZE; bd->sector_size_bits = sector_size_bits(bd->sector_size); @@ -195,6 +198,15 @@ ssize_t exfat_write(int fd, void *buf, size_t size, off_t offset) return pwrite(fd, buf, size, offset); } +size_t exfat_utf16_len(const __le16 *str, size_t max_size) +{ + size_t i = 0; + + while (le16_to_cpu(str[i]) && i < max_size) + i++; + return i; +} + ssize_t exfat_utf16_enc(const char *in_str, __u16 *out_str, size_t out_size) { size_t mbs_len, out_len, i; @@ -215,6 +227,7 @@ ssize_t exfat_utf16_enc(const char *in_str, __u16 *out_str, size_t out_size) if (mbstowcs(wcs, in_str, mbs_len+1) == (size_t)-1) { if (errno == EINVAL || errno == EILSEQ) exfat_err("invalid character sequence in current locale\n"); + free(wcs); return -errno; } @@ -278,7 +291,7 @@ ssize_t exfat_utf16_dec(const __u16 *in_str, size_t in_len, memset(&ps, 0, sizeof(ps)); /* And then convert wchar_t* string to multibyte char* string */ - for (i = 0, out_len = 0, c_len = 0; i < wcs_len; i++) { + for (i = 0, out_len = 0, c_len = 0; i <= wcs_len; i++) { c_len = wcrtomb(c_str, wcs[i], &ps); /* * If character is non-representable in current locale then @@ -307,7 +320,7 @@ ssize_t exfat_utf16_dec(const __u16 *in_str, size_t in_len, free(wcs); /* Last iteration of above loop should have produced null byte */ - if (c_len == 0 || out_str[out_len] != 0) { + if (c_len == 0 || out_str[out_len-1] != 0) { exfat_err("invalid UTF-16 sequence\n"); return -errno; }