Mercurial > gnulib
diff lib/set-mode-acl.c @ 10180:9f98a7fc375c
Fix bug with setuid modes in Solaris 10+ code.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 08 Jun 2008 16:33:02 +0200 |
parents | 90f51b86b088 |
children | 5282ccc922b9 |
line wrap: on
line diff
--- a/lib/set-mode-acl.c Sun Jun 08 16:04:08 2008 +0200 +++ b/lib/set-mode-acl.c Sun Jun 08 16:33:02 2008 +0200 @@ -206,6 +206,8 @@ acl_t *aclp; char acl_text[] = "user::---,group::---,mask:---,other:---"; + int ret; + int saved_errno; if (mode & S_IRUSR) acl_text[ 6] = 'r'; if (mode & S_IWUSR) acl_text[ 7] = 'w'; @@ -222,19 +224,25 @@ errno = ENOMEM; return -1; } - else + + ret = (desc < 0 ? acl_set (name, aclp) : facl_set (desc, aclp)); + saved_errno = errno; + acl_free (aclp); + if (ret < 0) { - int ret = (desc < 0 ? acl_set (name, aclp) : facl_set (desc, aclp)); - int saved_errno = errno; - acl_free (aclp); - if (ret == 0 || saved_errno != ENOSYS) - { - errno = saved_errno; - return ret; - } + if (saved_errno == ENOSYS) + return chmod_or_fchmod (name, desc, mode); + errno = saved_errno; + return -1; } - return chmod_or_fchmod (name, desc, mode); + if (mode & (S_ISUID | S_ISGID | S_ISVTX)) + { + /* We did not call chmod so far, so the special bits have not yet + been set. */ + return chmod_or_fchmod (name, desc, mode); + } + return 0; # else /* Solaris, Cygwin, general case */