[PATCH 2/3] erofs-utils: fsck: account '/' separator in path construction
Gao Xiang <[email protected]>
| Newsgroups | org.ozlabs.lists.linux-erofs |
|---|---|
| Message-ID | <[email protected]> |
Reported-by: Tristan <[email protected]> Closes: https://lore.kernel.org/r/CAA1XrhPMekMqAnRkC-jV9rTsO4LHjzh=kxn6zQKMgBrqfrnp8A@mail.gmail.com/3-fsck-path-off-by-one.txt Signed-off-by: Gao Xiang <[email protected]> --- fsck/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fsck/main.c b/fsck/main.c index f7f1387fe642..87eeb81136ff 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -191,7 +191,7 @@ static int erofsfsck_parse_options_cfg(int argc, char **argv) return -ENAMETOOLONG; } - fsckcfg.extract_path = malloc(PATH_MAX); + fsckcfg.extract_path = malloc(PATH_MAX + 1); if (!fsckcfg.extract_path) return -ENOMEM; strncpy(fsckcfg.extract_path, optarg, len); @@ -902,9 +902,9 @@ static int erofsfsck_dirent_iter(struct erofs_dir_context *ctx) prev_pos = fsckcfg.extract_pos; curr_pos = prev_pos; - if (prev_pos + ctx->de_namelen >= PATH_MAX) { + if (prev_pos + ctx->de_namelen + 1 >= PATH_MAX) { erofs_err("unable to fsck since the path is too long (%llu)", - (curr_pos + ctx->de_namelen) | 0ULL); + (curr_pos + ctx->de_namelen + 1) | 0ULL); return -EOPNOTSUPP; } @@ -915,7 +915,7 @@ static int erofsfsck_dirent_iter(struct erofs_dir_context *ctx) curr_pos += ctx->de_namelen; fsckcfg.extract_path[curr_pos] = '\0'; } else { - curr_pos += ctx->de_namelen; + curr_pos += ctx->de_namelen + 1; } fsckcfg.extract_pos = curr_pos; ret = erofsfsck_check_inode(ctx->dir->nid, ctx->de_nid); -- 2.43.5