From 9db61875a14fd86eb87e3155fa53ab69f26eb02a Mon Sep 17 00:00:00 2001 From: Zdenek Dohnal Date: Tue, 6 Jun 2023 14:38:02 +0200 Subject: [PATCH] Merge fix for #719 into 2.4.x --- CHANGES.md | 3 +++ cups/dest.c | 65 ++++++++++++++++++++++++++++------------------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f01a899e17..b0e0349a91 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,9 @@ CHANGES - OpenPrinting CUPS 2.4.3 - 2023-06-01 Changes in CUPS v2.4.4 (TBA) --------------------------- +- Fix segfault in `cupsGetNamedDest()` when trying to get default printer, but + the default printer is not set (Issue #719) + Changes in CUPS v2.4.3 (2023-06-01) ----------------------------------- diff --git a/cups/dest.c b/cups/dest.c index 741aae0631..da775a3901 100644 --- a/cups/dest.c +++ b/cups/dest.c @@ -1836,49 +1836,52 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT if (!_cupsGetDests(http, op, dest_name, &dest, 0, 0)) { - _cups_namedata_t data; /* Callback data */ + _cups_namedata_t data; /* Callback data */ - DEBUG_puts("1cupsGetNamedDest: No queue found for printer, looking on network..."); + data.name = dest_name; + data.dest = NULL; - data.name = dest_name; - data.dest = NULL; + if (data.name) + { + DEBUG_puts("1cupsGetNamedDest: No queue found for printer, looking on network..."); cupsEnumDests(0, 1000, NULL, 0, 0, (cups_dest_cb_t)cups_name_cb, &data); + } - if (!data.dest) + if (!data.dest) + { + switch (set_as_default) { - switch (set_as_default) - { - default : - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist."), 1); - break; - - case 1 : /* Set from env vars */ - if (getenv("LPDEST")) - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("LPDEST environment variable names default destination that does not exist."), 1); - else if (getenv("PRINTER")) - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("PRINTER environment variable names default destination that does not exist."), 1); - else - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); - break; + default : + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist."), 1); + break; + + case 1 : /* Set from env vars */ + if (getenv("LPDEST")) + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("LPDEST environment variable names default destination that does not exist."), 1); + else if (getenv("PRINTER")) + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("PRINTER environment variable names default destination that does not exist."), 1); + else + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); + break; - case 2 : /* Set from ~/.cups/lpoptions */ - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("~/.cups/lpoptions file names default destination that does not exist."), 1); - break; + case 2 : /* Set from ~/.cups/lpoptions */ + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("~/.cups/lpoptions file names default destination that does not exist."), 1); + break; - case 3 : /* Set from /etc/cups/lpoptions */ - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("/etc/cups/lpoptions file names default destination that does not exist."), 1); - break; + case 3 : /* Set from /etc/cups/lpoptions */ + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("/etc/cups/lpoptions file names default destination that does not exist."), 1); + break; - case 4 : /* Set from server */ - _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); - break; - } + case 4 : /* Set from server */ + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); + break; + } return (NULL); - } + } - dest = data.dest; + dest = data.dest; } DEBUG_printf(("1cupsGetNamedDest: Got dest=%p", (void *)dest)); -- 2.47.3