Tim Waugh 1e73bb
diff -up cups-1.7.0/scheduler/printers.c.stringpool-rdar15382819 cups-1.7.0/scheduler/printers.c
Tim Waugh 1e73bb
--- cups-1.7.0/scheduler/printers.c.stringpool-rdar15382819	2013-11-07 13:26:56.077499193 +0000
Tim Waugh 1e73bb
+++ cups-1.7.0/scheduler/printers.c	2013-11-07 13:27:54.665787144 +0000
Tim Waugh 1e73bb
@@ -1876,12 +1876,13 @@ void
Tim Waugh 1e73bb
 cupsdSetPrinterAttr(
Tim Waugh 1e73bb
     cupsd_printer_t *p,			/* I - Printer */
Tim Waugh 1e73bb
     const char      *name,		/* I - Attribute name */
Tim Waugh 1e73bb
-    char            *value)		/* I - Attribute value string */
Tim Waugh 1e73bb
+    const char      *value)		/* I - Attribute value string */
Tim Waugh 1e73bb
 {
Tim Waugh 1e73bb
   ipp_attribute_t	*attr;		/* Attribute */
Tim Waugh 1e73bb
   int			i,		/* Looping var */
Tim Waugh 1e73bb
 			count;		/* Number of values */
Tim Waugh 1e73bb
-  char			*ptr,		/* Pointer into value */
Tim Waugh 1e73bb
+  char			*temp,		/* Temporary copy of value string */
Tim Waugh 1e73bb
+			*ptr,		/* Pointer into value */
Tim Waugh 1e73bb
 			*start,		/* Start of value */
Tim Waugh 1e73bb
 			quote;		/* Quote character */
Tim Waugh 1e73bb
   ipp_tag_t		value_tag;	/* Value tag for this attribute */
Tim Waugh 1e73bb
@@ -1898,10 +1899,21 @@ cupsdSetPrinterAttr(
Tim Waugh 1e73bb
   }
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
  /*
Tim Waugh 1e73bb
+  * Copy the value string so we can do what we want with it...
Tim Waugh 1e73bb
+  */
Tim Waugh 1e73bb
+
Tim Waugh 1e73bb
+  if ((temp = strdup(value)) == NULL)
Tim Waugh 1e73bb
+  {
Tim Waugh 1e73bb
+    cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh 1e73bb
+                    "Unable to duplicate value for \"%s\" attribute.", name);
Tim Waugh 1e73bb
+    return;
Tim Waugh 1e73bb
+  }
Tim Waugh 1e73bb
+
Tim Waugh 1e73bb
+ /*
Tim Waugh 1e73bb
   * Count the number of values...
Tim Waugh 1e73bb
   */
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
-  for (count = 1, quote = '\0', ptr = value;
Tim Waugh 1e73bb
+  for (count = 1, quote = '\0', ptr = temp;
Tim Waugh 1e73bb
        *ptr;
Tim Waugh 1e73bb
        ptr ++)
Tim Waugh 1e73bb
   {
Tim Waugh 1e73bb
@@ -1949,15 +1961,15 @@ cupsdSetPrinterAttr(
Tim Waugh 1e73bb
       return;
Tim Waugh 1e73bb
     }
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
-    for (i = 0; i < count; i ++)
Tim Waugh 1e73bb
+    for (i = 0, start = temp; i < count; i ++)
Tim Waugh 1e73bb
     {
Tim Waugh 1e73bb
-      if ((ptr = strchr(value, ',')) != NULL)
Tim Waugh 1e73bb
+      if ((ptr = strchr(start, ',')) != NULL)
Tim Waugh 1e73bb
         *ptr++ = '\0';
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
-      attr->values[i].integer = strtol(value, NULL, 10);
Tim Waugh 1e73bb
+      attr->values[i].integer = strtol(start, NULL, 10);
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
       if (ptr)
Tim Waugh 1e73bb
-        value = ptr;
Tim Waugh 1e73bb
+        start = ptr;
Tim Waugh 1e73bb
     }
Tim Waugh 1e73bb
   }
Tim Waugh 1e73bb
   else
Tim Waugh 1e73bb
@@ -1999,7 +2011,7 @@ cupsdSetPrinterAttr(
Tim Waugh 1e73bb
       return;
Tim Waugh 1e73bb
     }
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
-    for (i = 0, quote = '\0', ptr = value; i < count; i ++)
Tim Waugh 1e73bb
+    for (i = 0, quote = '\0', ptr = temp; i < count; i ++)
Tim Waugh 1e73bb
     {
Tim Waugh 1e73bb
       for (start = ptr; *ptr; ptr ++)
Tim Waugh 1e73bb
       {
Tim Waugh 1e73bb
@@ -2028,6 +2040,8 @@ cupsdSetPrinterAttr(
Tim Waugh 1e73bb
       attr->values[i].string.text = _cupsStrAlloc(start);
Tim Waugh 1e73bb
     }
Tim Waugh 1e73bb
   }
Tim Waugh 1e73bb
+
Tim Waugh 1e73bb
+  free(temp);
Tim Waugh 1e73bb
 }
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
 
Tim Waugh 1e73bb
diff -up cups-1.7.0/scheduler/printers.h.stringpool-rdar15382819 cups-1.7.0/scheduler/printers.h
Tim Waugh 1e73bb
--- cups-1.7.0/scheduler/printers.h.stringpool-rdar15382819	2013-05-29 12:51:34.000000000 +0100
Tim Waugh 1e73bb
+++ cups-1.7.0/scheduler/printers.h	2013-11-07 13:27:54.666787149 +0000
Tim Waugh 1e73bb
@@ -166,7 +166,8 @@ extern int		cupsdSetAuthInfoRequired(cup
Tim Waugh 1e73bb
 						 ipp_attribute_t *attr);
Tim Waugh 1e73bb
 extern void		cupsdSetDeviceURI(cupsd_printer_t *p, const char *uri);
Tim Waugh 1e73bb
 extern void		cupsdSetPrinterAttr(cupsd_printer_t *p,
Tim Waugh 1e73bb
-			                    const char *name, char *value);
Tim Waugh 1e73bb
+			                    const char *name,
Tim Waugh 1e73bb
+			                    const char *value);
Tim Waugh 1e73bb
 extern void		cupsdSetPrinterAttrs(cupsd_printer_t *p);
Tim Waugh 1e73bb
 extern int		cupsdSetPrinterReasons(cupsd_printer_t *p,
Tim Waugh 1e73bb
 			                       const char *s);