diff options
| author | lukem <lukem@NetBSD.org> | 2023-06-10 12:46:32 +0000 |
|---|---|---|
| committer | lukem <lukem@NetBSD.org> | 2023-06-10 12:46:32 +0000 |
| commit | d699df57f2043a28c4faea6d069231ef5b5af673 (patch) | |
| tree | 4336521b0a2f6e2b1449953e38cf503c46ff929f /external | |
| parent | bd16a966721f7125d818c88bdf6384455f8b2194 (diff) | |
libarchive: fail if name_max is 0
Add error handling to the USE_READDIR_R code paths that set name_max
from struct statfs or statvfs; if the determined name_max == 0
then return an error.
Avoids a crash in tree_dir_next_posix() when the calculation of
dirent_size from name_max is too small for the memory allocated
for struct dirent.
Submitted to upstream in pull request
https://github.com/libarchive/libarchive/pull/1903
Should fix PR bin/56080
Diffstat (limited to 'external')
| -rw-r--r-- | external/bsd/libarchive/dist/libarchive/archive_read_disk_posix.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/external/bsd/libarchive/dist/libarchive/archive_read_disk_posix.c b/external/bsd/libarchive/dist/libarchive/archive_read_disk_posix.c index ec90252a795..26b3010480a 100644 --- a/external/bsd/libarchive/dist/libarchive/archive_read_disk_posix.c +++ b/external/bsd/libarchive/dist/libarchive/archive_read_disk_posix.c @@ -1653,6 +1653,11 @@ setup_current_filesystem(struct archive_read_disk *a) else t->current_filesystem->name_max = nm; #endif + if (t->current_filesystem->name_max == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Cannot determine name_max"); + return (ARCHIVE_FAILED); + } #endif /* USE_READDIR_R */ return (ARCHIVE_OK); } @@ -1726,6 +1731,11 @@ setup_current_filesystem(struct archive_read_disk *a) /* Set maximum filename length. */ t->current_filesystem->name_max = sfs.f_namemax; + if (t->current_filesystem->name_max == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Cannot determine name_max"); + return (ARCHIVE_FAILED); + } return (ARCHIVE_OK); } @@ -1858,6 +1868,11 @@ setup_current_filesystem(struct archive_read_disk *a) #if defined(USE_READDIR_R) /* Set maximum filename length. */ t->current_filesystem->name_max = sfs.f_namelen; + if (t->current_filesystem->name_max == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Cannot determine name_max"); + return (ARCHIVE_FAILED); + } #endif return (ARCHIVE_OK); } @@ -1939,6 +1954,11 @@ setup_current_filesystem(struct archive_read_disk *a) #if defined(USE_READDIR_R) /* Set maximum filename length. */ t->current_filesystem->name_max = sfs.f_namemax; + if (t->current_filesystem->name_max == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Cannot determine name_max"); + return (ARCHIVE_FAILED); + } #endif return (ARCHIVE_OK); } @@ -1993,6 +2013,11 @@ setup_current_filesystem(struct archive_read_disk *a) else t->current_filesystem->name_max = nm; # endif /* _PC_NAME_MAX */ + if (t->current_filesystem->name_max == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Cannot determine name_max"); + return (ARCHIVE_FAILED); + } #endif /* USE_READDIR_R */ return (ARCHIVE_OK); } |
