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