diff options
author | David Bartley <dtbartle@csclub.uwaterloo.ca> | 2009-05-04 03:30:54 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-05-04 03:31:20 +0200 |
commit | 71cd7127cea49e4d89ff7ec0f0fdab3b5c4070b2 (patch) | |
tree | c0d06f575f6b5b44a641818a904e10c4e5949254 /lib/acl_entries.c | |
parent | cfe421207fa4b6ddd95ed5a3fedec94279db2e0a (diff) | |
download | gnulib-71cd7127cea49e4d89ff7ec0f0fdab3b5c4070b2.tar.gz |
acl: Fix infinite loop on FreeBSD.
Diffstat (limited to 'lib/acl_entries.c')
-rw-r--r-- | lib/acl_entries.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/acl_entries.c b/lib/acl_entries.c index 7884e4739f..12e85e565d 100644 --- a/lib/acl_entries.c +++ b/lib/acl_entries.c @@ -35,13 +35,29 @@ acl_entries (acl_t acl) if (acl != NULL) { #if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, MacOS X */ +# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */ + /* acl_get_entry returns 0 when it successfully fetches an entry, + and -1/EINVAL at the end. */ acl_entry_t ace; - int at_end; + int got_one; - for (at_end = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace); - !at_end; - at_end = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace)) + for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace); + got_one >= 0; + got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace)) count++; +# else /* Linux, FreeBSD */ + /* acl_get_entry returns 1 when it successfully fetches an entry, + and 0 at the end. */ + acl_entry_t ace; + int got_one; + + for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace); + got_one > 0; + got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace)) + count++; + if (got_one < 0) + return -1; +# endif #else /* IRIX, Tru64 */ # if HAVE_ACL_TO_SHORT_TEXT /* IRIX */ /* Don't use acl_get_entry: it is undocumented. */ |