diff options
author | kientzle <kientzle@FreeBSD.org> | 2008-03-12 04:47:37 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2008-03-12 04:47:37 +0000 |
commit | 9f91e7f3cf1ce14deeef1879546880d239c89fb9 (patch) | |
tree | 309fa0359f1dbfded8f59b056fb74869333a8777 /lib | |
parent | 06452801ddae83bdd93ac129baa2dad853f6a395 (diff) | |
download | FreeBSD-src-9f91e7f3cf1ce14deeef1879546880d239c89fb9.zip FreeBSD-src-9f91e7f3cf1ce14deeef1879546880d239c89fb9.tar.gz |
Tighten up the semantics of acl_next() and xattr_next() when you
hit the end of the ACL or xattr list.
Thanks to: Jeff Johnson for pointing out the obvious typo
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libarchive/archive_entry.c | 5 | ||||
-rw-r--r-- | lib/libarchive/test/test_entry.c | 22 |
2 files changed, 27 insertions, 0 deletions
diff --git a/lib/libarchive/archive_entry.c b/lib/libarchive/archive_entry.c index d0fe717..8ca69fe 100644 --- a/lib/libarchive/archive_entry.c +++ b/lib/libarchive/archive_entry.c @@ -1124,6 +1124,11 @@ archive_entry_acl_next(struct archive_entry *entry, int want_type, int *type, entry->acl_p = entry->acl_p->next; if (entry->acl_p == NULL) { entry->acl_state = 0; + *type = 0; + *permset = 0; + *tag = 0; + *id = -1; + *name = NULL; return (ARCHIVE_EOF); /* End of ACL entries. */ } *type = entry->acl_p->type; diff --git a/lib/libarchive/test/test_entry.c b/lib/libarchive/test/test_entry.c index e829b25..3841ce4 100644 --- a/lib/libarchive/test/test_entry.c +++ b/lib/libarchive/test/test_entry.c @@ -213,10 +213,16 @@ DEFINE_TEST(test_entry) assertEqualInt(1, archive_entry_xattr_count(e)); assertEqualInt(ARCHIVE_WARN, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt(xsize, 0); archive_entry_xattr_clear(e); assertEqualInt(0, archive_entry_xattr_reset(e)); assertEqualInt(ARCHIVE_WARN, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt(xsize, 0); archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12); assertEqualInt(1, archive_entry_xattr_reset(e)); archive_entry_xattr_add_entry(e, "xattr2", "xattrvalue2", 12); @@ -225,6 +231,9 @@ DEFINE_TEST(test_entry) assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize)); assertEqualInt(ARCHIVE_WARN, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt(xsize, 0); /* @@ -348,6 +357,11 @@ DEFINE_TEST(test_entry) assertEqualString(xname, "xattr1"); assertEqualString(xval, "xattrvalue"); assertEqualInt(xsize, 11); + assertEqualInt(ARCHIVE_WARN, + archive_entry_xattr_next(e2, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt(xsize, 0); #endif /* Change the original */ @@ -453,6 +467,14 @@ DEFINE_TEST(test_entry) assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER); assertEqualInt(qual, 77); assertEqualString(name, "user77"); + assertEqualInt(1, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, 0); + assertEqualInt(permset, 0); + assertEqualInt(tag, 0); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); #endif #if ARCHIVE_VERSION_STAMP < 1009000 skipping("xattr preserved in archive_entry copy"); |