Your message dated Wed, 18 Feb 2009 14:55:24 +0100
with message-id <20090218135523.gf3...@mithrandir>
and subject line Re: Bug#515954: proftpd: mod_facl erroneously assumes no 
permissions, rather than all permissions, in some cases
has caused the Debian Bug report #515954,
regarding proftpd: mod_facl erroneously assumes no permissions, rather than all 
permissions, in some cases
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
515954: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=515954
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: proftpd
Version: 1.3.1-17
Severity: normal
Tags: patch

This bug has been fixed upstream, please include the patch from bug
#3150 ( http://bugs.proftpd.org/show_bug.cgi?id=3150 ) in the next
release.

>From the original bug report:
If an ACL for a directory or file does not include a mask entry,
retrieval and checking of the mask fails and mod_facl denies access.
Other file utilities ( and the POSIX ACL specs ) seem to assume
mask::rwx if no entry is present.

This acl:
--snip--
fs:/home/proftpd/Info# getfacl Humour
# file: Humour
# owner: root
# group: Users
user::rwx
group::rwx
other::---
--snip--
should grant full access to the group Users, but doesn't.

Regards,
    Tobias

-- System Information:
Debian Release: 4.0
  APT prefers stable
  APT policy: (150, 'stable'), (100, 'testing'), (50, 'unstable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.25.4
Locale: LANG=en_GB.UTF8, LC_CTYPE=en_GB.UTF8 (charmap=UTF-8)
Index: modules/mod_facl.c
===================================================================
RCS file: /cvsroot/proftp/proftpd/modules/mod_facl.c,v
retrieving revision 1.11
diff -u -r1.11 mod_facl.c
--- modules/mod_facl.c  18 Jul 2007 16:41:47 -0000      1.11
+++ modules/mod_facl.c  16 Dec 2008 19:07:11 -0000
@@ -354,7 +354,7 @@
     }
   }

-  /* 5. If not matched above, and if one of the group IDs matches one
+  /* 4. If not matched above, and if one of the group IDs matches one
    *    of the named group entries, and that entry contains the requested
    *    permissions, use that entry for access.
    */
@@ -441,7 +441,7 @@
     }
   }

-  /* 6. If not matched above, and if one of the group IDs matches
+  /* 5. If not matched above, and if one of the group IDs matches
    *    the group owner or any of the named group entries, but neither
    *    the group owner entry nor any of the named group entries contains
    *    the requested permissions, access is denied.
@@ -449,7 +449,7 @@

   /* XXX implement this condition properly */

-  /* 7. If not matched above, the other entry determines access.
+  /* 6. If not matched above, the other entry determines access.
    */
   if (!have_access_entry) {
     ae = acl_other_entry;
@@ -465,7 +465,8 @@
    *  entry contains the requested permissions, access is permitted.
    *
    *  Otherwise, if the selected entry and the mask entry both contain
-   *  the requested permissions, access is permitted.
+   *  the requested permissions (or there is no mask entry), access is
+   *  permitted.
    *
    *  Otherwise, access is denied.
    */
@@ -506,19 +507,29 @@
           strerror(errno));
       }

-      if (acl_get_permset(acl_mask_entry, &mask_perms) < 0) {
-        pr_trace_msg(trace_channel, 5,
-          "error retrieving mask permission set: %s", strerror(errno));
-      }
-
 #  if defined(HAVE_BSD_POSIX_ACL)
       ret1 = acl_get_perm_np(ent_perms, get_facl_perm_for_mode(mode));
-      ret2 = acl_get_perm_np(mask_perms, get_facl_perm_for_mode(mode));
 #  elif defined(HAVE_LINUX_POSIX_ACL)
       ret1 = acl_get_perm(ent_perms, get_facl_perm_for_mode(mode));
-      ret2 = acl_get_perm(mask_perms, get_facl_perm_for_mode(mode));
 #  endif

+      if (acl_mask_entry != NULL) {
+        if (acl_get_permset(acl_mask_entry, &mask_perms) < 0) {
+          pr_trace_msg(trace_channel, 5,
+            "error retrieving mask permission set: %s", strerror(errno));
+        }
+
+#  if defined(HAVE_BSD_POSIX_ACL)
+        ret2 = acl_get_perm_np(mask_perms, get_facl_perm_for_mode(mode));
+#  elif defined(HAVE_LINUX_POSIX_ACL)
+        ret2 = acl_get_perm(mask_perms, get_facl_perm_for_mode(mode));
+#  endif
+
+      } else {
+        /* If there is no mask entry, then access should be granted. */
+        ret2 = 1;
+      }
+
       if (ret1 == 1 && ret2 == 1) {
         res = 0;

@@ -553,7 +564,7 @@

 # elif defined(HAVE_SOLARIS_POSIX_ACL)
   register unsigned int i;
-  int have_access_entry = FALSE, idx, res = -1;
+  int have_access_entry = FALSE, have_mask_entry = FALSE, idx, res = -1;
   pool *acl_pool;
   aclent_t *acls = acl;
   aclent_t ae;
@@ -652,6 +663,7 @@

     } else if (acls[i].a_type & CLASS_OBJ) {
       memcpy(&acl_mask_entry, &(acls[i]), sizeof(aclent_t));
+      have_mask_entry = TRUE;
     }
   }

@@ -738,7 +750,7 @@
     }
   }

-  /* 5. If not matched above, and if one of the group IDs matches one
+  /* 4. If not matched above, and if one of the group IDs matches one
    *    of the named group entries, and that entry contains the requested
    *    permissions, use that entry for access.
    */
@@ -790,7 +802,7 @@
     }
   }

-  /* 6. If not matched above, and if one of the group IDs matches
+  /* 5. If not matched above, and if one of the group IDs matches
    *    the group owner or any of the named group entries, but neither
    *    the group owner entry nor any of the named group entries contains
    *    the requested permissions, access is denied.
@@ -798,7 +810,7 @@

   /* XXX implement this condition properly */

-  /* 7. If not matched above, the other entry determines access.
+  /* 6. If not matched above, the other entry determines access.
    */
   if (!have_access_entry) {
     memcpy(&ae, &acl_other_entry, sizeof(aclent_t));
@@ -814,7 +826,8 @@
    *  entry contains the requested permissions, access is permitted.
    *
    *  Otherwise, if the selected entry and the mask entry both contain
-   *  the requested permissions, access is permitted.
+   *  the requested permissions (or there is no mask entry), access is
+   *  permitted.
    *
    *  Otherwise, access is denied.
    */
@@ -826,9 +839,18 @@
       break;

     default:
-      if ((ae.a_perm & mode) &&
-          (acl_mask_entry.a_perm & mode))
-        res = 0;
+      if (have_mask_entry) {
+        if ((ae.a_perm & mode) &&
+            (acl_mask_entry.a_perm & mode))
+          res = 0;
+
+      } else {
+
+        /* If there is no mask entry, then access should be granted. */
+        if (ae.a_perm & mode)
+          res = 0;
+      }
+
       break;
   }


--- End Message ---
--- Begin Message ---
Package: proftpd-dfsg
Version: 1.3.2-1

Sorry, missed to add a patch for 1.3.1 in Lenny. Too late.

-- 
Francesco P. Lovergine


--- End Message ---

Reply via email to