new version of authz_posixgroup_contains_user.patch.

+treadsafe (getgrnam_r)
+AC_CHECK_FUNCS
-windows code still missing
--- ./configure.ac.orig	2014-02-10 08:04:51.000000000 +0400
+++ ./configure.ac	2014-04-24 16:19:07.946419736 +0400
@@ -875,6 +875,9 @@
 dnl check for functions needed in special file handling
 AC_CHECK_FUNCS(symlink readlink)
 
+dnl check for getgrnam_r
+AC_CHECK_FUNCS(getgrnam_r)
+
 dnl check for uname
 AC_CHECK_HEADERS(sys/utsname.h, [AC_CHECK_FUNCS(uname)], [])
 
--- ./subversion/libsvn_repos/authz.c.orig	2013-05-04 01:21:54.000000000 +0400
+++ ./subversion/libsvn_repos/authz.c	2014-04-24 16:17:46.990598094 +0400
@@ -36,6 +36,12 @@
 #include "svn_ctype.h"
 #include "private/svn_fspath.h"
 #include "repos.h"
+#include "svn_private_config.h"
+
+#ifdef HAVE_GETGRNAM_R
+#include <grp.h>
+#include <unistd.h>
+#endif
 
 
 /*** Structures. ***/
@@ -197,6 +203,49 @@
   return FALSE;
 }
 
+static svn_boolean_t
+authz_systemgroup_contains_user(svn_config_t *cfg,
+                          const char *group,
+                          const char *user,
+                          apr_pool_t *pool)
+{
+
+#ifdef HAVE_GETGRNAM_R
+  int max;
+  int ret;
+  char *buf;
+  struct group grpdata, *grp;
+  char **gmem;
+
+  max = sysconf(_SC_GETGR_R_SIZE_MAX);
+  buf = apr_palloc(pool, max);
+
+  while (1) {
+    ret = getgrnam_r(group, &grpdata, buf, max, &grp);
+    if (ret == ERANGE) {
+      /* apr_pool_clear(pool); ??? */
+      max *= 2;
+      buf = apr_palloc(pool, max);
+      continue;
+    }
+    if (ret != 0 || grp == NULL) {
+      return FALSE;
+    } else {
+      for (gmem = grp->gr_mem; *gmem != NULL; gmem++)
+        if (strcmp(*gmem, user) == 0)
+          return TRUE;
+      return FALSE;
+    }
+  }
+#endif
+
+#ifdef WIN32
+/* TODO */
+#endif
+
+  return FALSE;
+}
+
 
 /* Determines whether an authz rule applies to the current
  * user, given the name part of the rule's name-value pair
@@ -242,6 +291,9 @@
   if (rule_match_string[0] == '@')
     return authz_group_contains_user(
       b->config, &rule_match_string[1], b->user, pool);
+  else if (rule_match_string[0] == '%')
+    return authz_systemgroup_contains_user(
+      b->config, &rule_match_string[1], b->user, pool);
   else if (rule_match_string[0] == '&')
     return authz_alias_is_user(
       b->config, &rule_match_string[1], b->user, pool);

Reply via email to