* [f2fs-dev] [PATCH] f2fs-tools: allocate memory to handle label
@ 2023-05-05 16:26 Jaegeuk Kim
2023-05-17 1:24 ` Chao Yu
0 siblings, 1 reply; 2+ messages in thread
From: Jaegeuk Kim @ 2023-05-05 16:26 UTC (permalink / raw)
To: linux-f2fs-devel; +Cc: Jaegeuk Kim
Let's avoid memory alignment of sb->volume_name.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fsck/main.c | 4 ++--
fsck/mount.c | 4 ++--
include/f2fs_fs.h | 4 ++--
lib/libf2fs.c | 37 ++++++++++++++++++++++++++++---------
mkfs/f2fs_format.c | 2 +-
5 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/fsck/main.c b/fsck/main.c
index 9b5078708b3f..b01b52cf546e 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -1051,7 +1051,7 @@ static int do_label(struct f2fs_sb_info *sbi)
if (!c.vol_label) {
char label[MAX_VOLUME_NAME];
- utf16_to_utf8(label, sb->volume_name,
+ utf16_to_utf8(label, (const char *)sb->volume_name,
MAX_VOLUME_NAME, MAX_VOLUME_NAME);
MSG(0, "Info: volume label = %s\n", label);
return 0;
@@ -1062,7 +1062,7 @@ static int do_label(struct f2fs_sb_info *sbi)
return -1;
}
- utf8_to_utf16(sb->volume_name, (const char *)c.vol_label,
+ utf8_to_utf16((char *)sb->volume_name, (const char *)c.vol_label,
MAX_VOLUME_NAME, strlen(c.vol_label));
update_superblock(sb, SB_MASK_ALL);
diff --git a/fsck/mount.c b/fsck/mount.c
index df0314d57caf..9209558bd946 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -365,7 +365,7 @@ void print_node_info(struct f2fs_sb_info *sbi,
}
}
-static void DISP_label(uint16_t *name)
+static void DISP_label(const char *name)
{
char buffer[MAX_VOLUME_NAME];
@@ -391,7 +391,7 @@ printout:
DISP_u32(sb, magic);
DISP_u32(sb, major_ver);
- DISP_label(sb->volume_name);
+ DISP_label((const char *)sb->volume_name);
DISP_u32(sb, minor_ver);
DISP_u32(sb, log_sectorsize);
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 694881402b90..832dee298e64 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1430,8 +1430,8 @@ enum {
SSR
};
-extern int utf8_to_utf16(uint16_t *, const char *, size_t, size_t);
-extern int utf16_to_utf8(char *, const uint16_t *, size_t, size_t);
+extern int utf8_to_utf16(char *, const char *, size_t, size_t);
+extern int utf16_to_utf8(char *, const char *, size_t, size_t);
extern int log_base_2(uint32_t);
extern unsigned int addrs_per_inode(struct f2fs_inode *);
extern unsigned int addrs_per_block(struct f2fs_inode *);
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 6b879f9d4165..aa7f15b4c526 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -115,31 +115,40 @@ static uint16_t *wchar_to_utf16(uint16_t *output, wchar_t wc, size_t outsize)
return output + 2;
}
-int utf8_to_utf16(uint16_t *output, const char *input, size_t outsize,
+int utf8_to_utf16(char *output, const char *input, size_t outsize,
size_t insize)
{
const char *inp = input;
- uint16_t *outp = output;
+ uint16_t *outp;
wchar_t wc;
+ uint16_t *volume_name = calloc(sizeof(uint16_t), MAX_VOLUME_NAME);
+
+ if (!volume_name)
+ return -ENOMEM;
+
+ outp = volume_name;
while ((size_t)(inp - input) < insize && *inp) {
inp = utf8_to_wchar(inp, &wc, insize - (inp - input));
if (inp == NULL) {
DBG(0, "illegal UTF-8 sequence\n");
+ free(volume_name);
return -EILSEQ;
}
- outp = wchar_to_utf16(outp, wc, outsize - (outp - output));
+ outp = wchar_to_utf16(outp, wc, outsize - (outp - volume_name));
if (outp == NULL) {
DBG(0, "name is too long\n");
+ free(volume_name);
return -ENAMETOOLONG;
}
}
*outp = cpu_to_le16(0);
+ memcpy(output, volume_name, sizeof(uint16_t) * MAX_VOLUME_NAME);
+ free(volume_name);
return 0;
}
-static const uint16_t *utf16_to_wchar(const uint16_t *input, wchar_t *wc,
- size_t insize)
+static uint16_t *utf16_to_wchar(uint16_t *input, wchar_t *wc, size_t insize)
{
if ((le16_to_cpu(input[0]) & 0xfc00) == 0xd800) {
if (insize < 2 || (le16_to_cpu(input[1]) & 0xfc00) != 0xdc00)
@@ -201,26 +210,36 @@ static char *wchar_to_utf8(char *output, wchar_t wc, size_t outsize)
return output;
}
-int utf16_to_utf8(char *output, const uint16_t *input, size_t outsize,
+int utf16_to_utf8(char *output, const char *input, size_t outsize,
size_t insize)
{
- const uint16_t *inp = input;
char *outp = output;
wchar_t wc;
+ uint16_t *inp;
+ uint16_t *volume_name = calloc(sizeof(uint16_t), MAX_VOLUME_NAME);
+
+ if (!volume_name)
+ return -ENOMEM;
+
+ memcpy(volume_name, input, sizeof(uint16_t) * MAX_VOLUME_NAME);
+ inp = volume_name;
- while ((size_t)(inp - input) < insize && le16_to_cpu(*inp)) {
- inp = utf16_to_wchar(inp, &wc, insize - (inp - input));
+ while ((size_t)(inp - volume_name) < insize && le16_to_cpu(*inp)) {
+ inp = utf16_to_wchar(inp, &wc, insize - (inp - volume_name));
if (inp == NULL) {
DBG(0, "illegal UTF-16 sequence\n");
+ free(volume_name);
return -EILSEQ;
}
outp = wchar_to_utf8(outp, wc, outsize - (outp - output));
if (outp == NULL) {
DBG(0, "name is too long\n");
+ free(volume_name);
return -ENAMETOOLONG;
}
}
*outp = '\0';
+ free(volume_name);
return 0;
}
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index d3bb62222024..3e4905757161 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -512,7 +512,7 @@ static int f2fs_prepare_super_block(void)
if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM))
c.chksum_seed = f2fs_cal_crc32(~0, sb->uuid, sizeof(sb->uuid));
- utf8_to_utf16(sb->volume_name, (const char *)c.vol_label,
+ utf8_to_utf16((char *)sb->volume_name, (const char *)c.vol_label,
MAX_VOLUME_NAME, strlen(c.vol_label));
set_sb(node_ino, 1);
set_sb(meta_ino, 2);
--
2.40.1.521.gf1e218fcd8-goog
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [f2fs-dev] [PATCH] f2fs-tools: allocate memory to handle label
2023-05-05 16:26 [f2fs-dev] [PATCH] f2fs-tools: allocate memory to handle label Jaegeuk Kim
@ 2023-05-17 1:24 ` Chao Yu
0 siblings, 0 replies; 2+ messages in thread
From: Chao Yu @ 2023-05-17 1:24 UTC (permalink / raw)
To: Jaegeuk Kim, linux-f2fs-devel
On 2023/5/6 0:26, Jaegeuk Kim wrote:
> Let's avoid memory alignment of sb->volume_name.
>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Reviewed-by: Chao Yu <chao@kernel.org>
Thanks,
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-05-17 1:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-05 16:26 [f2fs-dev] [PATCH] f2fs-tools: allocate memory to handle label Jaegeuk Kim
2023-05-17 1:24 ` Chao Yu
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.