net-libs/libtirpc: backport fixes for uclibc-ng userlands

A number of patches from libtirpc git were backported from 1.0.2_rc3 to
resolve compiliation errors when building under a sys-libs/uclibc-ng
userland.  Two patches are custom fixes -- see the top of each patch for
a more detailed explanation.  Tested on mips (both uclibc-ng and glibc)
and amd64 glibc.  Solves Bug #610846.

Signed-off-by: Joshua Kinard <kumba@gentoo.org>
Package-Manager: Portage-2.3.6, Repoman-2.3.2
This commit is contained in:
Joshua Kinard
2017-07-05 06:21:38 -04:00
parent e407e56207
commit ae6ad766ca
7 changed files with 377 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
From: Thorsten Kukuk <kukuk@thkukuk.de>
Date: Mon, 4 Apr 2016 13:48:04 +0000 (-0400)
Subject: Compile des_crypt.c and des_impl.c
X-Git-Tag: libtirpc-1-0-2-rc3~1
X-Git-Url: http://git.linux-nfs.org/?p=steved%2Flibtirpc.git;a=commitdiff_plain;h=7f6bb9a3467a57caf43425d213a06aeb7870086b
Compile des_crypt.c and des_impl.c
Add des_impl.c to become independent of deprecated functions of glibc
Fixes: f17b44048003 ('Revert commit c0547c56dafb')
Signed-off-by: Thorsten Kukuk <kukuk@thkukuk.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
diff --git a/src/Makefile.am b/src/Makefile.am
index e4ed8aa..fba2aa4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -24,7 +24,7 @@ libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c cln
rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_auth_none.c \
svc_auth_des.c \
svc_generic.c svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
- auth_time.c auth_des.c authdes_prot.c debug.c
+ auth_time.c auth_des.c authdes_prot.c debug.c des_crypt.c des_impl.c
## XDR
libtirpc_la_SOURCES += xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c xdr_sizeof.c

View File

@@ -0,0 +1,30 @@
From: Thorsten Kukuk <kukuk@thkukuk.de>
Date: Mon, 4 Apr 2016 13:37:32 +0000 (-0400)
Subject: getpublickey.c: ifdef out yp headers
X-Git-Tag: libtirpc-1-0-2-rc3~3
X-Git-Url: http://git.linux-nfs.org/?p=steved%2Flibtirpc.git;a=commitdiff_plain;h=742bbdff6ddff4dde0d610a842cd8ac0408af0a0
getpublickey.c: ifdef out yp headers
If we don't compile in YP support, don't include YP
Signed-off-by: Thorsten Kukuk <kukuk@thkukuk.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
diff --git a/src/getpublickey.c b/src/getpublickey.c
index 764a5f9..8cf4dc2 100644
--- a/src/getpublickey.c
+++ b/src/getpublickey.c
@@ -38,8 +38,10 @@
#include <pwd.h>
#include <rpc/rpc.h>
#include <rpc/key_prot.h>
+#ifdef YP
#include <rpcsvc/yp_prot.h>
#include <rpcsvc/ypclnt.h>
+#endif
#include <string.h>
#include <stdlib.h>

View File

@@ -0,0 +1,43 @@
From: Thorsten Kukuk <kukuk@thkukuk.de>
Date: Mon, 4 Apr 2016 13:51:15 +0000 (-0400)
Subject: Remove des*.c dependencies to glibc
X-Git-Tag: libtirpc-1-0-2-rc3
X-Git-Url: http://git.linux-nfs.org/?p=steved%2Flibtirpc.git;a=commitdiff_plain;h=503ac2e9fa569d95e366766202a7ca840e28b28a
Remove des*.c dependencies to glibc
Our des_impl.c has dependencies to glibc header files
and different arguments then our header file has.
Bring our own code in sync.
Signed-off-by: Thorsten Kukuk <kukuk@thkukuk.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
diff --git a/src/des_impl.c b/src/des_impl.c
index c5b7ed6..9dbccaf 100644
--- a/src/des_impl.c
+++ b/src/des_impl.c
@@ -6,7 +6,8 @@
/* see <http://www.gnu.org/licenses/> to obtain a copy. */
#include <string.h>
#include <stdint.h>
-#include <rpc/rpc_des.h>
+#include <sys/types.h>
+#include <rpc/des.h>
static const uint32_t des_SPtrans[8][64] =
diff --git a/tirpc/rpc/des.h b/tirpc/rpc/des.h
index d2881ad..018aa48 100644
--- a/tirpc/rpc/des.h
+++ b/tirpc/rpc/des.h
@@ -82,6 +82,6 @@ struct desparams {
/*
* Software DES.
*/
-extern int _des_crypt( char *, int, struct desparams * );
+extern int _des_crypt( char *, unsigned, struct desparams * );
#endif

View File

@@ -0,0 +1,137 @@
From: Thorsten Kukuk <kukuk@thkukuk.de>
Date: Mon, 4 Apr 2016 13:44:19 +0000 (-0400)
Subject: Remove dependency to nis.h
X-Git-Tag: libtirpc-1-0-2-rc3~2
X-Git-Url: http://git.linux-nfs.org/?p=steved%2Flibtirpc.git;a=commitdiff_plain;h=5f00f8c78c5d13437d50c0737ce77ad67fd4361d
Remove dependency to nis.h
libtirpc needs rpcsvc/nis.h for compiling, but does not
provide this head file. It's only provided by glibc,
if the sunrpc code is not marked as deprecated, and
by libnsl. But libnsl needs libtirpc to compile...
Signed-off-by: Steve Dickson <steved@redhat.com>
---
diff --git a/src/auth_des.c b/src/auth_des.c
index 4d3639e..af2f61f 100644
--- a/src/auth_des.c
+++ b/src/auth_des.c
@@ -46,8 +46,8 @@
#include <rpc/clnt.h>
#include <rpc/xdr.h>
#include <sys/socket.h>
-#undef NIS
-#include <rpcsvc/nis.h>
+
+#include "nis.h"
#if defined(LIBC_SCCS) && !defined(lint)
#endif
diff --git a/src/auth_time.c b/src/auth_time.c
index 10e58eb..7f83ab4 100644
--- a/src/auth_time.c
+++ b/src/auth_time.c
@@ -44,8 +44,8 @@
#include <rpc/rpcb_prot.h>
//#include <clnt_soc.h>
#include <sys/select.h>
-#undef NIS
-#include <rpcsvc/nis.h>
+
+#include "nis.h"
#ifdef TESTING
diff --git a/src/nis.h b/src/nis.h
new file mode 100644
index 0000000..588c041
--- /dev/null
+++ b/src/nis.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010, Oracle America, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ * * Neither the name of the "Oracle America, Inc." nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _INTERNAL_NIS_H
+#define _INTERNAL_NIS_H 1
+
+/* This file only contains the definition of nis_server, to be
+ able to compile libtirpc without the need to have a glibc
+ with sunrpc or a libnsl already installed. */
+
+#define NIS_PK_NONE 0
+
+struct nis_attr {
+ char *zattr_ndx;
+ struct {
+ u_int zattr_val_len;
+ char *zattr_val_val;
+ } zattr_val;
+};
+typedef struct nis_attr nis_attr;
+
+typedef char *nis_name;
+
+struct endpoint {
+ char *uaddr;
+ char *family;
+ char *proto;
+};
+typedef struct endpoint endpoint;
+
+struct nis_server {
+ nis_name name;
+ struct {
+ u_int ep_len;
+ endpoint *ep_val;
+ } ep;
+ uint32_t key_type;
+ netobj pkey;
+};
+typedef struct nis_server nis_server;
+
+#endif /* ! _INTERNAL_NIS_H */
diff --git a/src/rpc_soc.c b/src/rpc_soc.c
index 1ec7b3f..ed0892a 100644
--- a/src/rpc_soc.c
+++ b/src/rpc_soc.c
@@ -61,8 +61,8 @@
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
-#include <rpcsvc/nis.h>
+#include "nis.h"
#include "rpc_com.h"
extern mutex_t rpcsoc_lock;

View File

@@ -0,0 +1,51 @@
From https://patchwork.kernel.org/patch/5499671/:
Subject: [6/9] Define struct rpcent on non GNU libc
From: Natanael Copa <ncopa@alpinelinux.org>
X-Patchwork-Id: 5499671
Message-Id: <1418718540-13667-7-git-send-email-ncopa@alpinelinux.org>
To: libtirpc-devel@lists.sourceforge.net
Cc: linux-nfs@vger.kernel.org, Natanael Copa <ncopa@alpinelinux.org>
Date: Tue, 16 Dec 2014 09:28:57 +0100
This fixes the following compile error with musl libc:
getrpcent.c:65:16: error: field 'rpc' has incomplete type
struct rpcent rpc;
^
Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
---
This patch could probably be better. It assumes that only GNU libc has
the rpcent struct defined, but the BSDs probably has it too.
I am not sure if uClibc has it, but uClibc does define __GLIBC__ so it
might be broken there too.
I looked into using AC_CHECK_MEMBER but I don't think it is a good idea
so depend on config.h since this is a header that will be installed on
the system.
I also found out that struct rpcent is also defined in
/usr/include/gssrpc/netdb.h but I am unsure if we can depend on that
too since GSS is optional.
So I am a bit in doubt what the proper fix is. Meanwhile, this works
for musl libc.
We fix the uClibc case by checking for __UCLIBC__ as well, since uClibc will
define __GLIBC__ as well (why?) as __UCLIBC__. This should not affect the
musl case.
---
diff -Naurp libtirpc-1.0.1.orig/tirpc/rpc/rpcent.h libtirpc-1.0.1/tirpc/rpc/rpcent.h
--- libtirpc-1.0.1.orig/tirpc/rpc/rpcent.h 2015-10-30 15:15:14.000000000 +0000
+++ libtirpc-1.0.1/tirpc/rpc/rpcent.h 2017-07-05 04:58:27.141468000 +0000
@@ -49,7 +49,7 @@ extern "C" {
#endif
/* These are defined in /usr/include/rpc/netdb.h */
-#if !defined(__GLIBC__)
+#if !defined(__GLIBC__) || defined(__UCLIBC__)
struct rpcent {
char *r_name; /* name of server for this rpc program */
char **r_aliases; /* alias list */

View File

@@ -0,0 +1,21 @@
Inspired by a similar fix here:
http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/packages/nfs-utils/files/uclibc_bzero_fix.patch?id=39d8c0fc4a9d14b7bad1442e05c536e28b196a47
Because uclibc does not have a working implementation of `__bzero'.
---
diff -Naurp libtirpc-1.0.1.orig/src/des_impl.c libtirpc-1.0.1/src/des_impl.c
--- libtirpc-1.0.1.orig/src/des_impl.c 2017-07-05 06:16:07.441468000 +0000
+++ libtirpc-1.0.1/src/des_impl.c 2017-07-05 06:19:57.351468000 +0000
@@ -588,7 +588,11 @@ _des_crypt (char *buf, unsigned len, str
}
tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
tbuf[0] = tbuf[1] = 0;
+#ifndef __UCLIBC__
__bzero (schedule, sizeof (schedule));
+#else
+ memset (schedule, 0, sizeof (schedule));
+#endif
return (1);
}

View File

@@ -0,0 +1,66 @@
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
EAPI="5"
inherit multilib-minimal toolchain-funcs eutils
DESCRIPTION="Transport Independent RPC library (SunRPC replacement)"
HOMEPAGE="http://libtirpc.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2
mirror://gentoo/${PN}-glibc-nfs.tar.xz"
LICENSE="GPL-2"
SLOT="0/3" # subslot matches SONAME major
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
IUSE="ipv6 kerberos static-libs"
RDEPEND="kerberos? ( >=virtual/krb5-0-r1[${MULTILIB_USEDEP}] )"
DEPEND="${RDEPEND}
app-arch/xz-utils
>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]"
PATCHES=(
"${FILESDIR}/${P}-CVE-2017-8779.patch"
"${FILESDIR}/${P}_uclibc-dont-use-struct-rpcent.patch"
"${FILESDIR}/${P}_ifdef-out-yp-headers-742bbdff6ddf.patch"
"${FILESDIR}/${P}_remove-nis-h-dep-5f00f8c78c5d.patch"
"${FILESDIR}/${P}_add-des_impl-c-7f6bb9a3467a.patch"
"${FILESDIR}/${P}_remove-des-deps-to-glibc-503ac2e9fa56.patch"
"${FILESDIR}/${P}_uclibc-use-memset-not-bzero.patch"
)
src_prepare() {
cp -r "${WORKDIR}"/tirpc "${S}"/ || die
epatch "${PATCHES[@]}"
epatch_user
}
multilib_src_configure() {
ECONF_SOURCE=${S} \
econf \
$(use_enable ipv6) \
$(use_enable kerberos gssapi) \
$(use_enable static-libs static)
}
multilib_src_install() {
default
# libtirpc replaces rpc support in glibc, so we need it in /
gen_usr_ldscript -a tirpc
}
multilib_src_install_all() {
einstalldocs
insinto /etc
doins doc/netconfig
insinto /usr/include/tirpc
doins -r "${WORKDIR}"/tirpc/*
# makes sure that the linking order for nfs-utils is proper, as
# libtool would inject a libgssglue dependency in the list.
use static-libs || prune_libtool_files
}