diff -Naur cups.orig/backend/snmp.c cups/backend/snmp.c --- cups.orig/backend/snmp.c 2008-01-09 13:27:45 +0300 +++ cups/backend/snmp.c 2008-01-09 13:41:42 +0300 @@ -972,18 +972,38 @@ char *string, /* I - String buffer */ int strsize) /* I - String buffer size */ { - if (length < strsize) + if (length < 0) { - memcpy(string, *buffer, length); + /* + * Disallow negative lengths! + */ + + fprintf(stderr, "ERROR: Bad ASN1 string length %d!\n", length); + *string = '\0'; + } + else if (length < strsize) + { + /* + * String is smaller than the buffer... + */ + + if (length > 0) + memcpy(string, *buffer, length); + string[length] = '\0'; } else { + /* + * String is larger than the buffer... + */ + memcpy(string, buffer, strsize - 1); string[strsize - 1] = '\0'; } - (*buffer) += length; + if (length > 0) + (*buffer) += length; return (string); }