Merge pull request #2688 from stoeckmann/entry_off32

Ignore sizes which do not fit into off_t
This commit is contained in:
Tim Kientzle authored and GitHub committed 2025-06-28 14:11:17 -07:00
commit a474bab7e3
3 files changed
+18 -1

No files matched your search

+5 -1
View File
@@ -38,6 +38,7 @@
const struct stat *
archive_entry_stat(struct archive_entry *entry)
{
int64_t size;
struct stat *st;
if (entry->stat == NULL) {
entry->stat = calloc(1, sizeof(*st));
@@ -74,7 +75,10 @@ archive_entry_stat(struct archive_entry *entry)
st->st_ino = (ino_t)archive_entry_ino64(entry);
st->st_nlink = archive_entry_nlink(entry);
st->st_rdev = archive_entry_rdev(entry);
st->st_size = (off_t)archive_entry_size(entry);
size = archive_entry_size(entry);
st->st_size = (off_t)size;
if (st->st_size < 0 || (int64_t)st->st_size != size)
st->st_size = 0;
st->st_mode = archive_entry_mode(entry);
/*
+2
View File
@@ -561,6 +561,8 @@ copy_stat(struct stat *st, struct ustat *us)
st->st_mode = us->st_mode;
st->st_nlink = us->st_nlink;
st->st_size = (off_t)us->st_size;
if (st->st_size < 0 || (uint64_t)st->st_size != us->st_size)
st->st_size = 0;
st->st_uid = us->st_uid;
st->st_dev = us->st_dev;
st->st_rdev = us->st_rdev;
+11
View File
@@ -880,6 +880,17 @@ DEFINE_TEST(test_entry)
if (pst == NULL)
return;
assertEqualInt(pst->st_uid, 22);
/* Check behavior with large sizes. */
archive_entry_set_size(e, INT64_MAX - 1);
assert((pst = archive_entry_stat(e)) != NULL);
if (pst == NULL)
return;
if (sizeof(pst->st_size) < sizeof(int64_t))
assertEqualInt(pst->st_size, 0);
else
assertEqualInt(pst->st_size, INT64_MAX - 1);
/* We don't need to check high-res fields here. */
/*