diff -up cups-1.5.4/scheduler/printers.c.stringpool-setprinterattr cups-1.5.4/scheduler/printers.c --- cups-1.5.4/scheduler/printers.c.stringpool-setprinterattr 2013-06-13 10:40:43.607590350 +0100 +++ cups-1.5.4/scheduler/printers.c 2013-06-13 10:53:31.134919727 +0100 @@ -2053,6 +2053,7 @@ cupsdSetPrinterAttr( ipp_attribute_t *attr; /* Attribute */ int i, /* Looping var */ count; /* Number of values */ + char *value_dup; /* Copy of attribute value string */ char *ptr, /* Pointer into value */ *start, /* Start of value */ quote; /* Quote character */ @@ -2121,16 +2122,24 @@ cupsdSetPrinterAttr( return; } - for (i = 0; i < count; i ++) + if ((value_dup = strdup(value)) == NULL) { - if ((ptr = strchr(value, ',')) != NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to copy attribute value."); + return; + } + + for (i = 0, start = value_dup; i < count; i ++) + { + 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; } + + free(value_dup); } else { @@ -2171,7 +2180,13 @@ cupsdSetPrinterAttr( return; } - for (i = 0, quote = '\0', ptr = value; i < count; i ++) + if ((value_dup = strdup(value)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to copy attribute value."); + return; + } + + for (i = 0, quote = '\0', ptr = value_dup; i < count; i ++) { for (start = ptr; *ptr; ptr ++) { @@ -2199,6 +2214,8 @@ cupsdSetPrinterAttr( attr->values[i].string.text = _cupsStrAlloc(start); } + + free(value_dup); } }