Reported-by: Tristan <[email protected]>
Closes: 
https://lore.kernel.org/r/CAA1XrhPMekMqAnRkC-jV9rTsO4LHjzh=kxn6zqkmgbrqfrn...@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


Reply via email to