void exfat_stat(const struct exfat* ef, const struct exfat_node* node,
struct stat* stbuf);
void exfat_get_name(const struct exfat_node* node,
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX)]);
+ char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1]);
uint16_t exfat_start_checksum(const struct exfat_entry_meta1* entry);
uint16_t exfat_add_checksum(const void* entry, uint16_t sum);
le16_t exfat_calc_checksum(const struct exfat_entry_meta1* meta1,
*node = NULL;
- rc = utf8_to_utf16(buffer, name, EXFAT_NAME_MAX, n);
+ rc = utf8_to_utf16(buffer, name, EXFAT_NAME_MAX + 1, n);
if (rc != 0)
return rc;
exfat_put_node(ef, *parent);
return -ENOENT;
}
- rc = utf8_to_utf16(name, p, EXFAT_NAME_MAX, n);
+ rc = utf8_to_utf16(name, p, EXFAT_NAME_MAX + 1, n);
if (rc != 0)
{
exfat_put_node(ef, *parent);
goto error;
}
if (utf16_to_utf8(ef->label, label->name,
- sizeof(ef->label) - 1, EXFAT_ENAME_MAX) != 0)
+ sizeof(ef->label), EXFAT_ENAME_MAX) != 0)
goto error;
break;
struct exfat_entry_label entry;
memset(label_utf16, 0, sizeof(label_utf16));
- rc = utf8_to_utf16(label_utf16, label, EXFAT_ENAME_MAX, strlen(label));
+ rc = utf8_to_utf16(label_utf16, label, EXFAT_ENAME_MAX + 1, strlen(label));
if (rc != 0)
return rc;
char* outp = output;
wchar_t wc;
- while (inp - input < insize && le16_to_cpu(*inp))
+ while (inp - input < insize)
{
inp = utf16_to_wchar(inp, &wc, insize - (inp - input));
if (inp == NULL)
exfat_error("name is too long");
return -ENAMETOOLONG;
}
+ if (wc == 0)
+ return 0;
+ }
+ if (outp - output >= outsize)
+ {
+ exfat_error("name is too long");
+ return -ENAMETOOLONG;
}
*outp = '\0';
return 0;
le16_t* outp = output;
wchar_t wc;
- while (inp - input < insize && *inp)
+ while (inp - input < insize)
{
inp = utf8_to_wchar(inp, &wc, insize - (inp - input));
if (inp == NULL)
exfat_error("name is too long");
return -ENAMETOOLONG;
}
+ if (wc == 0)
+ break;
+ }
+ if (outp - output >= outsize)
+ {
+ exfat_error("name is too long");
+ return -ENAMETOOLONG;
}
*outp = cpu_to_le16(0);
return 0;
}
void exfat_get_name(const struct exfat_node* node,
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX)])
+ char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1])
{
- if (utf16_to_utf8(buffer, node->name, UTF8_BYTES(EXFAT_NAME_MAX),
+ if (utf16_to_utf8(buffer, node->name, UTF8_BYTES(EXFAT_NAME_MAX) + 1,
EXFAT_NAME_MAX) != 0)
exfat_bug("failed to convert name to UTF-8");
}
memset(label, 0, (EXFAT_ENAME_MAX + 1) * sizeof(le16_t));
if (s == NULL)
return 0;
- return utf8_to_utf16(label, s, EXFAT_ENAME_MAX, strlen(s));
+ return utf8_to_utf16(label, s, EXFAT_ENAME_MAX + 1, strlen(s));
}
static uint32_t setup_volume_serial(uint32_t user_defined)