]> arthur.barton.de Git - netatalk.git/commitdiff
fix: basedir regex symlink problem
authorHAT <hat@fa2.so-net.ne.jp>
Wed, 3 Oct 2012 14:23:55 +0000 (23:23 +0900)
committerHAT <hat@fa2.so-net.ne.jp>
Wed, 3 Oct 2012 14:23:55 +0000 (23:23 +0900)
NEWS
libatalk/util/netatalk_conf.c

diff --git a/NEWS b/NEWS
index 818635911cdc3758b58bc70bb7c1a4ed0d00167e..e203bd412aee72d0d1dc258141720c0ae4ee93b9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 Changes in 3.0.2
 ================
 * FIX: "path" parameter value may contain symlink.
+* FIX: "basedir regex" was never able to treat symlink.
+       If /home -> /usr/home, set "basedir regex = /usr/home".
 
 Changes in 3.0.1
 ================
index cd550be08b12a5e8c5ce417f197c886050997cdc..6d252e83db772af8dde924f1d1cad49d2fb4671b 100644 (file)
@@ -989,6 +989,7 @@ static int readvolfile(AFPObj *obj, const struct passwd *pwent)
     EC_INIT;
     static int regexerr = -1;
     static regex_t reg;
+    char        *realpw_dir;
     char        *realvolpath;
     char        volname[AFPVOL_U8MNAMELEN + 1];
     char        tmp[MAXPATHLEN + 1], tmp2[MAXPATHLEN + 1];
@@ -1022,6 +1023,8 @@ static int readvolfile(AFPObj *obj, const struct passwd *pwent)
             if (pwent->pw_dir == NULL || STRCMP("", ==, pwent->pw_dir))
                 /* no user home */
                 continue;
+            if ((realpw_dir = realpath_safe(pwent->pw_dir)) == NULL)
+                continue;
 
             /* check if user home matches our "basedir regex" */
             if ((basedir = iniparser_getstring(obj->iniconfig, INISEC_HOMES, "basedir regex", NULL)) == NULL) {
@@ -1036,13 +1039,13 @@ static int readvolfile(AFPObj *obj, const struct passwd *pwent)
                 LOG(log_debug, logtype_default, "readvolfile: bad basedir regex: %s", errbuf);
             }
 
-            if (regexec(&reg, pwent->pw_dir, 1, match, 0) == REG_NOMATCH) {
+            if (regexec(&reg, realpw_dir, 1, match, 0) == REG_NOMATCH) {
                 LOG(log_debug, logtype_default, "readvolfile: user home \"%s\" doesn't match basedir regex \"%s\"",
-                    pwent->pw_dir, basedir);
+                    realpw_dir, basedir);
                 continue;
             }
 
-            strlcpy(tmp, pwent->pw_dir, MAXPATHLEN);
+            strlcpy(tmp, realpw_dir, MAXPATHLEN);
             strlcat(tmp, "/", MAXPATHLEN);
             if (p = iniparser_getstring(obj->iniconfig, INISEC_HOMES, "path", NULL))
                 strlcat(tmp, p, MAXPATHLEN);