From 27551f043a74fdba2817ec77519e1226c16ccc1b Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Wed, 31 Jan 2018 20:21:26 -0500 Subject: [PATCH] One more fix for _cupsGetDestResource (Issue #5211) --- cups/dest.c | 81 ++++++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/cups/dest.c b/cups/dest.c index b90be7b3a..090970c79 100644 --- a/cups/dest.c +++ b/cups/dest.c @@ -1094,14 +1094,16 @@ cupsGetDest(const char *name, /* I - Destination name or @code NULL@ for the d * '_cupsGetDestResource()' - Get the resource path and URI for a destination. */ -const char * /* O - Printer URI */ +const char * /* O - URI */ _cupsGetDestResource( cups_dest_t *dest, /* I - Destination */ unsigned flags, /* I - Destination flags */ char *resource, /* I - Resource buffer */ size_t resourcesize) /* I - Size of resource buffer */ { - const char *uri; /* Printer URI */ + const char *uri, /* URI */ + *device_uri, /* Device URI */ + *printer_uri; /* Printer URI */ char scheme[32], /* URI scheme */ userpass[256], /* Username and password (unused) */ hostname[256]; /* Hostname */ @@ -1124,48 +1126,54 @@ _cupsGetDestResource( } /* - * Grab the printer URI... + * Grab the printer and device URIs... */ - if (!(flags & CUPS_DEST_FLAGS_DEVICE)) - uri = NULL; - else - uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); + device_uri = cupsGetOption("device-uri", dest->num_options, dest->options); + printer_uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); - if (uri) - { - DEBUG_printf(("1_cupsGetDestResource: printer-uri-supported=\"%s\"", uri)); - } - else + DEBUG_printf(("1_cupsGetDestResource: device-uri=\"%s\", printer-uri-supported=\"%s\".", device_uri, printer_uri)); + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (((flags & CUPS_DEST_FLAGS_DEVICE) || !printer_uri) && strstr(device_uri, "._tcp")) { - if ((uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL) + if ((device_uri = cups_dnssd_resolve(dest, device_uri, 5000, NULL, NULL, NULL)) != NULL) { -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) - if (strstr(uri, "._tcp")) - { - uri = cups_dnssd_resolve(dest, uri, 5000, NULL, NULL, NULL); + DEBUG_printf(("1_cupsGetDestResource: Resolved device-uri=\"%s\".", device_uri)); + } + else + { + DEBUG_puts("1_cupsGetDestResource: Unable to resolve device."); - if (uri) - DEBUG_printf(("1_cupsGetDestResource: Resolved device-uri=\"%s\"", uri)); - } - else -#endif /* HAVE_DNSSD || HAVE_AVAHI */ + if (resource) + *resource = '\0'; + + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); - DEBUG_printf(("1_cupsGetDestResource: device-uri=\"%s\"", uri)); + return (NULL); } + } +#endif /* HAVE_DNSSD || HAVE_AVAHI */ - if (uri && !(flags & CUPS_DEST_FLAGS_DEVICE)) - { - uri = _cupsCreateDest(dest->name, cupsGetOption("printer-info", dest->num_options, dest->options), NULL, uri, resource, resourcesize); + if (flags & CUPS_DEST_FLAGS_DEVICE) + { + uri = device_uri; + } + else if (printer_uri) + { + uri = printer_uri; + } + else + { + uri = _cupsCreateDest(dest->name, cupsGetOption("printer-info", dest->num_options, dest->options), NULL, device_uri, resource, resourcesize); - if (uri) - { - DEBUG_printf(("1_cupsGetDestResource: Local printer-uri-supported=\"%s\"", uri)); + if (uri) + { + DEBUG_printf(("1_cupsGetDestResource: Local printer-uri-supported=\"%s\"", uri)); - dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &dest->options); + dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &dest->options); - uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); - } + uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); } } @@ -1180,14 +1188,11 @@ _cupsGetDestResource( return (NULL); } - else + else if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK) { - if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK) - { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad URI."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad URI."), 1); - return (NULL); - } + return (NULL); } DEBUG_printf(("1_cupsGetDestResource: resource=\"%s\"", resource)); -- 2.17.1