hplip/fix-printer-attributes-parsing.patch
Martin Wilck d49ed55bcf Accepting request 1075203 from home:alarrosa:branches:Printing
- Add patch to fix hplip applying printf string format parsing to
  printer attributes returned from CUPS (such as
  "dnssd://foo%20series._ipp._tcp.local/?uuid=...") which results
  in a segfault (boo#1209866, lp#2013185):
  * fix-printer-attributes-parsing.patch

OBS-URL: https://build.opensuse.org/request/show/1075203
OBS-URL: https://build.opensuse.org/package/show/Printing/hplip?expand=0&rev=235
2023-03-29 13:04:27 +00:00

61 lines
3.1 KiB
Diff

Index: hplip-3.22.10/protocol/hp_ipp.c
===================================================================
--- hplip-3.22.10.orig/protocol/hp_ipp.c
+++ hplip-3.22.10/protocol/hp_ipp.c
@@ -43,6 +43,12 @@ Boston, MA 02110-1301, USA.
#define _STRINGIZE(x) #x
#define STRINGIZE(x) _STRINGIZE(x)
+#define hplip_strlcpy(dst, src, size) \
+ do { \
+ if (!memccpy(dst, src, '\0', size)) \
+ dst[size - 1] = '\0'; \
+ } while (0)
+
http_t* acquireCupsInstance()
{
@@ -113,7 +119,7 @@ int addCupsPrinter(char *name, char *dev
}
if ( info == NULL )
- snprintf( info,sizeof(info), name );
+ hplip_strlcpy( info, name, sizeof(info));
sprintf( printer_uri, "ipp://localhost/printers/%s", name );
@@ -514,27 +520,27 @@ int __parsePrinterAttributes(ipp_t *resp
if ( strcmp(attr_name, "printer-name") == 0 &&
val_tag == IPP_TAG_NAME ) {
- snprintf(t_printer->name, sizeof(t_printer->name),ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->name, ippGetString(attr, 0, NULL), sizeof(t_printer->name) );
}
else if ( strcmp(attr_name, "device-uri") == 0 &&
val_tag == IPP_TAG_URI ) {
- snprintf(t_printer->device_uri,sizeof(t_printer->device_uri), ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->device_uri, ippGetString(attr, 0, NULL), sizeof(t_printer->device_uri) );
}
else if ( strcmp(attr_name, "printer-uri-supported") == 0 &&
val_tag == IPP_TAG_URI ) {
- snprintf(t_printer->printer_uri,sizeof(t_printer->printer_uri), ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->printer_uri, ippGetString(attr, 0, NULL), sizeof(t_printer->printer_uri) );
}
else if ( strcmp(attr_name, "printer-info") == 0 &&
val_tag == IPP_TAG_TEXT ) {
- snprintf(t_printer->info,sizeof(t_printer->info), ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->info, ippGetString(attr, 0, NULL), sizeof(t_printer->info) );
}
else if ( strcmp(attr_name, "printer-location") == 0 &&
val_tag == IPP_TAG_TEXT ) {
- snprintf(t_printer->location,sizeof(t_printer->location),ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->location, ippGetString(attr, 0, NULL), sizeof(t_printer->location) );
}
else if ( strcmp(attr_name, "printer-make-and-model") == 0 &&
val_tag == IPP_TAG_TEXT ) {
- snprintf(t_printer->make_model,sizeof(t_printer->make_model),ippGetString(attr, 0, NULL) );
+ hplip_strlcpy(t_printer->make_model, ippGetString(attr, 0, NULL), sizeof(t_printer->make_model));
}
else if ( strcmp(attr_name, "printer-state") == 0 &&
val_tag == IPP_TAG_ENUM ) {