OBS User unknown 2008-09-05 19:56:33 +00:00 committed by Git OBS Bridge
parent d9fb4e2773
commit 2588dcf82a
27 changed files with 176 additions and 907 deletions

View File

@ -1,23 +0,0 @@
commit 3f947c093f828629c2fc5624aa3ad8c7465f76d1
Author: Steve Dickson <steved@redhat.com>
Date: Thu Oct 25 10:55:57 2007 -0400
Added " || defined(__arm__)" to xdr_float.c which allows libtirpc
to build on ARM processors.
Author-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/xdr_float.c b/src/xdr_float.c
index 375e535..d8b22e6 100644
--- a/src/xdr_float.c
+++ b/src/xdr_float.c
@@ -59,7 +59,7 @@
defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
defined(__arm32__) || defined(__ppc__) || defined(__ia64__) || \
defined(__arm26__) || defined(__sparc64__) || defined(__amd64__) || \
- defined(__powerpc__) || defined(__s390__)
+ defined(__powerpc__) || defined(__s390__) || defined(__arm__)
#include <bits/endian.h>
#define IEEEFP
#endif

View File

@ -1,29 +0,0 @@
commit 83cb8b02f87fe6fd7bbd903e4825f7cb38e59ec4
Author: Steve Dickson <steved@redhat.com>
Date: Fri May 4 12:19:27 2007 -0400
A couple ntohs() were needed in bindresvport_sa()
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/bindresvport.c b/src/bindresvport.c
index bc75d29..6aac03c 100644
--- a/src/bindresvport.c
+++ b/src/bindresvport.c
@@ -101,14 +101,14 @@ bindresvport_sa(sd, sa)
case AF_INET:
sin = (struct sockaddr_in *)sa;
salen = sizeof(struct sockaddr_in);
- port = sin->sin_port;
+ port = ntohs(sin->sin_port);
portp = &sin->sin_port;
break;
#ifdef INET6
case AF_INET6:
sin6 = (struct sockaddr_in6 *)sa;
salen = sizeof(struct sockaddr_in6);
- port = sin6->sin6_port;
+ port = ntohs(sin6->sin6_port);
portp = &sin6->sin6_port;
break;
#endif

View File

@ -1,64 +0,0 @@
commit c254b435007ebd4ed471737198975d5ccf4e7949
Author: Steve Dickson <steved@redhat.com>
Date: Thu Apr 26 17:20:21 2007 -0400
Added a optimization to bindresvport that allows more
ports to be tried.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/bindresvport.c b/src/bindresvport.c
index b197efa..bc75d29 100644
--- a/src/bindresvport.c
+++ b/src/bindresvport.c
@@ -62,6 +62,7 @@ bindresvport(sd, sin)
#ifdef __linux__
#define STARTPORT 600
+#define LOWPORT 512
#define ENDPORT (IPPORT_RESERVED - 1)
#define NPORTS (ENDPORT - STARTPORT + 1)
@@ -76,10 +77,13 @@ bindresvport_sa(sd, sa)
#ifdef INET6
struct sockaddr_in6 *sin6;
#endif
- u_int16_t port;
u_int16_t *portp;
+ static u_int16_t port;
+ static short startport = STARTPORT;
socklen_t salen;
- int i;
+ int nports = ENDPORT - startport + 1;
+ int endport = ENDPORT;
+ int i;
if (sa == NULL) {
salen = sizeof(myaddr);
@@ -119,13 +123,22 @@ bindresvport_sa(sd, sa)
}
res = -1;
errno = EADDRINUSE;
- for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++) {
+ again:
+ for (i = 0; i < nports; ++i) {
*portp = htons(port++);
- if (port > ENDPORT) {
- port = STARTPORT;
- }
+ if (port > endport)
+ port = startport;
res = bind(sd, sa, salen);
+ if (res >= 0 || errno != EADDRINUSE)
+ break;
}
+ if (i == nports && startport != LOWPORT) {
+ startport = LOWPORT;
+ endport = STARTPORT - 1;
+ nports = STARTPORT - LOWPORT;
+ port = LOWPORT + port % (STARTPORT - LOWPORT);
+ goto again;
+ }
return (res);
}
#else

View File

@ -1,35 +0,0 @@
commit 3cf1a3ce1a409e647f9b8ca4497c26e6d066f293
Author: Steve Dickson <steved@redhat.com>
Date: Thu Jan 24 15:01:22 2008 -0500
Protect from buffer overflow in the GSS code.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff -up libtirpc-0.1.7/src/svc_auth_gss.c.orig libtirpc-0.1.7/src/svc_auth_gss.c
--- libtirpc-0.1.7/src/svc_auth_gss.c.orig 2008-01-24 14:41:21.000000000 -0500
+++ libtirpc-0.1.7/src/svc_auth_gss.c 2008-01-24 14:59:31.000000000 -0500
@@ -294,6 +294,15 @@ svcauth_gss_validate(struct svc_rpc_gss_
memset(rpchdr, 0, sizeof(rpchdr));
/* XXX - Reconstruct RPC header for signing (from xdr_callmsg). */
+ oa = &msg->rm_call.cb_cred;
+ if (oa->oa_length > MAX_AUTH_BYTES)
+ return (FALSE);
+
+ /* 8 XDR units from the IXDR macro calls. */
+ if (sizeof(rpchdr) < (8 * BYTES_PER_XDR_UNIT +
+ RNDUP(oa->oa_length)))
+ return (FALSE);
+
buf = (int32_t *)rpchdr;
IXDR_PUT_LONG(buf, msg->rm_xid);
IXDR_PUT_ENUM(buf, msg->rm_direction);
@@ -301,7 +310,6 @@ svcauth_gss_validate(struct svc_rpc_gss_
IXDR_PUT_LONG(buf, msg->rm_call.cb_prog);
IXDR_PUT_LONG(buf, msg->rm_call.cb_vers);
IXDR_PUT_LONG(buf, msg->rm_call.cb_proc);
- oa = &msg->rm_call.cb_cred;
IXDR_PUT_ENUM(buf, oa->oa_flavor);
IXDR_PUT_LONG(buf, oa->oa_length);
if (oa->oa_length) {

View File

@ -1,39 +0,0 @@
commit 419d35db75ab8bd8f79c424f529a6c2f7c4f5fa7
Author: Steve Dickson <steved@redhat.com>
Date: Fri May 4 09:27:00 2007 -0400
Fixed mutex locking problem in clnt_raw.c. One should grab the
clntraw_lock before accessing at clntraw_private, not after.
Signed-off-by: Steve Dickson <steved@redhat.com>
Index: libtirpc-0.1.7/src/clnt_raw.c
===================================================================
--- libtirpc-0.1.7.orig/src/clnt_raw.c
+++ libtirpc-0.1.7/src/clnt_raw.c
@@ -82,12 +82,13 @@ clnt_raw_create(prog, vers)
rpcprog_t prog;
rpcvers_t vers;
{
- struct clntraw_private *clp = clntraw_private;
+ struct clntraw_private *clp;
struct rpc_msg call_msg;
- XDR *xdrs = &clp->xdr_stream;
- CLIENT *client = &clp->client_object;
+ XDR *xdrs;
+ CLIENT *client;
mutex_lock(&clntraw_lock);
+ clp = clntraw_private;
if (clp == NULL) {
clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
if (clp == NULL) {
@@ -100,6 +101,8 @@ clnt_raw_create(prog, vers)
clp->_raw_buf = __rpc_rawcombuf;
clntraw_private = clp;
}
+ xdrs = &clp->xdr_stream;
+ client = &clp->client_object;
/*
* pre-serialize the static part of the call msg and stash it away
*/

View File

@ -1,98 +0,0 @@
commit 40ab0c28e995786d5844bd490a31b788ecabf546
Author: Steve Dickson <steved@redhat.com>
Date: Fri May 4 14:26:56 2007 -0400
Added IP_RECVERR processing with to clnt_dg_call() so
application will see errors instead of timing out
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/clnt_dg.c b/src/clnt_dg.c
index 151b449..0e35742 100644
--- a/src/clnt_dg.c
+++ b/src/clnt_dg.c
@@ -55,6 +55,13 @@
#include <err.h>
#include "rpc_com.h"
+#ifdef IP_RECVERR
+#include <asm/types.h>
+#include <linux/errqueue.h>
+#include <sys/uio.h>
+#endif
+
+
#define MAX_DEFAULT_FDS 20000
static struct clnt_ops *clnt_dg_ops(void);
@@ -246,6 +253,12 @@ clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz)
#if 0
(void)bindresvport_sa(fd, (struct sockaddr *)svcaddr->buf);
#endif
+#ifdef IP_RECVERR
+ {
+ int on = 1;
+ setsockopt(fd, SOL_IP, IP_RECVERR, &on, sizeof(on));
+ }
+#endif
ioctl(fd, FIONBIO, (char *)(void *)&one);
/*
* By default, closeit is always FALSE. It is users responsibility
@@ -352,7 +365,7 @@ call_again:
xid++;
*(u_int32_t *)(void *)(cu->cu_outbuf) = htonl(xid);
- if ((! XDR_PUTINT32(xdrs, &proc)) ||
+ if ((! XDR_PUTINT32(xdrs, (int32_t *)&proc)) ||
(! AUTH_MARSHALL(cl->cl_auth, xdrs)) ||
(! (*xargs)(xdrs, argsp))) {
cu->cu_error.re_status = RPC_CANTENCODEARGS;
@@ -404,6 +417,48 @@ get_reply:
}
break;
}
+#ifdef IP_RECVERR
+ if (fd.revents & POLLERR)
+ {
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+ struct sock_extended_err *e;
+ struct sockaddr_in err_addr;
+ struct sockaddr_in *sin = (struct sockaddr_in *)&cu->cu_raddr;
+ struct iovec iov;
+ char *cbuf = (char *) alloca (outlen + 256);
+ int ret;
+
+ iov.iov_base = cbuf + 256;
+ iov.iov_len = outlen;
+ msg.msg_name = (void *) &err_addr;
+ msg.msg_namelen = sizeof (err_addr);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_flags = 0;
+ msg.msg_control = cbuf;
+ msg.msg_controllen = 256;
+ ret = recvmsg (cu->cu_fd, &msg, MSG_ERRQUEUE);
+ if (ret >= 0
+ && memcmp (cbuf + 256, cu->cu_outbuf, ret) == 0
+ && (msg.msg_flags & MSG_ERRQUEUE)
+ && ((msg.msg_namelen == 0
+ && ret >= 12)
+ || (msg.msg_namelen == sizeof (err_addr)
+ && err_addr.sin_family == AF_INET
+ && memcmp (&err_addr.sin_addr, &sin->sin_addr,
+ sizeof (err_addr.sin_addr)) == 0
+ && err_addr.sin_port == sin->sin_port)))
+ for (cmsg = CMSG_FIRSTHDR (&msg); cmsg;
+ cmsg = CMSG_NXTHDR (&msg, cmsg))
+ if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
+ {
+ e = (struct sock_extended_err *) CMSG_DATA(cmsg);
+ cu->cu_error.re_errno = e->ee_errno;
+ return (cu->cu_error.re_status = RPC_CANTRECV);
+ }
+ }
+#endif
/* We have some data now */
do {

View File

@ -1,28 +0,0 @@
diff -up libtirpc-0.1.7/configure.in.orig libtirpc-0.1.7/configure.in
--- libtirpc-0.1.7/configure.in.orig 2007-10-17 12:03:25.000000000 -0400
+++ libtirpc-0.1.7/configure.in 2007-10-17 12:07:18.000000000 -0400
@@ -10,6 +10,10 @@ AC_ARG_ENABLE(gss,[ --enable-gss
*) AC_MSG_ERROR(bad value ${enableval} for --enable-gss) ;;
esac],[gss=false])
AM_CONDITIONAL(GSS, test x$gss = xtrue)
+if test x$gss = xtrue; then
+ PKG_CHECK_MODULES(GSSGLUE, libgssglue, [],
+ AC_MSG_ERROR([Unable to locate information required to use libgssglue.]))
+fi
AC_PROG_CC
diff -up libtirpc-0.1.7/src/Makefile.am.orig libtirpc-0.1.7/src/Makefile.am
--- libtirpc-0.1.7/src/Makefile.am.orig 2007-10-17 12:03:25.000000000 -0400
+++ libtirpc-0.1.7/src/Makefile.am 2007-10-17 12:06:19.000000000 -0400
@@ -29,8 +29,8 @@ libtirpc_la_SOURCES += xdr.c xdr_rec.c x
## Secure-RPC
if GSS
libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c
- libtirpc_la_LDFLAGS += -lgssapi
- libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS
+ libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
+ libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS -I/usr/include/gssglue $(GSSGLUE_LIBS)
endif
## libtirpc_a_SOURCES += key_call.c key_prot_xdr.c getpublickey.c

View File

@ -1,51 +0,0 @@
commit 4d77b479511a27fb52b54811020176bb32099444
Author: Steve Dickson <steved@redhat.com>
Date: Mon Feb 18 17:30:46 2008 -0500
Added that libtirpc.pc.in that will create
the /usr/lib/pkgconfig/libtirpc.pc file that is
used by the pkg-config(1) command
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/Makefile.am b/Makefile.am
index 1a212e8..4e1503c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,6 +43,9 @@ nobase_include_HEADERS = tirpc/un-namespace.h \
tirpc/rpc/auth_gss.h \
tirpc/rpc/auth_des.h
+pkgconfigdir=$(libdir)/pkgconfig
+pkgconfig_DATA = libtirpc.pc
+
install-exec-local:
cp -p ./doc/etc_netconfig /etc/netconfig
chmod 0644 /etc/netconfig
diff --git a/configure.in b/configure.in
index dc597dd..e907c31 100644
--- a/configure.in
+++ b/configure.in
@@ -27,4 +27,4 @@ AC_CHECK_LIB([pthread], [pthread_create])
AC_CONFIG_FILES([Makefile src/Makefile])
-AC_OUTPUT()
+AC_OUTPUT(libtirpc.pc)
diff --git a/libtirpc.pc.in b/libtirpc.pc.in
new file mode 100644
index 0000000..df9e7ed
--- /dev/null
+++ b/libtirpc.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libtirpc
+Description: Transport Independent RPC Library
+Requires:
+Version: @PACKAGE_VERSION@
+Libs: -L@libdir@ -ltirpc
+Cflags: -I@includedir@/tirpc

View File

@ -1,35 +0,0 @@
Index: libtirpc-0.1.7/man/Makefile.am
===================================================================
--- /dev/null
+++ libtirpc-0.1.7/man/Makefile.am
@@ -0,0 +1,9 @@
+
+man5_MANS = netconfig.5
+man3_MANS = bindresvport.3t des_crypt.3t getnetconfig.3t getnetpath.3t \
+ getrpcent.3t getrpcport.3t rpc.3t rpc_clnt_auth.3t rpc_clnt_calls.3t \
+ rpc_clnt_create.3t rpc_secure.3t rpc_soc.3t rpc_svc_calls.3t \
+ rpc_svc_create.3t rpc_svc_err.3t rpc_svc_reg.3t rpc_xdr.3t rtime.3t
+
+EXTRA_DIST = $(man5_MANS) $(man3_MANS)
+
Index: libtirpc-0.1.7/configure.in
===================================================================
--- libtirpc-0.1.7.orig/configure.in
+++ libtirpc-0.1.7/configure.in
@@ -26,5 +26,5 @@ AC_CHECK_HEADERS([arpa/inet.h fcntl.h li
AC_CHECK_LIB([pthread], [pthread_create])
-AC_CONFIG_FILES([Makefile src/Makefile])
+AC_CONFIG_FILES([Makefile src/Makefile man/Makefile])
AC_OUTPUT(libtirpc.pc)
Index: libtirpc-0.1.7/Makefile.am
===================================================================
--- libtirpc-0.1.7.orig/Makefile.am
+++ libtirpc-0.1.7/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = src
+SUBDIRS = src man
nobase_include_HEADERS = tirpc/un-namespace.h \
tirpc/spinlock.h \

View File

@ -1,15 +0,0 @@
--- libtirpc-0.1.7/doc/etc_netconfig.orig 2005-05-18 01:10:50.000000000 -0400
+++ libtirpc-0.1.7/doc/etc_netconfig 2007-07-24 09:45:40.000000000 -0400
@@ -10,10 +10,10 @@
# The <device> and <nametoaddr_libs> fields are always empty in this
# implementation.
#
-#udp6 tpi_clts v inet6 udp - -
-#tcp6 tpi_cots_ord v inet6 tcp - -
udp tpi_clts v inet udp - -
tcp tpi_cots_ord v inet tcp - -
+udp6 tpi_clts - inet6 udp6 - -
+tcp6 tpi_cots_ord - inet6 tcp6 - -
rawip tpi_raw - inet - - -
local tpi_cots_ord - loopback - - -
unix tpi_cots_ord - loopback - - -

View File

@ -1,12 +0,0 @@
--- libtirpc-0.1.7/src/xdr_float.c.orig 2005-05-18 01:10:50.000000000 -0400
+++ libtirpc-0.1.7/src/xdr_float.c 2006-08-16 08:41:43.000000000 -0400
@@ -58,7 +58,8 @@
#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
defined(__arm32__) || defined(__ppc__) || defined(__ia64__) || \
- defined(__arm26__) || defined(__sparc64__) || defined(__amd64__)
+ defined(__arm26__) || defined(__sparc64__) || defined(__amd64__) || \
+ defined(__powerpc__) || defined(__s390__)
#include <bits/endian.h>
#define IEEEFP
#endif

View File

@ -1,150 +0,0 @@
commit a3a3a4e5157932c254200e3b31a78739f5878071
Author: Steve Dickson <steved@redhat.com>
Date: Fri May 4 11:27:43 2007 -0400
Ignore the return value of snprintf() and use strlen() instead
to bump the pointer in clnt_sperror()
Also removed calls to assert(), not needed.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/clnt_perror.c b/src/clnt_perror.c
index e46d95f..8f53f8e 100644
--- a/src/clnt_perror.c
+++ b/src/clnt_perror.c
@@ -36,7 +36,6 @@
* Copyright (C) 1984, Sun Microsystems, Inc.
*
*/
-#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -75,8 +74,8 @@ clnt_sperror(rpch, s)
char *strstart;
size_t len, i;
- assert(rpch != NULL);
- assert(s != NULL);
+ if (rpch == NULL || s == NULL)
+ return(0);
str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
if (str == 0)
@@ -85,7 +84,8 @@ clnt_sperror(rpch, s)
strstart = str;
CLNT_GETERR(rpch, &e);
- if ((i = snprintf(str, len, "%s: ", s)) > 0) {
+ if (snprintf(str, len, "%s: ", s) > 0) {
+ i = strlen(str);
str += i;
len -= i;
}
@@ -113,7 +113,8 @@ clnt_sperror(rpch, s)
case RPC_CANTSEND:
case RPC_CANTRECV:
- i = snprintf(str, len, "; errno = %s", strerror(e.re_errno));
+ snprintf(str, len, "; errno = %s", strerror(e.re_errno));
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
@@ -121,8 +122,9 @@ clnt_sperror(rpch, s)
break;
case RPC_VERSMISMATCH:
- i = snprintf(str, len, "; low version = %u, high version = %u",
+ snprintf(str, len, "; low version = %u, high version = %u",
e.re_vers.low, e.re_vers.high);
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
@@ -131,18 +133,20 @@ clnt_sperror(rpch, s)
case RPC_AUTHERROR:
err = auth_errmsg(e.re_why);
- i = snprintf(str, len, "; why = ");
+ snprintf(str, len, "; why = ");
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
}
if (err != NULL) {
- i = snprintf(str, len, "%s",err);
+ snprintf(str, len, "%s",err);
} else {
- i = snprintf(str, len,
+ snprintf(str, len,
"(unknown authentication error - %d)",
(int) e.re_why);
}
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
@@ -150,8 +154,9 @@ clnt_sperror(rpch, s)
break;
case RPC_PROGVERSMISMATCH:
- i = snprintf(str, len, "; low version = %u, high version = %u",
+ snprintf(str, len, "; low version = %u, high version = %u",
e.re_vers.low, e.re_vers.high);
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
@@ -159,8 +164,9 @@ clnt_sperror(rpch, s)
break;
default: /* unknown */
- i = snprintf(str, len, "; s1 = %u, s2 = %u",
+ snprintf(str, len, "; s1 = %u, s2 = %u",
e.re_lb.s1, e.re_lb.s2);
+ i = strlen(str);
if (i > 0) {
str += i;
len -= i;
@@ -177,8 +183,8 @@ clnt_perror(rpch, s)
const char *s;
{
- assert(rpch != NULL);
- assert(s != NULL);
+ if (rpch == NULL || s == NULL)
+ return;
(void) fprintf(stderr, "%s\n", clnt_sperror(rpch,s));
}
@@ -236,13 +242,15 @@ clnt_spcreateerror(s)
char *str;
size_t len, i;
- assert(s != NULL);
+ if (s == NULL)
+ return(0);
str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
if (str == 0)
return(0);
len = CLNT_PERROR_BUFLEN;
- i = snprintf(str, len, "%s: ", s);
+ snprintf(str, len, "%s: ", s);
+ i = strlen(str);
if (i > 0)
len -= i;
(void)strncat(str, clnt_sperrno(rpc_createerr.cf_stat), len - 1);
@@ -287,7 +295,8 @@ clnt_pcreateerror(s)
const char *s;
{
- assert(s != NULL);
+ if (s == NULL)
+ return;
(void) fprintf(stderr, "%s\n", clnt_spcreateerror(s));
}

View File

@ -1,52 +0,0 @@
commit f8ff8f0de33606ff544dc87c0a9993fd3a0f5475
Author: Steve Dickson <steved@redhat.com>
Date: Mon Jul 30 07:26:45 2007 -0400
- Make sure remote address (xp_rtaddr) is populated
with the correct type of address.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/svc_vc.c b/src/svc_vc.c
index 48494e1..3d77aef 100644
--- a/src/svc_vc.c
+++ b/src/svc_vc.c
@@ -239,7 +239,10 @@ svc_fd_create(fd, sendsize, recvsize)
warnx("svc_fd_create: no mem for local addr");
goto freedata;
}
- memcpy(ret->xp_rtaddr.buf, &sin6, (size_t)sizeof(ss));
+ if (ss.ss_family == AF_INET)
+ memcpy(ret->xp_rtaddr.buf, &ss, (size_t)sizeof(ss));
+ else
+ memcpy(ret->xp_rtaddr.buf, &sin6, (size_t)sizeof(ss));
#ifdef PORTMAP
if (sin6.sin6_family == AF_INET6 || sin6.sin6_family == AF_LOCAL) {
memcpy(&ret->xp_raddr, ret->xp_rtaddr.buf,
@@ -343,20 +346,23 @@ again:
newxprt = makefd_xprt(sock, r->sendsize, r->recvsize);
if (addr.ss_family == AF_INET) {
map_ipv4_to_ipv6((struct sockaddr_in *)&addr, &sin6);
- len = sizeof(struct sockaddr_in6);
} else {
memcpy(&sin6, &addr, len);
}
newxprt->xp_rtaddr.buf = mem_alloc(len);
if (newxprt->xp_rtaddr.buf == NULL)
return (FALSE);
- memcpy(newxprt->xp_rtaddr.buf, &sin6, len);
+
+ if (addr.ss_family == AF_INET)
+ memcpy(newxprt->xp_rtaddr.buf, &addr, len);
+ else
+ memcpy(newxprt->xp_rtaddr.buf, &sin6, len);
newxprt->xp_rtaddr.maxlen = newxprt->xp_rtaddr.len = len;
#ifdef PORTMAP
if (sin6.sin6_family == AF_INET6 || sin6.sin6_family == AF_LOCAL) {
memcpy(&newxprt->xp_raddr, newxprt->xp_rtaddr.buf,
sizeof(struct sockaddr_in6));
- newxprt->xp_addrlen = len;
+ newxprt->xp_addrlen = sizeof(struct sockaddr_in6);
}
#endif /* PORTMAP */
if (__rpc_fd2sockinfo(sock, &si) && si.si_proto == IPPROTO_TCP) {

View File

@ -1,19 +0,0 @@
--- libtirpc-0.1.7/src/svc_run.c.orig 2005-05-18 01:10:50.000000000 -0400
+++ libtirpc-0.1.7/src/svc_run.c 2007-07-09 12:52:23.000000000 -0400
@@ -51,14 +51,14 @@ svc_run()
struct timeval timeout;
extern rwlock_t svc_fd_lock;
- timeout.tv_sec = 30;
- timeout.tv_usec = 0;
for (;;) {
rwlock_rdlock(&svc_fd_lock);
readfds = svc_fdset;
cleanfds = svc_fdset;
rwlock_unlock(&svc_fd_lock);
+ timeout.tv_sec = 30;
+ timeout.tv_usec = 0;
switch (select(svc_maxfd+1, &readfds, NULL, NULL, &timeout)) {
case -1:
FD_ZERO(&readfds);

View File

@ -1,13 +0,0 @@
Index: libtirpc-0.1.7/src/svc_auth_gss.c
===================================================================
--- libtirpc-0.1.7.orig/src/svc_auth_gss.c
+++ libtirpc-0.1.7/src/svc_auth_gss.c
@@ -390,7 +390,7 @@ _svcauth_gss(struct svc_req *rqst, struc
return (AUTH_FAILED);
}
auth->svc_ah_ops = &svc_auth_gss_ops;
- SVCAUTH_PRIVATE(auth) = gd;
+ auth->svc_ah_private = gd;
rqst->rq_xprt->xp_auth = auth;
}
else gd = SVCAUTH_PRIVATE(rqst->rq_xprt->xp_auth);

View File

@ -1,12 +0,0 @@
--- libtirpc-0.1.7/tirpc/rpc/svc_auth.h.orig 2005-05-18 01:10:51.000000000 -0400
+++ libtirpc-0.1.7/tirpc/rpc/svc_auth.h 2006-08-28 08:13:37.801283000 -0400
@@ -54,6 +54,9 @@
caddr_t svc_ah_private;
} SVCAUTH;
+#define SVCAUTH_DESTROY(cred) ((*(cred)->svc_ah_ops->svc_ah_destroy)())
+#define svcauth_destroy(cred) ((*(cred)->svc_ah_ops->svc_ah_destroy)())
+
/*
* Server side authenticator
*/

View File

@ -1,101 +0,0 @@
Index: libtirpc-0.1.7/src/svc_auth_none.c
===================================================================
--- /dev/null
+++ libtirpc-0.1.7/src/svc_auth_none.c
@@ -0,0 +1,73 @@
+/*
+ svc_auth_none.c
+
+ Copyright (c) 2000 The Regents of the University of Michigan.
+ All rights reserved.
+
+ Copyright (c) 2000 Dug Song <dugsong@UMICH.EDU>.
+ All rights reserved, all wrongs reversed.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. 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.
+ 3. Neither the name of the University 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 ``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 REGENTS 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.
+
+ $Id: svc_auth_none.c,v 1.1 2004/10/22 17:24:30 bfields Exp $
+ */
+
+#include <rpc/rpc.h>
+
+static bool_t svcauth_none_destroy();
+static bool_t svcauth_none_wrap();
+
+struct svc_auth_ops svc_auth_none_ops = {
+ svcauth_none_wrap,
+ svcauth_none_wrap,
+ svcauth_none_destroy
+};
+
+SVCAUTH svc_auth_none = {
+ &svc_auth_none_ops,
+ NULL,
+};
+
+static bool_t
+svcauth_none_destroy(SVCAUTH *auth)
+{
+ return (TRUE);
+}
+
+static bool_t
+svcauth_none_wrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func,
+ caddr_t xdr_ptr)
+{
+ return ((*xdr_func)(xdrs, xdr_ptr));
+}
+
+enum auth_stat
+_svcauth_none(struct svc_req *rqst, struct rpc_msg *msg)
+{
+ rqst->rq_xprt->xp_auth = &svc_auth_none;
+
+ return (AUTH_OK);
+}
Index: libtirpc-0.1.7/src/Makefile.am
===================================================================
--- libtirpc-0.1.7.orig/src/Makefile.am
+++ libtirpc-0.1.7/src/Makefile.am
@@ -28,7 +28,8 @@ libtirpc_la_SOURCES += xdr.c xdr_rec.c x
## Secure-RPC
if GSS
- libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c
+ libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c \
+ svc_auth_none.c
libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS -I/usr/include/gssglue $(GSSGLUE_LIBS)
endif
@@ -49,7 +50,7 @@ $(libtirpc_la_OBJECTS) :auth_none.c auth
svc_raw.c svc_run.c svc_simple.c svc_vc.c \
xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c \
auth_gss.c authgss_prot.c svc_auth_gss.c getpeereid.c \
- auth_time.c auth_des.c authdes_prot.c
+ auth_time.c auth_des.c authdes_prot.c svc_auth_none.c
else
$(libtirpc_la_OBJECTS) :auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \

View File

@ -1,13 +1,13 @@
Index: libtirpc-0.1.7/Makefile.am
Index: libtirpc-0.1.9/Makefile.am
===================================================================
--- libtirpc-0.1.7.orig/Makefile.am
+++ libtirpc-0.1.7/Makefile.am
@@ -44,5 +44,6 @@ nobase_include_HEADERS = tirpc/un-namesp
tirpc/rpc/auth_des.h
--- libtirpc-0.1.9.orig/Makefile.am 2008-07-09 20:13:20.000000000 +0200
+++ libtirpc-0.1.9/Makefile.am 2008-09-02 13:40:24.000000000 +0200
@@ -47,5 +47,6 @@ pkgconfigdir=$(libdir)/pkgconfig
pkgconfig_DATA = libtirpc.pc
install-exec-local:
- cp -p ./doc/etc_netconfig /etc/netconfig
- chmod 0644 /etc/netconfig
- cp -p ./doc/etc_netconfig $(DESTDIR)/etc/netconfig
- chmod 0644 $(DESTDIR)/etc/netconfig
+ mkdir -p $(DESTDIR)$(sysconfdir)
+ cp -p ./doc/etc_netconfig $(DESTDIR)$(sysconfdir)/netconfig
+ chmod 0644 $(DESTDIR)$(sysconfdir)/netconfig

View File

@ -1,26 +0,0 @@
Index: libtirpc-0.1.7/configure.in
===================================================================
--- libtirpc-0.1.7.orig/configure.in
+++ libtirpc-0.1.7/configure.in
@@ -1,6 +1,6 @@
-AC_INIT(libtirpc, 0.1.5)
-AM_INIT_AUTOMAKE(libtirpc, 0.1.5)
+AC_INIT(libtirpc, 0.1.7)
+AM_INIT_AUTOMAKE(libtirpc, 0.1.7)
AM_MAINTAINER_MODE
AC_CONFIG_SRCDIR([src/auth_des.c])
Index: libtirpc-0.1.7/src/Makefile.am
===================================================================
--- libtirpc-0.1.7.orig/src/Makefile.am
+++ libtirpc-0.1.7/src/Makefile.am
@@ -11,7 +11,7 @@ INCLUDES = -I../tirpc -DPORTMAP -DINET6
lib_LTLIBRARIES = libtirpc.la
-libtirpc_la_LDFLAGS = -lnsl -lpthread
+libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:7:0
libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \

View File

@ -1,45 +0,0 @@
commit 30431c6d846eab1bc6b7a3a91a7894f3acf2680f
Author: Steve Dickson <steved@redhat.com>
Date: Thu Apr 26 14:42:16 2007 -0400
Check for buffer overflow in xdr_string.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/src/xdr.c b/src/xdr.c
index 764c30f..292723b 100644
--- a/src/xdr.c
+++ b/src/xdr.c
@@ -669,6 +669,8 @@ xdr_string(xdrs, cpp, maxsize)
}
/* FALLTHROUGH */
case XDR_ENCODE:
+ if (sp == NULL)
+ return FALSE;
size = strlen(sp);
break;
case XDR_DECODE:
@@ -681,6 +683,13 @@ xdr_string(xdrs, cpp, maxsize)
return (FALSE);
}
nodesize = size + 1;
+ if (nodesize == 0) {
+ /* This means an overflow. It a bug in the caller which
+ * provided a too large maxsize but nevertheless catch it
+ * here.
+ */
+ return FALSE;
+ }
/*
* now deal with the actual bytes
@@ -688,9 +697,6 @@ xdr_string(xdrs, cpp, maxsize)
switch (xdrs->x_op) {
case XDR_DECODE:
- if (nodesize == 0) {
- return (TRUE);
- }
if (sp == NULL)
*cpp = sp = mem_alloc(nodesize);
if (sp == NULL) {

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c66778f179fd5883d2cf8172c6aa730edacb2c1e4fc30ed4db165aed82d4c984
size 450332

View File

@ -0,0 +1,23 @@
From: Olaf Kirch <okir@suse.de>
Subject: Fix incorrect sizeof() in __rpc_getbroadifs
__rpc_getbroadifs returns bad broadcast addresses on 32bit
machines because when copying the broadcast addresses, ite
applies the sizeof() operator to a pointer to a sockaddr,
rather than the sockaddr itself.
Signed-off-by: Olaf Kirch <okir@suse.de>
Index: libtirpc-0.1.7/src/clnt_bcast.c
===================================================================
--- libtirpc-0.1.7.orig/src/clnt_bcast.c
+++ libtirpc-0.1.7/src/clnt_bcast.c
@@ -163,7 +163,7 @@ __rpc_getbroadifs(int af, int proto, int
/* memcpy(&bip->broadaddr, ifap->ifa_broadaddr,
(size_t)ifap->ifa_broadaddr->sa_len);*/
memcpy(&bip->broadaddr, ifap->ifa_broadaddr,
- (size_t)sizeof(ifap->ifa_broadaddr));
+ sizeof(bip->broadaddr));
sin = (struct sockaddr_in *)(void *)&bip->broadaddr;
sin->sin_port =
((struct sockaddr_in *)

View File

@ -0,0 +1,56 @@
From: Olaf Kirch <okir@suse.de>
Subject: Always make IPv6 sockets V6ONLY
Assume you have a netconfig file looking like this:
udp tpi_clts v inet udp - -
udp6 tpi_clts v inet6 udp - -
...
a call to svc_tli_create(... &someaddr, "udp") will fail to create an
IPv6 server socket. The problem is that on Linux, passive IPv6 sockets
will also accept packets/connections from IPv4, and will simply map
the sender's address to an IPv6 mapped IPv4 address. So if you want to
bind both a UDPv4 and UDPv6 socket to the same port, this will fail with
EADDRINUSE.
The way to avoid this behavior is to change the socket to V6ONLY,
which tells the kernel to avoid the autmatic mapping.
The change proposed in the patch below does this. I *think* this is
a good place to do this, as it will also fix applications that do not
use svc_tli_create() - such as rpcbind, which creates the sockets on
its own using __rpc_nconf2fd.
I think this also improves portability, as BSD code assumes BSD
behavior, where this mapping does not occur either.
Signed-off-by: okir@suse.de
---
src/rpc_generic.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
Index: libtirpc/src/rpc_generic.c
===================================================================
--- libtirpc.orig/src/rpc_generic.c
+++ libtirpc/src/rpc_generic.c
@@ -525,11 +525,18 @@ int
__rpc_nconf2fd(const struct netconfig *nconf)
{
struct __rpc_sockinfo si;
+ int fd;
if (!__rpc_nconf2sockinfo(nconf, &si))
return 0;
- return socket(si.si_af, si.si_socktype, si.si_proto);
+ if ((fd = socket(si.si_af, si.si_socktype, si.si_proto)) >= 0 &&
+ si.si_af == AF_INET6) {
+ int val = 1;
+
+ setsockopt(fd, SOL_IPV6, IPV6_V6ONLY, &val, sizeof(val));
+ }
+ return fd;
}
int

View File

@ -0,0 +1,13 @@
Index: libtirpc-0.1.9/src/Makefile.am
===================================================================
--- libtirpc-0.1.9.orig/src/Makefile.am 2008-07-09 20:13:20.000000000 +0200
+++ libtirpc-0.1.9/src/Makefile.am 2008-09-02 19:24:32.000000000 +0200
@@ -11,7 +11,7 @@ INCLUDES = -I../tirpc -DPORTMAP -DINET6
lib_LTLIBRARIES = libtirpc.la
-libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:8:0
+libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:9:0
libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \

3
libtirpc-0.1.9.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8a8deae8e62dc75e1eb4f2ae01c1f047823040b3c196c639b6e0d795be3d1552
size 411219

View File

@ -1,3 +1,31 @@
-------------------------------------------------------------------
Tue Sep 2 18:49:16 CEST 2008 - mkoenig@suse.de
- update to version 0.1.9
* several bugfixes
- fix rpc_broadcast [bnc#421950]
- fix ipv4+ipv6 binding [bnc#421976]
- removed patches
libtirpc-0.1.7-arm.patch
libtirpc-0.1.7-bindresvport-ntohs.patch
libtirpc-0.1.7-bindresvport_ports.patch
libtirpc-0.1.7-bufoverflow.patch
libtirpc-0.1.7-clnt_raw-mutex.patch
libtirpc-0.1.7-dgcall-iprecverr.patch
libtirpc-0.1.7-gssglue.patch
libtirpc-0.1.7-libtirpc-pc.patch
libtirpc-0.1.7-man-install.patch
libtirpc-0.1.7-netconfig.patch
libtirpc-0.1.7-ppc64.patch
libtirpc-0.1.7-snprintf.patch
libtirpc-0.1.7-svcauthdestroy.patch
libtirpc-0.1.7-svc_auth_gss_lvalue_fix.patch
libtirpc-0.1.7-svcauthnone.patch
libtirpc-0.1.7-svc-rtaddr.patch
libtirpc-0.1.7-svc-run.patch
libtirpc-0.1.7-version.patch
libtirpc-0.1.7-xdr_bufferoverlow.patch
-------------------------------------------------------------------
Fri Aug 1 17:32:28 CEST 2008 - ro@suse.de

View File

@ -1,10 +1,17 @@
#
# spec file for package libtirpc (Version 0.1.7)
# spec file for package libtirpc (Version 0.1.9)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
@ -16,33 +23,16 @@ Name: libtirpc
License: Other uncritical OpenSource License; Sun Industry Standards Source License 1.0
Group: System/Libraries
AutoReqProv: on
Version: 0.1.7
Release: 4
Version: 0.1.9
Release: 1
Summary: Transport Independent RPC Library
Url: http://nfsv4.bullopensource.org/doc/tirpc_rpcbind.php
Source: %{name}-%{version}.tar.bz2
Patch1: libtirpc-0.1.7-netconfig.patch
Patch2: libtirpc-0.1.7-gssglue.patch
Patch3: libtirpc-0.1.7-svcauthnone.patch
Patch4: libtirpc-0.1.7-ppc64.patch
Patch5: libtirpc-0.1.7-svcauthdestroy.patch
Patch6: libtirpc-0.1.7-xdr_bufferoverlow.patch
Patch7: libtirpc-0.1.7-bindresvport_ports.patch
Patch8: libtirpc-0.1.7-svc-run.patch
Patch9: libtirpc-0.1.7-clnt_raw-mutex.patch
Patch10: libtirpc-0.1.7-snprintf.patch
Patch11: libtirpc-0.1.7-bindresvport-ntohs.patch
Patch12: libtirpc-0.1.7-dgcall-iprecverr.patch
Patch13: libtirpc-0.1.7-svc-rtaddr.patch
Patch14: libtirpc-0.1.7-arm.patch
Patch15: libtirpc-0.1.7-bufoverflow.patch
Patch16: libtirpc-0.1.7-libtirpc-pc.patch
Patch17: libtirpc-0.1.7-man-install.patch
#
Patch20: libtirpc-0.1.7-use_sysconfdir.patch
Patch21: libtirpc-0.1.7-overflow_fix.patch
Patch22: libtirpc-0.1.7-version.patch
Patch23: libtirpc-0.1.7-svc_auth_gss_lvalue_fix.patch
Patch24: libtirpc-0.1.9-fix_broadcast.patch
Patch25: libtirpc-0.1.9-ipv6_sockets_v6only.patch
Patch26: libtirpc-0.1.9-lib_version.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%define debug_package_requires libtirpc1 = %{version}
@ -80,7 +70,7 @@ Authors:
%package devel
License: Other uncritical OpenSource License; Sun Industry Standards Source License 1.0
Summary: Transport Independent RPC Library
Group: System/Libraries
Group: Development/Libraries/C and C++
Requires: libtirpc1 = %{version}
%description devel
@ -98,30 +88,11 @@ Authors:
%prep
%setup
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
pushd man
for f in *.3; do mv $f ${f}t; done
popd
%patch24 -p1
%patch25 -p1
%patch26 -p1
%build
autoreconf -fi
@ -154,8 +125,8 @@ rm -rf $RPM_BUILD_ROOT
%files -n libtirpc1
%defattr(-,root,root)
%config %{_sysconfdir}/netconfig
/%{_lib}/libtirpc.so.1*
%{_sysconfdir}/netconfig
%{_mandir}/man5/netconfig.5.gz
%files devel
@ -167,6 +138,31 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man3/*
%changelog
* Tue Sep 02 2008 mkoenig@suse.de
- update to version 0.1.9
* several bugfixes
- fix rpc_broadcast [bnc#421950]
- fix ipv4+ipv6 binding [bnc#421976]
- removed patches
libtirpc-0.1.7-arm.patch
libtirpc-0.1.7-bindresvport-ntohs.patch
libtirpc-0.1.7-bindresvport_ports.patch
libtirpc-0.1.7-bufoverflow.patch
libtirpc-0.1.7-clnt_raw-mutex.patch
libtirpc-0.1.7-dgcall-iprecverr.patch
libtirpc-0.1.7-gssglue.patch
libtirpc-0.1.7-libtirpc-pc.patch
libtirpc-0.1.7-man-install.patch
libtirpc-0.1.7-netconfig.patch
libtirpc-0.1.7-ppc64.patch
libtirpc-0.1.7-snprintf.patch
libtirpc-0.1.7-svcauthdestroy.patch
libtirpc-0.1.7-svc_auth_gss_lvalue_fix.patch
libtirpc-0.1.7-svcauthnone.patch
libtirpc-0.1.7-svc-rtaddr.patch
libtirpc-0.1.7-svc-run.patch
libtirpc-0.1.7-version.patch
libtirpc-0.1.7-xdr_bufferoverlow.patch
* Fri Aug 01 2008 ro@suse.de
- fix requires for debuginfo package
* Wed Mar 19 2008 mkoenig@suse.de