void exfat_put_node(struct exfat* ef, struct exfat_node* node)
{
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX];
--node->references;
if (node->references < 0)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_bug("reference counter of '%s' is below zero", buffer);
}
else if (node->references == 0 && node != ef->root)
{
if (node->flags & EXFAT_ATTRIB_DIRTY)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_warn("dirty node '%s' with zero references", buffer);
}
}
static int opendir(struct exfat* ef, const struct exfat_node* dir,
struct iterator* it)
{
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX];
if (!(dir->flags & EXFAT_ATTRIB_DIR))
{
- exfat_get_name(dir, buffer, sizeof(buffer) - 1);
+ exfat_get_name(dir, buffer);
exfat_bug("'%s' is not a directory", buffer);
}
if (CLUSTER_INVALID(dir->start_cluster))
{
- exfat_get_name(dir, buffer, sizeof(buffer) - 1);
+ exfat_get_name(dir, buffer);
exfat_error("'%s' directory starts with invalid cluster %#x", buffer,
dir->start_cluster);
return -EIO;
exfat_c2o(ef, it->cluster)) < 0)
{
free(it->chunk);
- exfat_get_name(dir, buffer, sizeof(buffer) - 1);
+ exfat_get_name(dir, buffer);
exfat_error("failed to read '%s' directory cluster %#x", buffer,
it->cluster);
return -EIO;
static bool check_node(const struct exfat_node* node, uint16_t actual_checksum,
uint16_t reference_checksum, uint64_t valid_size, int cluster_size)
{
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX];
bool ret = true;
/*
*/
if (actual_checksum != reference_checksum)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' has invalid checksum (%#hx != %#hx)", buffer,
actual_checksum, reference_checksum);
ret = false;
*/
if (valid_size > node->size)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' has valid size (%"PRIu64") greater than size "
"(%"PRIu64")", buffer, valid_size, node->size);
ret = false;
*/
if (node->size == 0 && node->start_cluster != EXFAT_CLUSTER_FREE)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' is empty but start cluster is %#x", buffer,
node->start_cluster);
ret = false;
}
if (node->size > 0 && CLUSTER_INVALID(node->start_cluster))
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' points to invalid cluster %#x", buffer,
node->start_cluster);
ret = false;
/* Empty file or directory must be marked as non-contiguous. */
if (node->size == 0 && (node->flags & EXFAT_ATTRIB_CONTIGUOUS))
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' is empty but marked as contiguous (%#x)", buffer,
node->flags);
ret = false;
/* Directory size must be aligned on at cluster boundary. */
if ((node->flags & EXFAT_ATTRIB_DIR) && node->size % cluster_size != 0)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_error("'%s' directory size %"PRIu64" is not divisible by %d", buffer,
node->size, cluster_size);
ret = false;
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;
static void reset_cache(struct exfat* ef, struct exfat_node* node)
{
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX];
while (node->child)
{
node->flags &= ~EXFAT_ATTRIB_CACHED;
if (node->references != 0)
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_warn("non-zero reference counter (%d) for '%s'",
node->references, buffer);
}
if (node != ef->root && (node->flags & EXFAT_ATTRIB_DIRTY))
{
- exfat_get_name(node, buffer, sizeof(buffer) - 1);
+ exfat_get_name(node, buffer);
exfat_bug("node '%s' is dirty", buffer);
}
while (node->references)
return 0;
}
-static int write_entry(struct exfat* ef, struct exfat_node* dir,
+static int commit_entry(struct exfat* ef, struct exfat_node* dir,
const le16_t* name, cluster_t cluster, off_t offset, uint16_t attrib)
{
struct exfat_node* node;
meta2.type = EXFAT_ENTRY_FILE_INFO;
meta2.flags = EXFAT_FLAG_ALWAYS1;
meta2.name_length = name_length;
- meta2.name_hash = exfat_calc_name_hash(ef, node->name);
+ meta2.name_hash = exfat_calc_name_hash(ef, node->name, name_length);
meta2.start_cluster = cpu_to_le32(EXFAT_CLUSTER_FREE);
meta1.checksum = exfat_calc_checksum(&meta1, &meta2, node->name);
exfat_put_node(ef, dir);
return rc;
}
- rc = write_entry(ef, dir, name, cluster, offset, attrib);
+ rc = commit_entry(ef, dir, name, cluster, offset, attrib);
if (rc != 0)
{
exfat_put_node(ef, dir);
return -EIO;
}
meta1.continuations = 1 + name_entries;
- meta2.name_hash = exfat_calc_name_hash(ef, name);
+ meta2.name_hash = exfat_calc_name_hash(ef, name, name_length);
meta2.name_length = name_length;
meta1.checksum = exfat_calc_checksum(&meta1, &meta2, name);
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;