[BACK]Return to patch-cups_http-addrlist.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / pkgsrc / print / cups-base / patches

File: [cvs.NetBSD.org] / pkgsrc / print / cups-base / patches / patch-cups_http-addrlist.c (download)

Revision 1.2, Tue May 10 20:47:37 2022 UTC (8 months, 3 weeks ago) by markd
Branch: MAIN
CVS Tags: pkgsrc-2022Q4-base, pkgsrc-2022Q4, pkgsrc-2022Q3-base, pkgsrc-2022Q3, pkgsrc-2022Q2-base, pkgsrc-2022Q2, HEAD
Changes since 1.1: +20 -8 lines

{cups,cups-base,libcups}: update to 2.4.1

Changes in CUPS v2.4.1 (27th January 2022)
------------------------------------------

- The default color mode now is now configurable and defaults to the printer's
  reported default mode
- Configuration script now checks linking for -Wl,-pie flags
- Fixed memory leaks - in testi18n, in `cups_enum_dests()`,
  in `_cupsEncodeOption()` and `http_tls_upgrade()`
- Fixed missing bracket in de/index.html
- Fixed typos in configuration scripts
- Removed remaining legacy code for `RIP_MAX_CACHE` environment variable
- Removed deprecated directives from cupsctl and cups-files.conf
- Removed `purge-jobs` legacy code from CGI scripts and templates


Changes in CUPS v2.4.0 (29th November 2021)
-------------------------------------------

- Added configure option --with-idle-exit-timeout
- Added --with-systemd-timeoutstartsec configure option
- DigestOptions now are applied for MD5 Digest authentication defined
  by RFC 2069 as well
- Fixed compilation on Solaris
- Fixed and improved German translations


Changes in CUPS v2.4rc1 (12th November 2021)
--------------------------------------------

- Added warning and debug messages when loading printers
 if the queue is raw or with driver
- Compilation now uses -fstack-protector-strong if available


Changes in CUPS v2.4b1 (27th October 2021)
------------------------------------------

- Added support for CUPS running in a Snapcraft snap.
- Added basic OAuth 2.0 client support
- Added support for AirPrint and Mopria clients
- Added configure support for specifying systemd dependencies in the CUPS
  service file
- Added a JSON output mode for `ipptool`.
- The `ipptool` command now correctly reports an error when a test file cannot
  be found.
- CUPS library now uses thread safe `getpwnam_r` and `getpwuid_r` functions
- Fixed Kerberos authentication for the web interface
- The ZPL sample driver now supports more "standard" label sizes
- Fixed reporting of printer instances when enumerating and when no options are
  set for the main instance
- Reverted USB read limit enforcement change from CUPS 2.2.12
- The IPP backend did not return the correct status code when a job was canceled
  at the printer/server
- The `testlang` unit test program now loops over all of the available locales
  by default
- The `cupsfilter` command now shows error messages when options are used
  incorrectly
- The PPD functions now treat boolean values as case-insensitive
- Temporary queue names no longer end with an underscore
- The USB backend now runs as root
- Added pkg-config file for libcups
- Fixed a PPD memory leak caused by emulator definitions
- Fixed a `DISPLAY` bug in `ipptool`
- The scheduler now includes the `[Job N]` prefix for job log messages, even
  when using syslog logging
- Added support for locales using the GB18030 character set
- `httpReconnect2` did not reset the socket file descriptor when the TLS
  negotiation failed
- `httpUpdate` did not reset the socket file descriptor when the TLS
  negotiation failed
- The IPP backend now retries Validate-Job requests
- Now show better error messages when a driver interface program fails to
  provide a PPD file
- Added dark mode support to the CUPS web interface
- Added a workaround for Solaris in `httpAddrConnect2`
- Fixed an interaction between `--remote-admin` and `--remote-any` for the
  `cupsctl` command
- Now use a 60 second timeout for reading USB backchannel data
- The USB backend now tries harder to find a serial number
- Fixed `@IF(name)` handling in `cupsd.conf`
- Fixed documentation and added examples for CUPS' limited CGI support
- Fixed the `lpc` command prompt
- Now always pass "localhost" in the `Host:` header when talking over a domain
  socket or the loopback interface
- Fixed a job history update issue in the scheduler
- Fixed `job-pages-per-set` value for duplex print jobs.
- Fixed an edge case in `ippReadIO` to make sure that only complete attributes
  and values are retained on an error
- Hardened `ippReadIO` to prevent invalid IPP messages from being propagated
- The scheduler now supports the "everywhere" model directly
- Fixed some IPP Everywhere option mapping problems
- Fixed support for "job-hold-until" with the Restart-Job operation
- Fixed the default color/grayscale presets for IPP Everywhere PPDs
- Fixed support for the 'offline-report' state for all USB backends
- Documentation fixes
- Localization updates
- USB quirk updates
- Web interface updates
- The `ippeveprinter` tool now automatically uses an available port.
- Fixed several Windows TLS and hashing issues.
- Deprecated cups-config
- Deprecated Kerberos (`AuthType Negotiate`) authentication
- Removed support for the (long deprecated and unused) `FontPath`,
  `ListenBackLog`, `LPDConfigFile`, `KeepAliveTimeout`, `RIPCache`, and
  `SMBConfigFile` directives in `cupsd.conf` and `cups-files.conf`.
- Stubbed out deprecated `httpMD5` functions.
- Add test for undefined page ranges during printing.

$NetBSD: patch-cups_http-addrlist.c,v 1.2 2022/05/10 20:47:37 markd Exp $

Checkout for non-blocking connect is difficult as systems can't agree on
whether it is a write condition or an error. Check for both with
poll/select and if either flag is set, use getpeername to determine if
the socket was really connected. If it wasn't, drop it correctly from the
poll event list as well as to not check stale event masks.

--- cups/http-addrlist.c.orig	2022-01-27 11:11:42.000000000 +0000
+++ cups/http-addrlist.c
@@ -74,8 +74,7 @@ httpAddrConnect2(
 #  ifdef HAVE_POLL
   struct pollfd		pfds[100];	/* Polled file descriptors */
 #  else
-  fd_set		input_set,	/* select() input set */
-			output_set,	/* select() output set */
+  fd_set		output_set,	/* select() output set */
 			error_set;	/* select() error set */
   struct timeval	timeout;	/* Timeout */
 #  endif /* HAVE_POLL */
@@ -290,16 +289,15 @@ httpAddrConnect2(
       DEBUG_printf(("1httpAddrConnect2: poll() returned %d (%d)", result, errno));
 
 #  else
-      FD_ZERO(&input_set);
+      FD_ZERO(&output_set);
       for (i = 0; i < nfds; i ++)
-	FD_SET(fds[i], &input_set);
-      output_set = input_set;
-      error_set  = input_set;
+	FD_SET(fds[i], &output_set);
+      error_set  = output_set;
 
       timeout.tv_sec  = 0;
       timeout.tv_usec = (addrlist ? 100 : remaining > 250 ? 250 : remaining) * 1000;
 
-      result = select(max_fd + 1, &input_set, &output_set, &error_set, &timeout);
+      result = select(max_fd + 1, NULL, &output_set, &error_set, &timeout);
 
       DEBUG_printf(("1httpAddrConnect2: select() returned %d (%d)", result, errno));
 #  endif /* HAVE_POLL */
@@ -318,43 +316,16 @@ httpAddrConnect2(
       {
 #  ifdef HAVE_POLL
 	DEBUG_printf(("pfds[%d].revents=%x\n", i, pfds[i].revents));
-	if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP)))
+	if (pfds[i].revents)
 #  else
-	if (FD_ISSET(fds[i], &input_set) && !FD_ISSET(fds[i], &error_set))
+	if (FD_ISSET(fds[i], &output_set) || FD_ISSET(fds[i], &error_set))
 #  endif /* HAVE_POLL */
 	{
-	  *sock    = fds[i];
-	  connaddr = addrs[i];
-
-#  ifdef DEBUG
-	  len   = sizeof(peer);
-	  if (!getpeername(fds[i], (struct sockaddr *)&peer, &len))
-	    DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer)));
-#  endif /* DEBUG */
-
-          break;
-	}
-#  ifdef HAVE_POLL
-	else if (pfds[i].revents & (POLLERR | POLLHUP))
-#  else
-	else if (FD_ISSET(fds[i], &error_set))
-#  endif /* HAVE_POLL */
-        {
-#  ifdef __sun
-          // Solaris incorrectly returns errors when you poll() a socket that is
-          // still connecting.  This check prevents us from removing the socket
-          // from the pool if the "error" is EINPROGRESS...
-          int		sockerr;	// Current error on socket
-          socklen_t	socklen = sizeof(sockerr);
-					// Size of error variable
-
-          if (!getsockopt(fds[i], SOL_SOCKET, SO_ERROR, &sockerr, &socklen) && (!sockerr || sockerr == EINPROGRESS))
-            continue;			// Not an error
-#  endif // __sun
-
-         /*
-          * Error on socket, remove from the "pool"...
-          */
+	  if (getpeername(fds[i], NULL, 0) == 0) {
+	    *sock    = fds[i];
+	    connaddr = addrs[i];
+	    break;
+	  }
 
 	  httpAddrClose(NULL, fds[i]);
           nfds --;
@@ -362,6 +333,9 @@ httpAddrConnect2(
           {
             memmove(fds + i, fds + i + 1, (size_t)(nfds - i) * (sizeof(fds[0])));
             memmove(addrs + i, addrs + i + 1, (size_t)(nfds - i) * (sizeof(addrs[0])));
+#  ifdef HAVE_POLL
+	    memmove(pfds + i, pfds + i + 1, (size_t)(nfds - i) * (sizeof(pfds[0])));
+#  endif /* HAVE_POLL */
           }
           i --;
         }