diff -up cups-1.4.6/backend/ieee1284.c.usb-parallel cups-1.4.6/backend/ieee1284.c --- cups-1.4.6/backend/ieee1284.c.usb-parallel 2010-04-10 00:42:09.000000000 +0200 +++ cups-1.4.6/backend/ieee1284.c 2011-02-01 16:13:44.000000000 +0100 @@ -55,7 +55,7 @@ backendGetDeviceID( # if defined(__sun) && defined(ECPPIOC_GETDEVID) struct ecpp_device_id did; /* Device ID buffer */ # endif /* __sun && ECPPIOC_GETDEVID */ - + char *c; DEBUG_printf(("backendGetDeviceID(fd=%d, device_id=%p, device_id_size=%d, " "make_model=%p, make_model_size=%d, scheme=\"%s\", " @@ -176,7 +176,7 @@ backendGetDeviceID( * and then limit the length to the size of our buffer... */ - if (length > device_id_size) + if ((length > device_id_size) || (length < 14)) length = (((unsigned)device_id[1] & 255) << 8) + ((unsigned)device_id[0] & 255); @@ -214,11 +214,16 @@ backendGetDeviceID( device_id[length] = '\0'; } } -# ifdef DEBUG else + { +# ifdef DEBUG + DEBUG_printf(("backendGetDeviceID: ioctl failed - %s\n", strerror(errno))); # endif /* DEBUG */ + /* Clean up after failed attempt to get device ID */ + *device_id = '\0'; + } # endif /* __linux */ # if defined(__sun) && defined(ECPPIOC_GETDEVID) @@ -246,14 +251,24 @@ backendGetDeviceID( # endif /* __sun && ECPPIOC_GETDEVID */ } + /* + * Check whether device ID is valid. Turn line breaks and tabs to spaces + * and abort device IDs with non-printable characters + */ + for (c = device_id; *c; c++) + if (isspace(*c)) + *c = ' '; + else if (!isprint(*c)) + { + *device_id = '\0'; + break; + } + DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id)); if (scheme && uri) *uri = '\0'; - if (!*device_id) - return (-1); - /* * Get the make and model... */