Blame SOURCES/cups-stringpool-setprinterattr.patch

87cf9a
diff -up cups-1.6.2/scheduler/printers.c.stringpool-setprinterattr cups-1.6.2/scheduler/printers.c
87cf9a
--- cups-1.6.2/scheduler/printers.c.stringpool-setprinterattr	2013-06-13 12:16:07.525680621 +0100
87cf9a
+++ cups-1.6.2/scheduler/printers.c	2013-06-13 12:16:07.567680782 +0100
87cf9a
@@ -1925,6 +1925,7 @@ cupsdSetPrinterAttr(
87cf9a
   ipp_attribute_t	*attr;		/* Attribute */
87cf9a
   int			i,		/* Looping var */
87cf9a
 			count;		/* Number of values */
87cf9a
+  char			*value_dup;	/* Copy of attribute value string */
87cf9a
   char			*ptr,		/* Pointer into value */
87cf9a
 			*start,		/* Start of value */
87cf9a
 			quote;		/* Quote character */
87cf9a
@@ -1993,16 +1994,24 @@ cupsdSetPrinterAttr(
87cf9a
       return;
87cf9a
     }
87cf9a
 
87cf9a
-    for (i = 0; i < count; i ++)
87cf9a
+    if ((value_dup = strdup(value)) == NULL)
87cf9a
     {
87cf9a
-      if ((ptr = strchr(value, ',')) != NULL)
87cf9a
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to copy attribute value.");
87cf9a
+      return;
87cf9a
+    }
87cf9a
+
87cf9a
+    for (i = 0, start = value_dup; i < count; i ++)
87cf9a
+    {
87cf9a
+      if ((ptr = strchr(start, ',')) != NULL)
87cf9a
         *ptr++ = '\0';
87cf9a
 
87cf9a
-      attr->values[i].integer = strtol(value, NULL, 10);
87cf9a
+      attr->values[i].integer = strtol(start, NULL, 10);
87cf9a
 
87cf9a
       if (ptr)
87cf9a
-        value = ptr;
87cf9a
+        start = ptr;
87cf9a
     }
87cf9a
+
87cf9a
+    free(value_dup);
87cf9a
   }
87cf9a
   else
87cf9a
   {
87cf9a
@@ -2043,7 +2052,13 @@ cupsdSetPrinterAttr(
87cf9a
       return;
87cf9a
     }
87cf9a
 
87cf9a
-    for (i = 0, quote = '\0', ptr = value; i < count; i ++)
87cf9a
+    if ((value_dup = strdup(value)) == NULL)
87cf9a
+    {
87cf9a
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to copy attribute value.");
87cf9a
+      return;
87cf9a
+    }
87cf9a
+
87cf9a
+    for (i = 0, quote = '\0', ptr = value_dup; i < count; i ++)
87cf9a
     {
87cf9a
       for (start = ptr; *ptr; ptr ++)
87cf9a
       {
87cf9a
@@ -2071,6 +2086,8 @@ cupsdSetPrinterAttr(
87cf9a
 
87cf9a
       attr->values[i].string.text = _cupsStrAlloc(start);
87cf9a
     }
87cf9a
+
87cf9a
+    free(value_dup);
87cf9a
   }
87cf9a
 }
87cf9a