Subject: [alpine-devel] [PATCH] main/cups: fix typo, lpd backend

From: Isaac Dunham <[email-masked]>
Date: Sun, 29 Jun 2014 22:53:44 -0700

'ldadmin' for 'lpadmin' kept cups from starting.
'lpd' failed with errno=EINVAL on musl, thanks to passing bind a
struct sockaddr{,_in,_in6,_un} with a reported size of 256.
This resulted in lpd print support being unusable.
---
 main/cups/APKBUILD                       | 12 ++++++---
 main/cups/cups-check-sockaddr-size.patch | 45 ++++++++++++++++++++++++++++++++
 main/cups/cups.pre-install               |  2 +-
 3 files changed, 54 insertions(+), 5 deletions(-)
 create mode 100644 main/cups/cups-check-sockaddr-size.patch

diff --git a/main/cups/APKBUILD b/main/cups/APKBUILD
index f625c3e..9f2352a 100644
--- a/main/cups/APKBUILD
+++ b/main/cups/APKBUILD
@@ -1,7 +1,7 @@
 # Maintainer: Natanael Copa <[email-masked]>
 pkgname=cups
 pkgver=1.7.3
-pkgrel=0
+pkgrel=1
 pkgdesc="The CUPS Printing System"
 url="http://www.cups.org/"
 arch="all"
@@ -19,6 +19,7 @@ source="http://www.cups.org/software/$pkgver/cups-$pkgver-source.tar.bz2
 	$pkgname.logrotate
 	cupsd.initd
 	cups-no-export-ssllibs.patch
+	cups-check-sockaddr-size.patch
 	"
 
 _builddir="$srcdir"/$pkgname-$pkgver
@@ -120,12 +121,15 @@ client() {
 md5sums="d498c3020acda0904ab0c13b6389a1ec  cups-1.7.3-source.tar.bz2
 f861b18f4446c43918c8643dcbbd7f6d  cups.logrotate
 1154ed66fdcfa0523f929a369079f43c  cupsd.initd
-3ba9e3410df1dc3015463d615ef91b3b  cups-no-export-ssllibs.patch"
+3ba9e3410df1dc3015463d615ef91b3b  cups-no-export-ssllibs.patch
+81391375d22df6808a1042a0fae85845  cups-check-sockaddr-size.patch"
 sha256sums="fa989f856d1499169dc442fb2311053ea42fe455ca2721693ba5a9fe4b333e31  cups-1.7.3-source.tar.bz2
 b3308353504bc1cc0d5203ad3609bc98639ad9655b52e8ec8257286877532796  cups.logrotate
 3ea71f13cf925736847ca44aa0f1a9ed944fb3d303c34af923140b20fd587e2b  cupsd.initd
-ff3eb0782af0405f5dafe89e04b1b4ea7a49afc5496860d724343bd04f375832  cups-no-export-ssllibs.patch"
+ff3eb0782af0405f5dafe89e04b1b4ea7a49afc5496860d724343bd04f375832  cups-no-export-ssllibs.patch
+32a06c70093f8ad52e35520048b68d544f13f5c8094f85bab53ff54c809012ef  cups-check-sockaddr-size.patch"
 sha512sums="78e5275682322a52c5e10d87c106059900595c4fd167924bece30d32b646c304ecc0f5051c53cb983b75d5a5ab76fd5b81931fb6f191b9e936f2528ca869798e  cups-1.7.3-source.tar.bz2
 162fe69ee46962f7ce07a9a2a75154682088895c4749c9bcfc54bb2aa861f48d7d1a8e3223f78a197319a3a405626ffe996615f6eb23168afcefabab343d5be0  cups.logrotate
 3c5f4017cb1faf3e63551db53da4cb8305601adf65358bc53e982c5a0dfdd2b455a8ce735760ae3cc5ef81cdfa2a3cfe4be4107d1858d7ab9d91b4b97d3bc73b  cupsd.initd
-7a8cd9ac33b0dd4627c72df4275db8ccd7cf8e201bce3833719b42f532f526bb347b842e3ea1ef0d61855b5c6e1088b5d20b68942f2c2c0acf504d8d9728efd3  cups-no-export-ssllibs.patch"
+7a8cd9ac33b0dd4627c72df4275db8ccd7cf8e201bce3833719b42f532f526bb347b842e3ea1ef0d61855b5c6e1088b5d20b68942f2c2c0acf504d8d9728efd3  cups-no-export-ssllibs.patch
+ef0d1d80bf78de8bc29821f675891409605515a89358615d56b76d534ee0935ac9cffa625ba8622f5351d0efc030dead11d885b1f125df2beb42e3afd377ff9a  cups-check-sockaddr-size.patch"
diff --git a/main/cups/cups-check-sockaddr-size.patch b/main/cups/cups-check-sockaddr-size.patch
new file mode 100644
index 0000000..ce966dc
--- /dev/null
+++ b/main/cups/cups-check-sockaddr-size.patch
@@ -0,0 +1,45 @@
+diff --git a/backend/lpd.c b/backend/lpd.c
+index 6e4ab36..bbffb82 100644
+--- a/backend/lpd.c
++++ b/backend/lpd.c
+@@ -1244,6 +1244,7 @@ rresvport_af(int *port,			/* IO - Port number to bind to */
+ {
+   http_addr_t	addr;			/* Socket address */
+   int		fd;			/* Socket file descriptor */
++  socklen_t	socksz=sizeof(struct sockaddr);	/* size of struct sockaddr* */
+ 
+ 
+  /*
+@@ -1260,6 +1261,23 @@ rresvport_af(int *port,			/* IO - Port number to bind to */
+   memset(&addr, 0, sizeof(addr));
+   addr.addr.sa_family = family;
+ 
++  switch(family) {
++    case AF_INET:
++      socksz = sizeof(struct sockaddr_in);
++      break;
++#ifdef AF_INET6
++    case AF_INET6:
++      socksz = sizeof(struct sockaddr_in6);
++      break;
++#endif
++#ifdef AF_LOCAL
++    case AF_LOCAL:
++      socksz = sizeof(struct sockaddr_un);
++#endif
++    default:
++      break;
++  }
++
+  /*
+   * Try to bind the socket to a reserved port...
+   */
+@@ -1276,7 +1294,7 @@ rresvport_af(int *port,			/* IO - Port number to bind to */
+     * Try binding the port to the socket; return if all is OK...
+     */
+ 
+-    if (!bind(fd, (struct sockaddr *)&addr, sizeof(addr)))
++    if (!bind(fd, (struct sockaddr *)&addr, socksz))
+       return (fd);
+ 
+    /*
diff --git a/main/cups/cups.pre-install b/main/cups/cups.pre-install
index f6b88cb..468163c 100644
--- a/main/cups/cups.pre-install
+++ b/main/cups/cups.pre-install
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-addgroup -S ldadmin 2>/dev/null
+addgroup -S lpadmin 2>/dev/null
 addgroup -S lp 2>/dev/null
 adduser -S -G lp lp 2>/dev/null
 addgroup lp lp 2>/dev/null
-- 
2.0.1

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---