summaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorlukem <lukem@NetBSD.org>2023-06-10 12:46:32 +0000
committerlukem <lukem@NetBSD.org>2023-06-10 12:46:32 +0000
commitd699df57f2043a28c4faea6d069231ef5b5af673 (patch)
tree4336521b0a2f6e2b1449953e38cf503c46ff929f /external
parentbd16a966721f7125d818c88bdf6384455f8b2194 (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.c25
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);
}