]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/conf.c
Load cups into easysw/current.
[thirdparty/cups.git] / scheduler / conf.c
index 10677426ff26f511758aba84e9c95a18632d97c4..458a9ba87726339018a16251e733202a675051e1 100644 (file)
@@ -289,6 +289,11 @@ cupsdReadConfiguration(void)
   cupsdSetString(&ServerHeader, "CUPS/1.2");
   cupsdSetString(&StateDir, CUPS_STATEDIR);
 
+  if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf"))
+    PrintcapFormat = PRINTCAP_SOLARIS;
+  else
+    PrintcapFormat = PRINTCAP_BSD;
+
   strlcpy(temp, ConfigurationFile, sizeof(temp));
   if ((slash = strrchr(temp, '/')) != NULL)
     *slash = '\0';
@@ -1277,33 +1282,14 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
   const char   *maskval,               /* Pointer to start of mask value */
                *ptr,                   /* Pointer into value */
                *ptr2;                  /* ... */
-  static unsigned netmasks[4][4] =     /* Standard IPv4 netmasks... */
-  {
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xff000000 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }
-  };
-#ifdef AF_INET6
-  static unsigned netmasks6[8][4] =    /* Standard IPv6 netmasks... */
-  {
-    { 0xffff0000, 0x00000000, 0x00000000, 0x00000000 },
-    { 0xffffffff, 0x00000000, 0x00000000, 0x00000000 },
-    { 0xffffffff, 0xffff0000, 0x00000000, 0x00000000 },
-    { 0xffffffff, 0xffffffff, 0x00000000, 0x00000000 },
-    { 0xffffffff, 0xffffffff, 0xffff0000, 0x00000000 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 },
-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }
-  };
-#endif /* AF_INET6 */
 
 
  /*
   * Get the address...
   */
 
-  memset(ip, 0, sizeof(unsigned) * 4);
+  ip[0]   = ip[1]   = ip[2]   = ip[2]   = 0x00000000;
+  mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff;
 
   if ((maskval = strchr(value, '/')) != NULL)
     maskval ++;
@@ -1334,6 +1320,7 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
             ptr2 = strchr(ptr2 + 1, ':'), j ++);
 
         i = 7 - j;
+       ptr ++;
       }
       else if (isxdigit(*ptr & 255))
       {
@@ -1343,9 +1330,9 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
          return (0);
 
         if (i & 1)
-          ip[i] |= ipval;
+          ip[i / 2] |= ipval;
        else
-          ip[i] |= ipval << 16;
+          ip[i / 2] |= ipval << 16;
       }
       else
         return (0);
@@ -1354,7 +1341,10 @@ get_addr_and_mask(const char *value,     /* I - String from config file */
         ptr ++;
     }
 
-    ipcount = i;
+    if (*ptr != ']')
+      return (0);
+
+    ptr ++;
 
     if (*ptr && *ptr != '/')
       return (0);
@@ -1366,70 +1356,55 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
     * Parse dotted-decimal IPv4 address...
     */
 
-    family  = AF_INET;
-    ipcount = sscanf(value, "%u.%u.%u.%u", ip + 0, ip + 1, ip + 2, ip + 3);
+    unsigned val[4];                   /* IPv4 address values */
 
-    ip[3] |= ((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8;
-    ip[0] = ip[1] = ip[2] = 0;
-  }
 
-  if (*maskval)
-  {
+    family  = AF_INET;
+    ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3);
+
    /*
-    * Get the netmask value(s)...
+    * Range check the IP numbers...
     */
 
-    memset(mask, 0, sizeof(unsigned) * 4);
+    for (i = 0; i < ipcount; i ++)
+      if (val[i] > 255)
+        return (0);
 
-#ifdef AF_INET6
-    if (*maskval == '[')
-    {
-     /*
-      * Get hexadecimal mask value...
-      */
+   /*
+    * Make sure the trailing values are zeroed, as some C libraries like
+    * glibc apparently like to fill the unused arguments with garbage...
+    */
 
-      for (i = 0, ptr = maskval + 1; *ptr && i < 8; i ++)
-      {
-       if (*ptr == ']')
-         break;
-       else if (!strncmp(ptr, "::", 2))
-       {
-          for (ptr2 = strchr(ptr + 2, ':'), j = 0;
-              ptr2;
-              ptr2 = strchr(ptr2 + 1, ':'), j ++);
+    for (i = ipcount; i < 4; i ++)
+      val[i] = 0;
 
-          i = 7 - j;
-       }
-       else if (isxdigit(*ptr & 255))
-       {
-          ipval = strtoul(ptr, (char **)&ptr, 16);
+   /*
+    * Merge everything into a 32-bit IPv4 address in ip[3]...
+    */
 
-         if (ipval > 0xffff)
-           return (0);
+    ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
 
-          if (i & 1)
-            mask[i] |= ipval;
-         else
-            mask[i] |= ipval << 16;
-       }
-       else
-          return (0);
+    if (ipcount < 4)
+      mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
+  }
 
-        while (*ptr == ':')
-          ptr ++;
-      }
+  if (*maskval)
+  {
+   /*
+    * Get the netmask value(s)...
+    */
+
+    memset(mask, 0, sizeof(unsigned) * 4);
 
-      if (*ptr)
-       return (0);
-    }
-    else
-#endif /* AF_INET6 */
     if (strchr(maskval, '.'))
     {
      /*
       * Get dotted-decimal mask...
       */
 
+      if (family != AF_INET)
+        return (0);
+
       if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2, mask + 3) != 4)
         return (0);
 
@@ -1447,6 +1422,9 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
 #ifdef AF_INET6
       if (family == AF_INET6)
       {
+        if (i > 128)
+         return (0);
+
         i = 128 - i;
 
        if (i <= 96)
@@ -1478,25 +1456,20 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
       else
 #endif /* AF_INET6 */
       {
-        i = 32 - i;
+        if (i > 32)
+         return (0);
 
         mask[0] = 0xffffffff;
         mask[1] = 0xffffffff;
         mask[2] = 0xffffffff;
 
-       if (i > 0)
-          mask[3] = (0xffffffff << i) & 0xffffffff;
+       if (i < 32)
+          mask[3] = (0xffffffff << (32 - i)) & 0xffffffff;
        else
          mask[3] = 0xffffffff;
       }
     }
   }
-#ifdef AF_INET6
-  else if (family == AF_INET6)
-    memcpy(mask, netmasks6[ipcount - 1], sizeof(unsigned) * 4);
-#endif /* AF_INET6 */
-  else
-    memcpy(mask, netmasks[ipcount - 1], sizeof(unsigned) * 4);
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "get_addr_and_mask(value=\"%s\", "
@@ -1634,7 +1607,12 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
       else
        cupsdDenyIP(loc, ones, zeros);
     }
+#ifdef AF_INET6
+    else if (value[0] == '*' || value[0] == '.' || 
+             (!isdigit(value[0] & 255) && value[0] != '['))
+#else
     else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
+#endif /* AF_INET6 */
     {
      /*
       * Host or domain name...
@@ -2406,7 +2384,12 @@ read_configuration(cups_file_t *fp)      /* I - File to read from */
          else
            cupsdDenyIP(location, ones, zeros);
        }
-       else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0]))
+#ifdef AF_INET6
+       else if (value[0] == '*' || value[0] == '.' || 
+                (!isdigit(value[0] & 255) && value[0] != '['))
+#else
+       else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
+#endif /* AF_INET6 */
        {
         /*
           * Host or domain name...
@@ -2490,7 +2473,12 @@ read_configuration(cups_file_t *fp)      /* I - File to read from */
       *    nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
       */
 
-      if (value[0] == '*' || value[0] == '.' || !isdigit(value[0]))
+#ifdef AF_INET6
+      if (value[0] == '*' || value[0] == '.' || 
+          (!isdigit(value[0] & 255) && value[0] != '['))
+#else
+      if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
+#endif /* AF_INET6 */
       {
        /*
         * Host or domain name...