{
if (CLUSTER_INVALID(c))
{
- char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char name[EXFAT_UTF8_NAME_BUFFER_MAX];
exfat_get_name(node, name);
exfat_error("file '%s' has invalid cluster 0x%x", name, c);
}
if (BMAP_GET(ef->cmap.chunk, c - EXFAT_FIRST_DATA_CLUSTER) == 0)
{
- char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char name[EXFAT_UTF8_NAME_BUFFER_MAX];
exfat_get_name(node, name);
exfat_error("cluster 0x%x of file '%s' is not allocated", c, name);
}
path_length = strlen(path);
- entry_path = malloc(path_length + 1 + UTF8_BYTES(EXFAT_NAME_MAX) + 1);
+ entry_path = malloc(path_length + 1 + EXFAT_UTF8_NAME_BUFFER_MAX);
if (entry_path == NULL)
{
exfat_put_node(ef, parent);
struct exfat_node* node;
struct exfat_iterator it;
int rc;
- char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+ char name[EXFAT_UTF8_NAME_BUFFER_MAX];
exfat_debug("[%s] %s", __func__, path);
#include <sys/types.h>
#define EXFAT_NAME_MAX 255
+/* UTF-16 encodes code points up to U+FFFF as single 16-bit code units.
+ UTF-8 uses up to 3 bytes (i.e. 8-bit code units) to encode code points
+ up to U+FFFF. One additional character is for null terminator. */
+#define EXFAT_UTF8_NAME_BUFFER_MAX (EXFAT_NAME_MAX * 3 + 1)
+#define EXFAT_UTF8_ENAME_BUFFER_MAX (EXFAT_ENAME_MAX * 3 + 1)
+
#define EXFAT_ATTRIB_CONTIGUOUS 0x10000
#define EXFAT_ATTRIB_CACHED 0x20000
#define EXFAT_ATTRIB_DIRTY 0x40000
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define DIV_ROUND_UP(x, d) (((x) + (d) - 1) / (d))
#define ROUND_UP(x, d) (DIV_ROUND_UP(x, d) * (d))
-#define UTF8_BYTES(c) ((c) * 6) /* UTF-8 character can occupy up to 6 bytes */
#define BMAP_SIZE(count) (ROUND_UP(count, sizeof(bitmap_t) * 8) / 8)
#define BMAP_BLOCK(index) ((index) / sizeof(bitmap_t) / 8)
bool dirty;
}
cmap;
- char label[UTF8_BYTES(EXFAT_ENAME_MAX) + 1];
+ char label[EXFAT_UTF8_ENAME_BUFFER_MAX];
void* zero_cluster;
int dmask, fmask;
uid_t uid;
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) + 1]);
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]);
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,
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)
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))
{
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;
/*
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)
{
}
void exfat_get_name(const struct exfat_node* node,
- char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1])
+ char buffer[EXFAT_UTF8_NAME_BUFFER_MAX])
{
- if (utf16_to_utf8(buffer, node->name, UTF8_BYTES(EXFAT_NAME_MAX) + 1,
+ if (utf16_to_utf8(buffer, node->name, EXFAT_UTF8_NAME_BUFFER_MAX,
EXFAT_NAME_MAX) != 0)
exfat_bug("failed to convert name to UTF-8");
}