]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Be more careful about which config files we load
authorAlan T. DeKok <aland@freeradius.org>
Thu, 11 Oct 2012 14:44:06 +0000 (10:44 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 11 Oct 2012 14:51:07 +0000 (10:51 -0400)
src/include/conffile.h
src/main/conffile.c
src/modules/rlm_policy/parse.c

index bc7f90a488ce9d256fadd915c1a1d85106b11c74..21fc2cd5e44ab325949322416a674d50d05ea259 100644 (file)
@@ -58,6 +58,7 @@ int           cf_section_parse(CONF_SECTION *, void *base,
                                 const CONF_PARSER *variables);
 void           cf_section_parse_free(CONF_SECTION *cs, void *base);
 const CONF_PARSER *cf_section_parse_table(CONF_SECTION *cs);
+int cf_exclude_file(const char *filename);
 CONF_SECTION   *cf_file_read(const char *file);
 int            cf_file_include(const char *file, CONF_SECTION *cs);
 
index ff76e2ca5c660b0f20387d1bb8623e06ffcdf7d0..38b6aec7f902d91ae6fddca58f79ece362b7997c 100644 (file)
@@ -1276,6 +1276,41 @@ static int condition_looks_ok(const char **ptr)
        return 0;
 }
 
+int cf_exclude_file(const char *filename)
+{
+       int i;
+       size_t len;
+       const char *p = filename;
+
+       /*
+        *      FIXME: Maybe later make this a globally set configuration
+        *      variable.  But that's low priority.
+        */
+       static const char *excluded[] = {
+               "rpmsave", "rpmnew", "dpkg-new", "dpkg-dist", "dpkg-old",
+               "bak", NULL
+       };
+
+       if (!p || !*p) return TRUE; /* coding error */
+
+       if (*p == '.') return TRUE; /* ".", "..", ".foo", ... */
+
+       if (*p == '#') return TRUE; /* #foo# */
+
+       len = strlen(p);
+       if (p[len - 1] == '~') return TRUE; /* foo~ */
+
+       p = strrchr(p, '.');
+       if (!p) return FALSE;   /* just "foo", it's OK */
+
+       p++;
+       for (i = 0; excluded[i] != NULL; i++) {
+               if (strcmp(p, excluded[i]) == 0) return TRUE;
+       }
+
+       return FALSE;
+}
+
 
 static const char *cf_local_file(CONF_SECTION *cs, const char *local,
                                 char *buffer, size_t bufsize)
@@ -1512,25 +1547,11 @@ static int cf_section_read(const char *filename, int *lineno, FILE *fp,
                                }
 
                                /*
-                                *      Read the directory, ignoring "." files.
+                                *      Read the directory, ignoring some files.
                                 */
                                while ((dp = readdir(dir)) != NULL) {
-                                       const char *p;
-
-                                       if (dp->d_name[0] == '.') continue;
-
-                                       /*
-                                        *      Check for valid characters
-                                        */
-                                       for (p = dp->d_name; *p != '\0'; p++) {
-                                               if (isalpha((int)*p) ||
-                                                   isdigit((int)*p) ||
-                                                   (*p == '-') ||
-                                                   (*p == '_') ||
-                                                   (*p == '.')) continue;
-                                               break;
-                                       }
-                                       if (*p != '\0') continue;
+                                       if (cf_exclude_file(dp->d_name))
+                                               continue;
 
                                        snprintf(buf2, sizeof(buf2), "%s%s",
                                                 value, dp->d_name);
index 71a7eb66127762196aa03783c8540a8c19b04a16..4b3fc7ccce200321d6b8eb8c27ac13c82ffac682 100644 (file)
@@ -1589,8 +1589,7 @@ static int parse_include(policy_lex_file_t *lexer)
                        while ((dp = readdir(dir)) != NULL) {
                                struct stat buf;
 
-                               if (dp->d_name[0] == '.') continue;
-                               if (strchr(dp->d_name, '~') != NULL) continue;
+                               if (cf_exclude_file(dp->d_name)) continue;
 
                                strlcpy(p, dp->d_name,
                                        sizeof(buffer) - (p - buffer));