]> git.sven.stormbind.net Git - sven/exfatprogs.git/blobdiff - lib/libexfat.c
New upstream version 1.0.4
[sven/exfatprogs.git] / lib / libexfat.c
index 24f682b58673c219c73a46c04ba5a2f19b97e922..1c0bbc010e95a46d2bbb594aade5c4bb56bdcd48 100644 (file)
@@ -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;
        }