libtirpc package update
Signed-off-by: basebuilder_pel7ppc64bebuilder0 <basebuilder@powerel.org>master
parent
3b91a59589
commit
e9d9496881
|
@ -0,0 +1,251 @@
|
|||
diff -up libtirpc-0.2.4/src/rpcb_prot.c.orig libtirpc-0.2.4/src/rpcb_prot.c
|
||||
--- libtirpc-0.2.4/src/rpcb_prot.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/rpcb_prot.c 2017-05-17 13:05:47.562168877 -0400
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <rpc/types.h>
|
||||
#include <rpc/xdr.h>
|
||||
#include <rpc/rpcb_prot.h>
|
||||
+#include "rpc_com.h"
|
||||
|
||||
bool_t
|
||||
xdr_rpcb(xdrs, objp)
|
||||
@@ -53,13 +54,13 @@ xdr_rpcb(xdrs, objp)
|
||||
if (!xdr_u_int32_t(xdrs, &objp->r_vers)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_addr, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_addr, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_owner, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_owner, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
@@ -159,19 +160,19 @@ xdr_rpcb_entry(xdrs, objp)
|
||||
XDR *xdrs;
|
||||
rpcb_entry *objp;
|
||||
{
|
||||
- if (!xdr_string(xdrs, &objp->r_maddr, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_maddr, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_nc_netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_nc_netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (!xdr_u_int32_t(xdrs, &objp->r_nc_semantics)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_nc_protofmly, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_nc_protofmly, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->r_nc_proto, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->r_nc_proto, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
@@ -292,7 +293,7 @@ xdr_rpcb_rmtcallres(xdrs, p)
|
||||
bool_t dummy;
|
||||
struct r_rpcb_rmtcallres *objp = (struct r_rpcb_rmtcallres *)(void *)p;
|
||||
|
||||
- if (!xdr_string(xdrs, &objp->addr, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->addr, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (!xdr_u_int(xdrs, &objp->results.results_len)) {
|
||||
@@ -312,6 +313,11 @@ xdr_netbuf(xdrs, objp)
|
||||
if (!xdr_u_int32_t(xdrs, (u_int32_t *) &objp->maxlen)) {
|
||||
return (FALSE);
|
||||
}
|
||||
+
|
||||
+ if (objp->maxlen > RPC_MAXDATASIZE) {
|
||||
+ return (FALSE);
|
||||
+ }
|
||||
+
|
||||
dummy = xdr_bytes(xdrs, (char **)&(objp->buf),
|
||||
(u_int *)&(objp->len), objp->maxlen);
|
||||
return (dummy);
|
||||
diff -up libtirpc-0.2.4/src/rpcb_st_xdr.c.orig libtirpc-0.2.4/src/rpcb_st_xdr.c
|
||||
--- libtirpc-0.2.4/src/rpcb_st_xdr.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/rpcb_st_xdr.c 2017-05-17 13:05:47.562168877 -0400
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
+#include "rpc_com.h"
|
||||
|
||||
/* Link list of all the stats about getport and getaddr */
|
||||
|
||||
@@ -59,7 +60,7 @@ xdr_rpcbs_addrlist(xdrs, objp)
|
||||
if (!xdr_int(xdrs, &objp->failure)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
@@ -110,7 +111,7 @@ xdr_rpcbs_rmtcalllist(xdrs, objp)
|
||||
IXDR_PUT_INT32(buf, objp->failure);
|
||||
IXDR_PUT_INT32(buf, objp->indirect);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (!xdr_pointer(xdrs, (char **)&objp->next,
|
||||
@@ -148,7 +149,7 @@ xdr_rpcbs_rmtcalllist(xdrs, objp)
|
||||
objp->failure = (int)IXDR_GET_INT32(buf);
|
||||
objp->indirect = (int)IXDR_GET_INT32(buf);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (!xdr_pointer(xdrs, (char **)&objp->next,
|
||||
@@ -176,7 +177,7 @@ xdr_rpcbs_rmtcalllist(xdrs, objp)
|
||||
if (!xdr_int(xdrs, &objp->indirect)) {
|
||||
return (FALSE);
|
||||
}
|
||||
- if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
|
||||
+ if (!xdr_string(xdrs, &objp->netid, RPC_MAXDATASIZE)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (!xdr_pointer(xdrs, (char **)&objp->next,
|
||||
diff -up libtirpc-0.2.4/src/rpc_generic.c.orig libtirpc-0.2.4/src/rpc_generic.c
|
||||
--- libtirpc-0.2.4/src/rpc_generic.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/rpc_generic.c 2017-05-17 13:05:47.562168877 -0400
|
||||
@@ -615,6 +615,9 @@ __rpc_taddr2uaddr_af(int af, const struc
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
+ if (nbuf->len < sizeof(*sin)) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
sin = nbuf->buf;
|
||||
if (inet_ntop(af, &sin->sin_addr, namebuf, sizeof namebuf)
|
||||
== NULL)
|
||||
@@ -626,6 +629,9 @@ __rpc_taddr2uaddr_af(int af, const struc
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
+ if (nbuf->len < sizeof(*sin6)) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
sin6 = nbuf->buf;
|
||||
if (inet_ntop(af, &sin6->sin6_addr, namebuf6, sizeof namebuf6)
|
||||
== NULL)
|
||||
@@ -668,6 +674,8 @@ __rpc_uaddr2taddr_af(int af, const char
|
||||
|
||||
port = 0;
|
||||
sin = NULL;
|
||||
+ if (uaddr == NULL)
|
||||
+ return NULL;
|
||||
addrstr = strdup(uaddr);
|
||||
if (addrstr == NULL)
|
||||
return NULL;
|
||||
diff -up libtirpc-0.2.4/src/xdr.c.orig libtirpc-0.2.4/src/xdr.c
|
||||
--- libtirpc-0.2.4/src/xdr.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/xdr.c 2017-05-17 13:05:47.563168892 -0400
|
||||
@@ -43,8 +43,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
+#include <rpc/rpc.h>
|
||||
#include <rpc/types.h>
|
||||
#include <rpc/xdr.h>
|
||||
+#include <rpc/rpc_com.h>
|
||||
|
||||
typedef quad_t longlong_t; /* ANSI long long type */
|
||||
typedef u_quad_t u_longlong_t; /* ANSI unsigned long long type */
|
||||
@@ -54,7 +56,6 @@ typedef u_quad_t u_longlong_t;
|
||||
*/
|
||||
#define XDR_FALSE ((long) 0)
|
||||
#define XDR_TRUE ((long) 1)
|
||||
-#define LASTUNSIGNED ((u_int) 0-1)
|
||||
|
||||
/*
|
||||
* for unit alignment
|
||||
@@ -630,6 +631,7 @@ xdr_bytes(xdrs, cpp, sizep, maxsize)
|
||||
{
|
||||
char *sp = *cpp; /* sp is the actual string pointer */
|
||||
u_int nodesize;
|
||||
+ bool_t ret, allocated = FALSE;
|
||||
|
||||
/*
|
||||
* first deal with the length since xdr bytes are counted
|
||||
@@ -653,6 +655,7 @@ xdr_bytes(xdrs, cpp, sizep, maxsize)
|
||||
}
|
||||
if (sp == NULL) {
|
||||
*cpp = sp = mem_alloc(nodesize);
|
||||
+ allocated = TRUE;
|
||||
}
|
||||
if (sp == NULL) {
|
||||
warnx("xdr_bytes: out of memory");
|
||||
@@ -661,7 +664,14 @@ xdr_bytes(xdrs, cpp, sizep, maxsize)
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case XDR_ENCODE:
|
||||
- return (xdr_opaque(xdrs, sp, nodesize));
|
||||
+ ret = xdr_opaque(xdrs, sp, nodesize);
|
||||
+ if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
|
||||
+ if (allocated == TRUE) {
|
||||
+ free(sp);
|
||||
+ *cpp = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ return (ret);
|
||||
|
||||
case XDR_FREE:
|
||||
if (sp != NULL) {
|
||||
@@ -755,6 +765,7 @@ xdr_string(xdrs, cpp, maxsize)
|
||||
char *sp = *cpp; /* sp is the actual string pointer */
|
||||
u_int size;
|
||||
u_int nodesize;
|
||||
+ bool_t ret, allocated = FALSE;
|
||||
|
||||
/*
|
||||
* first deal with the length since xdr strings are counted-strings
|
||||
@@ -794,8 +805,10 @@ xdr_string(xdrs, cpp, maxsize)
|
||||
switch (xdrs->x_op) {
|
||||
|
||||
case XDR_DECODE:
|
||||
- if (sp == NULL)
|
||||
+ if (sp == NULL) {
|
||||
*cpp = sp = mem_alloc(nodesize);
|
||||
+ allocated = TRUE;
|
||||
+ }
|
||||
if (sp == NULL) {
|
||||
warnx("xdr_string: out of memory");
|
||||
return (FALSE);
|
||||
@@ -804,7 +817,14 @@ xdr_string(xdrs, cpp, maxsize)
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case XDR_ENCODE:
|
||||
- return (xdr_opaque(xdrs, sp, size));
|
||||
+ ret = xdr_opaque(xdrs, sp, size);
|
||||
+ if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
|
||||
+ if (allocated == TRUE) {
|
||||
+ free(sp);
|
||||
+ *cpp = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ return (ret);
|
||||
|
||||
case XDR_FREE:
|
||||
mem_free(sp, nodesize);
|
||||
@@ -824,7 +844,7 @@ xdr_wrapstring(xdrs, cpp)
|
||||
XDR *xdrs;
|
||||
char **cpp;
|
||||
{
|
||||
- return xdr_string(xdrs, cpp, LASTUNSIGNED);
|
||||
+ return xdr_string(xdrs, cpp, RPC_MAXDATASIZE);
|
||||
}
|
||||
|
||||
/*
|
|
@ -0,0 +1,67 @@
|
|||
diff --git a/src/clnt_vc.c b/src/clnt_vc.c
|
||||
index 61264d4..ebe28f8 100644
|
||||
--- a/src/clnt_vc.c
|
||||
+++ b/src/clnt_vc.c
|
||||
@@ -72,6 +72,8 @@
|
||||
#define CMGROUP_MAX 16
|
||||
#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
|
||||
|
||||
+#undef rpc_createerr /* make it clear it is a thread safe variable */
|
||||
+
|
||||
/*
|
||||
* Credentials structure, used to verify the identity of a peer
|
||||
* process that has sent us a message. This is allocated by the
|
||||
@@ -188,10 +190,11 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz)
|
||||
cl = (CLIENT *)mem_alloc(sizeof (*cl));
|
||||
ct = (struct ct_data *)mem_alloc(sizeof (*ct));
|
||||
if ((cl == (CLIENT *)NULL) || (ct == (struct ct_data *)NULL)) {
|
||||
+ struct rpc_createerr *ce = &get_rpc_createerr();
|
||||
+ ce->cf_stat = RPC_SYSTEMERROR;
|
||||
+ ce->cf_error.re_errno = errno;
|
||||
(void) syslog(LOG_ERR, clnt_vc_errstr,
|
||||
clnt_vc_str, __no_mem_str);
|
||||
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
|
||||
- rpc_createerr.cf_error.re_errno = errno;
|
||||
goto err;
|
||||
}
|
||||
ct->ct_addr.buf = NULL;
|
||||
@@ -230,26 +233,29 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz)
|
||||
assert(vc_cv != (cond_t *) NULL);
|
||||
|
||||
/*
|
||||
- * XXX - fvdl connecting while holding a mutex?
|
||||
+ * Do not hold mutex during connect
|
||||
*/
|
||||
+ mutex_unlock(&clnt_fd_lock);
|
||||
+
|
||||
slen = sizeof ss;
|
||||
if (getpeername(fd, (struct sockaddr *)&ss, &slen) < 0) {
|
||||
if (errno != ENOTCONN) {
|
||||
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
|
||||
- rpc_createerr.cf_error.re_errno = errno;
|
||||
- mutex_unlock(&clnt_fd_lock);
|
||||
+ struct rpc_createerr *ce = &get_rpc_createerr();
|
||||
+ ce->cf_stat = RPC_SYSTEMERROR;
|
||||
+ ce->cf_error.re_errno = errno;
|
||||
thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
|
||||
goto err;
|
||||
}
|
||||
if (connect(fd, (struct sockaddr *)raddr->buf, raddr->len) < 0){
|
||||
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
|
||||
- rpc_createerr.cf_error.re_errno = errno;
|
||||
- mutex_unlock(&clnt_fd_lock);
|
||||
- thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
|
||||
- goto err;
|
||||
+ if (errno != EISCONN) {
|
||||
+ struct rpc_createerr *ce = &get_rpc_createerr();
|
||||
+ ce->cf_stat = RPC_SYSTEMERROR;
|
||||
+ ce->cf_error.re_errno = errno;
|
||||
+ thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
|
||||
+ goto err;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
- mutex_unlock(&clnt_fd_lock);
|
||||
if (!__rpc_fd2sockinfo(fd, &si))
|
||||
goto err;
|
||||
thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,93 @@
|
|||
diff -up libtirpc-0.2.4/src/rtime.c.orig libtirpc-0.2.4/src/rtime.c
|
||||
--- libtirpc-0.2.4/src/rtime.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/rtime.c 2017-02-25 12:29:25.227847702 -0500
|
||||
@@ -46,6 +46,7 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
+#include <sys/poll.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <netinet/in.h>
|
||||
@@ -67,7 +68,8 @@ rtime(addrp, timep, timeout)
|
||||
struct timeval *timeout;
|
||||
{
|
||||
int s;
|
||||
- fd_set readfds;
|
||||
+ struct pollfd fd;
|
||||
+ int milliseconds;
|
||||
int res;
|
||||
unsigned long thetime;
|
||||
struct sockaddr_in from;
|
||||
@@ -94,31 +96,32 @@ rtime(addrp, timep, timeout)
|
||||
addrp->sin_port = serv->s_port;
|
||||
|
||||
if (type == SOCK_DGRAM) {
|
||||
- res = sendto(s, (char *)&thetime, sizeof(thetime), 0,
|
||||
+ res = sendto(s, (char *)&thetime, sizeof(thetime), 0,
|
||||
(struct sockaddr *)addrp, sizeof(*addrp));
|
||||
if (res < 0) {
|
||||
do_close(s);
|
||||
- return(-1);
|
||||
+ return(-1);
|
||||
}
|
||||
- do {
|
||||
- FD_ZERO(&readfds);
|
||||
- FD_SET(s, &readfds);
|
||||
- res = select(_rpc_dtablesize(), &readfds,
|
||||
- (fd_set *)NULL, (fd_set *)NULL, timeout);
|
||||
- } while (res < 0 && errno == EINTR);
|
||||
+
|
||||
+ milliseconds = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
|
||||
+ fd.fd = s;
|
||||
+ fd.events = POLLIN;
|
||||
+ do
|
||||
+ res = poll (&fd, 1, milliseconds);
|
||||
+ while (res < 0 && errno == EINTR);
|
||||
if (res <= 0) {
|
||||
if (res == 0) {
|
||||
errno = ETIMEDOUT;
|
||||
}
|
||||
do_close(s);
|
||||
- return(-1);
|
||||
+ return(-1);
|
||||
}
|
||||
fromlen = sizeof(from);
|
||||
- res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
|
||||
+ res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
|
||||
(struct sockaddr *)&from, &fromlen);
|
||||
do_close(s);
|
||||
if (res < 0) {
|
||||
- return(-1);
|
||||
+ return(-1);
|
||||
}
|
||||
} else {
|
||||
if (connect(s, (struct sockaddr *)addrp, sizeof(*addrp)) < 0) {
|
||||
diff -up libtirpc-0.2.4/src/svc_vc.c.orig libtirpc-0.2.4/src/svc_vc.c
|
||||
--- libtirpc-0.2.4/src/svc_vc.c.orig 2017-02-25 12:26:55.430978326 -0500
|
||||
+++ libtirpc-0.2.4/src/svc_vc.c 2017-02-25 12:29:25.227847702 -0500
|
||||
@@ -260,14 +260,8 @@ makefd_xprt(fd, sendsize, recvsize)
|
||||
struct cf_conn *cd;
|
||||
const char *netid;
|
||||
struct __rpc_sockinfo si;
|
||||
-
|
||||
- assert(fd != -1);
|
||||
|
||||
- if (fd >= FD_SETSIZE) {
|
||||
- warnx("svc_vc: makefd_xprt: fd too high\n");
|
||||
- xprt = NULL;
|
||||
- goto done;
|
||||
- }
|
||||
+ assert(fd != -1);
|
||||
|
||||
xprt = mem_alloc(sizeof(SVCXPRT));
|
||||
if (xprt == NULL) {
|
||||
@@ -340,6 +334,8 @@ again:
|
||||
*/
|
||||
|
||||
newxprt = makefd_xprt(sock, r->sendsize, r->recvsize);
|
||||
+ if (!newxprt)
|
||||
+ return (FALSE);
|
||||
|
||||
if (!__rpc_set_netbuf(&newxprt->xp_rtaddr, &addr, len))
|
||||
return (FALSE);
|
|
@ -0,0 +1,37 @@
|
|||
diff -up libtirpc-0.2.4/src/svc_generic.c.orig libtirpc-0.2.4/src/svc_generic.c
|
||||
--- libtirpc-0.2.4/src/svc_generic.c.orig 2013-12-09 15:59:51.000000000 -0500
|
||||
+++ libtirpc-0.2.4/src/svc_generic.c 2015-06-29 10:20:27.239019533 -0400
|
||||
@@ -283,6 +283,8 @@ svc_tli_create(fd, nconf, bindaddr, send
|
||||
xprt->xp_type = __rpc_socktype2seman(si.si_socktype);
|
||||
|
||||
if (nconf) {
|
||||
+ if (xprt->xp_netid != NULL)
|
||||
+ free(xprt->xp_netid);
|
||||
xprt->xp_netid = strdup(nconf->nc_netid);
|
||||
xprt->xp_tp = strdup(nconf->nc_device);
|
||||
}
|
||||
diff -up libtirpc-0.2.4/src/svc_vc.c.orig libtirpc-0.2.4/src/svc_vc.c
|
||||
--- libtirpc-0.2.4/src/svc_vc.c.orig 2015-06-29 10:19:21.205835483 -0400
|
||||
+++ libtirpc-0.2.4/src/svc_vc.c 2015-06-29 10:20:34.616151809 -0400
|
||||
@@ -393,6 +393,12 @@ svc_vc_destroy(xprt)
|
||||
__svc_vc_dodestroy(xprt);
|
||||
}
|
||||
|
||||
+static bool_t
|
||||
+__svc_rendezvous_socket(xprt)
|
||||
+ SVCXPRT *xprt;
|
||||
+{
|
||||
+ return (xprt->xp_ops->xp_recv == rendezvous_request);
|
||||
+}
|
||||
static void
|
||||
__svc_vc_dodestroy(xprt)
|
||||
SVCXPRT *xprt;
|
||||
@@ -404,7 +410,7 @@ __svc_vc_dodestroy(xprt)
|
||||
|
||||
if (xprt->xp_fd != RPC_ANYFD)
|
||||
(void)close(xprt->xp_fd);
|
||||
- if (xprt->xp_port != 0) {
|
||||
+ if (__svc_rendezvous_socket(xprt)) {
|
||||
/* a rendezvouser socket */
|
||||
r = (struct cf_rendezvous *)xprt->xp_p1;
|
||||
mem_free(r, sizeof (struct cf_rendezvous));
|
|
@ -0,0 +1,57 @@
|
|||
commit a4fa582908b9c63957240cb0cb68b59d56244ef5
|
||||
Author: Bodo Stroesser <bstroesser@ts.fujitsu.com>
|
||||
Date: Thu Nov 6 13:26:00 2014 -0500
|
||||
|
||||
write_vc: fix write retry loop for nonblocking mode
|
||||
|
||||
This is a simple fix for the write retry loop that is used on
|
||||
non-blocking connections if write() failed with -EAGAIN.
|
||||
|
||||
Additionally it removes a redundant if () {}
|
||||
|
||||
Erroneously at each cycle of the loop the length of the data
|
||||
to send is incremented and the buffer pointer is decremented.
|
||||
Thus, it might happen that:
|
||||
* the application crashes
|
||||
* data from the memory before the buffer is sent
|
||||
|
||||
Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
|
||||
diff --git a/src/svc_vc.c b/src/svc_vc.c
|
||||
index 4c70de8..4d3ea51 100644
|
||||
--- a/src/svc_vc.c
|
||||
+++ b/src/svc_vc.c
|
||||
@@ -559,20 +559,19 @@ write_vc(xprtp, buf, len)
|
||||
cd->strm_stat = XPRT_DIED;
|
||||
return (-1);
|
||||
}
|
||||
- if (cd->nonblock && i != cnt) {
|
||||
- /*
|
||||
- * For non-blocking connections, do not
|
||||
- * take more than 2 seconds writing the
|
||||
- * data out.
|
||||
- *
|
||||
- * XXX 2 is an arbitrary amount.
|
||||
- */
|
||||
- gettimeofday(&tv1, NULL);
|
||||
- if (tv1.tv_sec - tv0.tv_sec >= 2) {
|
||||
- cd->strm_stat = XPRT_DIED;
|
||||
- return (-1);
|
||||
- }
|
||||
+ /*
|
||||
+ * For non-blocking connections, do not
|
||||
+ * take more than 2 seconds writing the
|
||||
+ * data out.
|
||||
+ *
|
||||
+ * XXX 2 is an arbitrary amount.
|
||||
+ */
|
||||
+ gettimeofday(&tv1, NULL);
|
||||
+ if (tv1.tv_sec - tv0.tv_sec >= 2) {
|
||||
+ cd->strm_stat = XPRT_DIED;
|
||||
+ return (-1);
|
||||
}
|
||||
+ i = 0; /* Don't change buf and cnt */
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
commit cf2e0082ce88fc2c75479c26a4b9f69f1b028c80
|
||||
Author: Steve Dickson <steved@redhat.com>
|
||||
Date: Thu May 29 09:40:59 2014 -0400
|
||||
|
||||
Avoid buffer overruns by allocating buffer in svcauth_gss_validate()
|
||||
|
||||
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
|
||||
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||||
|
||||
diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c
|
||||
index 601a691..26c1065 100644
|
||||
--- a/src/svc_auth_gss.c
|
||||
+++ b/src/svc_auth_gss.c
|
||||
@@ -286,21 +286,19 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
|
||||
struct opaque_auth *oa;
|
||||
gss_buffer_desc rpcbuf, checksum;
|
||||
OM_uint32 maj_stat, min_stat, qop_state;
|
||||
- u_char rpchdr[128];
|
||||
+ u_char *rpchdr;
|
||||
int32_t *buf;
|
||||
|
||||
gss_log_debug("in svcauth_gss_validate()");
|
||||
|
||||
- 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)))
|
||||
+
|
||||
+ rpchdr = (u_char *)calloc(((8 * BYTES_PER_XDR_UNIT) +
|
||||
+ RNDUP(oa->oa_length)), 1);
|
||||
+ if (rpchdr == NULL)
|
||||
return (FALSE);
|
||||
|
||||
buf = (int32_t *)rpchdr;
|
||||
@@ -325,6 +323,8 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
|
||||
maj_stat = gss_verify_mic(&min_stat, gd->ctx, &rpcbuf, &checksum,
|
||||
&qop_state);
|
||||
|
||||
+ free(rpchdr);
|
||||
+
|
||||
if (maj_stat != GSS_S_COMPLETE) {
|
||||
gss_log_status("gss_verify_mic", maj_stat, min_stat);
|
||||
return (FALSE);
|
|
@ -0,0 +1,364 @@
|
|||
diff --git a/src/svc.c b/src/svc.c
|
||||
index 08cd6c9..8afd15d 100644
|
||||
--- a/src/svc.c
|
||||
+++ b/src/svc.c
|
||||
@@ -649,6 +649,7 @@ svc_getreq_common (fd)
|
||||
{
|
||||
if (SVC_RECV (xprt, &msg))
|
||||
{
|
||||
+ bool_t no_dispatch;
|
||||
|
||||
/* now find the exported program and call it */
|
||||
struct svc_callout *s;
|
||||
@@ -660,11 +661,14 @@ svc_getreq_common (fd)
|
||||
r.rq_proc = msg.rm_call.cb_proc;
|
||||
r.rq_cred = msg.rm_call.cb_cred;
|
||||
/* first authenticate the message */
|
||||
- if ((why = _authenticate (&r, &msg)) != AUTH_OK)
|
||||
+ why = _gss_authenticate(&r, &msg, &no_dispatch);
|
||||
+ if (why != AUTH_OK)
|
||||
{
|
||||
svcerr_auth (xprt, why);
|
||||
goto call_done;
|
||||
}
|
||||
+ if (no_dispatch)
|
||||
+ goto call_done;
|
||||
/* now match message with a registered service */
|
||||
prog_found = FALSE;
|
||||
low_vers = (rpcvers_t) - 1L;
|
||||
diff --git a/src/svc_auth.c b/src/svc_auth.c
|
||||
index e80d5f9..31241c9 100644
|
||||
--- a/src/svc_auth.c
|
||||
+++ b/src/svc_auth.c
|
||||
@@ -82,9 +82,10 @@ static struct authsvc *Auths = NULL;
|
||||
* invalid.
|
||||
*/
|
||||
enum auth_stat
|
||||
-_authenticate(rqst, msg)
|
||||
+_gss_authenticate(rqst, msg, no_dispatch)
|
||||
struct svc_req *rqst;
|
||||
struct rpc_msg *msg;
|
||||
+ bool_t *no_dispatch;
|
||||
{
|
||||
int cred_flavor;
|
||||
struct authsvc *asp;
|
||||
@@ -97,6 +98,7 @@ _authenticate(rqst, msg)
|
||||
rqst->rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor;
|
||||
rqst->rq_xprt->xp_verf.oa_length = 0;
|
||||
cred_flavor = rqst->rq_cred.oa_flavor;
|
||||
+ *no_dispatch = FALSE;
|
||||
switch (cred_flavor) {
|
||||
case AUTH_NONE:
|
||||
dummy = _svcauth_none(rqst, msg);
|
||||
@@ -112,6 +114,11 @@ _authenticate(rqst, msg)
|
||||
dummy = _svcauth_des(rqst, msg);
|
||||
return (dummy);
|
||||
#endif
|
||||
+#ifdef HAVE_RPCSEC_GSS
|
||||
+ case RPCSEC_GSS:
|
||||
+ dummy = _svcauth_gss(rqst, msg, no_dispatch);
|
||||
+ return (dummy);
|
||||
+#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -132,6 +139,13 @@ _authenticate(rqst, msg)
|
||||
return (AUTH_REJECTEDCRED);
|
||||
}
|
||||
|
||||
+enum auth_stat
|
||||
+_authenticate(struct svc_req *rqst, struct rpc_msg *msg)
|
||||
+{
|
||||
+ bool_t no_dispatch;
|
||||
+ return _gss_authenticate(rqst, msg, &no_dispatch);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Allow the rpc service to register new authentication types that it is
|
||||
* prepared to handle. When an authentication flavor is registered,
|
||||
@@ -161,6 +175,9 @@ svc_auth_reg(cred_flavor, handler)
|
||||
#ifdef DES_BUILTIN
|
||||
case AUTH_DES:
|
||||
#endif
|
||||
+#ifdef HAVE_RPCSEC_GSS
|
||||
+ case RPCSEC_GSS:
|
||||
+#endif
|
||||
/* already registered */
|
||||
return (1);
|
||||
|
||||
diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c
|
||||
index 3a3c980..7376107 100644
|
||||
--- a/src/svc_auth_gss.c
|
||||
+++ b/src/svc_auth_gss.c
|
||||
@@ -116,6 +116,7 @@ svcauth_gss_import_name(char *service)
|
||||
gss_name_t name;
|
||||
gss_buffer_desc namebuf;
|
||||
OM_uint32 maj_stat, min_stat;
|
||||
+ bool_t result;
|
||||
|
||||
gss_log_debug("in svcauth_gss_import_name()");
|
||||
|
||||
@@ -130,11 +131,9 @@ svcauth_gss_import_name(char *service)
|
||||
maj_stat, min_stat);
|
||||
return (FALSE);
|
||||
}
|
||||
- if (svcauth_gss_set_svc_name(name) != TRUE) {
|
||||
- gss_release_name(&min_stat, &name);
|
||||
- return (FALSE);
|
||||
- }
|
||||
- return (TRUE);
|
||||
+ result = svcauth_gss_set_svc_name(name);
|
||||
+ gss_release_name(&min_stat, &name);
|
||||
+ return result;
|
||||
}
|
||||
|
||||
static bool_t
|
||||
@@ -211,6 +210,8 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
+ xdr_free((xdrproc_t)xdr_rpc_gss_init_args, (caddr_t)&recv_tok);
|
||||
+
|
||||
if (gr->gr_major != GSS_S_COMPLETE &&
|
||||
gr->gr_major != GSS_S_CONTINUE_NEEDED) {
|
||||
gss_log_status("svcauth_gss_accept_sec_context: accept_sec_context",
|
||||
@@ -279,8 +280,11 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
|
||||
return (FALSE);
|
||||
|
||||
rqst->rq_xprt->xp_verf.oa_flavor = RPCSEC_GSS;
|
||||
- rqst->rq_xprt->xp_verf.oa_base = checksum.value;
|
||||
+ memcpy(rqst->rq_xprt->xp_verf.oa_base, checksum.value,
|
||||
+ checksum.length);
|
||||
rqst->rq_xprt->xp_verf.oa_length = checksum.length;
|
||||
+
|
||||
+ gss_release_buffer(&min_stat, &checksum);
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
||||
@@ -363,10 +367,13 @@ svcauth_gss_nextverf(struct svc_req *rqst, u_int num)
|
||||
maj_stat, min_stat);
|
||||
return (FALSE);
|
||||
}
|
||||
+
|
||||
rqst->rq_xprt->xp_verf.oa_flavor = RPCSEC_GSS;
|
||||
- rqst->rq_xprt->xp_verf.oa_base = (caddr_t)checksum.value;
|
||||
+ memcpy(rqst->rq_xprt->xp_verf.oa_base, checksum.value, checksum.length);
|
||||
rqst->rq_xprt->xp_verf.oa_length = (u_int)checksum.length;
|
||||
|
||||
+ gss_release_buffer(&min_stat, &checksum);
|
||||
+
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@@ -379,8 +386,10 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
struct rpc_gss_cred *gc;
|
||||
struct rpc_gss_init_res gr;
|
||||
int call_stat, offset;
|
||||
+ enum auth_stat result = AUTH_OK;
|
||||
+ OM_uint32 min_stat;
|
||||
|
||||
- gss_log_debug("in svcauth_gss()");
|
||||
+ gss_log_debug("in _svcauth_gss()");
|
||||
|
||||
/* Initialize reply. */
|
||||
rqst->rq_xprt->xp_verf = _null_auth;
|
||||
@@ -419,19 +428,25 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
XDR_DESTROY(&xdrs);
|
||||
|
||||
/* Check version. */
|
||||
- if (gc->gc_v != RPCSEC_GSS_VERSION)
|
||||
- return (AUTH_BADCRED);
|
||||
+ if (gc->gc_v != RPCSEC_GSS_VERSION) {
|
||||
+ result = AUTH_BADCRED;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
/* Check RPCSEC_GSS service. */
|
||||
if (gc->gc_svc != RPCSEC_GSS_SVC_NONE &&
|
||||
gc->gc_svc != RPCSEC_GSS_SVC_INTEGRITY &&
|
||||
- gc->gc_svc != RPCSEC_GSS_SVC_PRIVACY)
|
||||
- return (AUTH_BADCRED);
|
||||
+ gc->gc_svc != RPCSEC_GSS_SVC_PRIVACY) {
|
||||
+ result = AUTH_BADCRED;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
/* Check sequence number. */
|
||||
if (gd->established) {
|
||||
- if (gc->gc_seq > MAXSEQ)
|
||||
- return (RPCSEC_GSS_CTXPROBLEM);
|
||||
+ if (gc->gc_seq > MAXSEQ) {
|
||||
+ result = RPCSEC_GSS_CTXPROBLEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
if ((offset = gd->seqlast - gc->gc_seq) < 0) {
|
||||
gd->seqlast = gc->gc_seq;
|
||||
@@ -441,7 +456,8 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
}
|
||||
else if (offset >= gd->win || (gd->seqmask & (1 << offset))) {
|
||||
*no_dispatch = 1;
|
||||
- return (RPCSEC_GSS_CTXPROBLEM);
|
||||
+ result = RPCSEC_GSS_CTXPROBLEM;
|
||||
+ goto out;
|
||||
}
|
||||
gd->seq = gc->gc_seq;
|
||||
gd->seqmask |= (1 << offset);
|
||||
@@ -452,35 +468,52 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
rqst->rq_svcname = (char *)gd->ctx;
|
||||
}
|
||||
|
||||
+ rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
|
||||
+
|
||||
/* Handle RPCSEC_GSS control procedure. */
|
||||
switch (gc->gc_proc) {
|
||||
|
||||
case RPCSEC_GSS_INIT:
|
||||
case RPCSEC_GSS_CONTINUE_INIT:
|
||||
- if (rqst->rq_proc != NULLPROC)
|
||||
- return (AUTH_FAILED); /* XXX ? */
|
||||
+ if (rqst->rq_proc != NULLPROC) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
if (_svcauth_gss_name == NULL) {
|
||||
- if (!svcauth_gss_import_name("nfs"))
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_import_name("nfs")) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (!svcauth_gss_acquire_cred())
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_acquire_cred()) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- if (!svcauth_gss_accept_sec_context(rqst, &gr))
|
||||
- return (AUTH_REJECTEDCRED);
|
||||
+ if (!svcauth_gss_accept_sec_context(rqst, &gr)) {
|
||||
+ result = AUTH_REJECTEDCRED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- if (!svcauth_gss_nextverf(rqst, htonl(gr.gr_win)))
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_nextverf(rqst, htonl(gr.gr_win))) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
*no_dispatch = TRUE;
|
||||
|
||||
call_stat = svc_sendreply(rqst->rq_xprt,
|
||||
(xdrproc_t)xdr_rpc_gss_init_res, (caddr_t)&gr);
|
||||
|
||||
- if (!call_stat)
|
||||
- return (AUTH_FAILED);
|
||||
+ gss_release_buffer(&min_stat, &gr.gr_token);
|
||||
+ free(gr.gr_ctx.value);
|
||||
+
|
||||
+ if (!call_stat) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
if (gr.gr_major == GSS_S_COMPLETE)
|
||||
gd->established = TRUE;
|
||||
@@ -488,25 +521,36 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
break;
|
||||
|
||||
case RPCSEC_GSS_DATA:
|
||||
- if (!svcauth_gss_validate(gd, msg))
|
||||
- return (RPCSEC_GSS_CREDPROBLEM);
|
||||
+ if (!svcauth_gss_validate(gd, msg)) {
|
||||
+ result = RPCSEC_GSS_CREDPROBLEM;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- if (!svcauth_gss_nextverf(rqst, htonl(gc->gc_seq)))
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_nextverf(rqst, htonl(gc->gc_seq))) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
|
||||
case RPCSEC_GSS_DESTROY:
|
||||
- if (rqst->rq_proc != NULLPROC)
|
||||
- return (AUTH_FAILED); /* XXX ? */
|
||||
-
|
||||
- if (!svcauth_gss_validate(gd, msg))
|
||||
- return (RPCSEC_GSS_CREDPROBLEM);
|
||||
+ if (rqst->rq_proc != NULLPROC) {
|
||||
+ result = AUTH_FAILED; /* XXX ? */
|
||||
+ break;
|
||||
+ }
|
||||
+ if (!svcauth_gss_validate(gd, msg)) {
|
||||
+ result = RPCSEC_GSS_CREDPROBLEM;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- if (!svcauth_gss_nextverf(rqst, htonl(gc->gc_seq)))
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_nextverf(rqst, htonl(gc->gc_seq))) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
- if (!svcauth_gss_release_cred())
|
||||
- return (AUTH_FAILED);
|
||||
+ if (!svcauth_gss_release_cred()) {
|
||||
+ result = AUTH_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
SVCAUTH_DESTROY(rqst->rq_xprt->xp_auth);
|
||||
rqst->rq_xprt->xp_auth = &svc_auth_none;
|
||||
@@ -514,10 +558,15 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
|
||||
break;
|
||||
|
||||
default:
|
||||
- return (AUTH_REJECTEDCRED);
|
||||
+ result = AUTH_REJECTEDCRED;
|
||||
break;
|
||||
}
|
||||
- return (AUTH_OK);
|
||||
+out:
|
||||
+ xdr_free((xdrproc_t)xdr_rpc_gss_cred, (caddr_t)gc);
|
||||
+ if (result != AUTH_OK)
|
||||
+ gss_log_debug("_svcauth_gss() failed: %d", result);
|
||||
+
|
||||
+ return result;
|
||||
}
|
||||
|
||||
bool_t
|
||||
diff --git a/tirpc/rpc/auth.h b/tirpc/rpc/auth.h
|
||||
index 4ce11f0..7c8f813 100644
|
||||
--- a/tirpc/rpc/auth.h
|
||||
+++ b/tirpc/rpc/auth.h
|
||||
@@ -399,6 +399,7 @@ struct rpc_msg;
|
||||
enum auth_stat _svcauth_none (struct svc_req *, struct rpc_msg *);
|
||||
enum auth_stat _svcauth_short (struct svc_req *, struct rpc_msg *);
|
||||
enum auth_stat _svcauth_unix (struct svc_req *, struct rpc_msg *);
|
||||
+enum auth_stat _svcauth_gss (struct svc_req *, struct rpc_msg *, bool_t *);
|
||||
__END_DECLS
|
||||
|
||||
#define AUTH_NONE 0 /* no authentication */
|
||||
diff --git a/tirpc/rpc/svc_auth.h b/tirpc/rpc/svc_auth.h
|
||||
index 14269d1..723c989 100644
|
||||
--- a/tirpc/rpc/svc_auth.h
|
||||
+++ b/tirpc/rpc/svc_auth.h
|
||||
@@ -66,6 +66,8 @@ typedef struct SVCAUTH {
|
||||
* Server side authenticator
|
||||
*/
|
||||
__BEGIN_DECLS
|
||||
+extern enum auth_stat _gss_authenticate(struct svc_req *, struct rpc_msg *,
|
||||
+ bool_t *);
|
||||
extern enum auth_stat _authenticate(struct svc_req *, struct rpc_msg *);
|
||||
extern int svc_auth_reg(int, enum auth_stat (*)(struct svc_req *,
|
||||
struct rpc_msg *));
|
|
@ -0,0 +1,16 @@
|
|||
diff -up libtirpc-0.2.4/src/svc_vc.c.orig libtirpc-0.2.4/src/svc_vc.c
|
||||
--- libtirpc-0.2.4/src/svc_vc.c.orig 2016-04-08 10:52:23.254767196 -0400
|
||||
+++ libtirpc-0.2.4/src/svc_vc.c 2016-04-08 10:57:44.461237876 -0400
|
||||
@@ -158,8 +158,10 @@ svc_vc_create(fd, sendsize, recvsize)
|
||||
warnx("svc_vc_create: out of memory");
|
||||
goto cleanup_svc_vc_create;
|
||||
}
|
||||
- if (!__rpc_fd2sockinfo(fd, &si))
|
||||
- return NULL;
|
||||
+ if (!__rpc_fd2sockinfo(fd, &si)) {
|
||||
+ warnx("svc_vc_create: __rpc_fd2sockinfo failed");
|
||||
+ goto cleanup_svc_vc_create;
|
||||
+ }
|
||||
r->sendsize = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsize);
|
||||
r->recvsize = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsize);
|
||||
r->maxrec = __svc_maxrec;
|
|
@ -0,0 +1,422 @@
|
|||
%define _root_libdir /%{_lib}
|
||||
|
||||
Name: libtirpc
|
||||
Version: 0.2.4
|
||||
Release: 0.10%{?dist}
|
||||
Summary: Transport Independent RPC Library
|
||||
Group: System Environment/Libraries
|
||||
License: SISSL and BSD
|
||||
URL: http://nfsv4.bullopensource.org/
|
||||
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
Source0: http://downloads.sourceforge.net/libtirpc/libtirpc-%{version}.tar.bz2
|
||||
|
||||
BuildRequires: automake, autoconf, libtool, pkgconfig
|
||||
BuildRequires: krb5-devel
|
||||
|
||||
#
|
||||
# RHEL7.1
|
||||
#
|
||||
Patch001: libtirpc-0.2.4-svc-buffer-overflow.patch
|
||||
Patch002: libtirpc-0.2.4-nonblocking-mode.patch
|
||||
|
||||
#
|
||||
# RHEL7.2
|
||||
#
|
||||
Patch003: libtirpc-0.2.4-mem-leak.patch
|
||||
|
||||
#
|
||||
# RHEL7.3
|
||||
#
|
||||
Patch004: libtirpc-0.2.4-debug.patch
|
||||
Patch005: libtirpc-0.2.4-svc_vc_create-memleak.patch
|
||||
Patch006: libtirpc-0.2.4-svc-gss-memleaks.patch
|
||||
Patch007: libtirpc-0.2.4-clnt-mthr-create.patch
|
||||
|
||||
#
|
||||
# RHEL7.4
|
||||
#
|
||||
Patch008: libtirpc-0.2.4-makefd_xprt-fd.patch
|
||||
Patch009: libtirpc-0.2.4-CVE-2017-8779.patch
|
||||
|
||||
%description
|
||||
This package contains SunLib's implementation of transport-independent
|
||||
RPC (TI-RPC) documentation. This library forms a piece of the base of
|
||||
Open Network Computing (ONC), and is derived directly from the
|
||||
Solaris 2.3 source.
|
||||
|
||||
TI-RPC is an enhanced version of TS-RPC that requires the UNIX System V
|
||||
Transport Layer Interface (TLI) or an equivalent X/Open Transport Interface
|
||||
(XTI). TI-RPC is on-the-wire compatible with the TS-RPC, which is supported
|
||||
by almost 70 vendors on all major operating systems. TS-RPC source code
|
||||
(RPCSRC 4.0) remains available from several internet sites.
|
||||
|
||||
%package devel
|
||||
Summary: Development files for the libtirpc library
|
||||
Group: Development/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
Requires: pkgconfig man-db
|
||||
|
||||
%description devel
|
||||
This package includes header files and libraries necessary for
|
||||
developing programs which use the tirpc library.
|
||||
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
# 1102765 - rpcbind segfaults in svc_vc_recv
|
||||
%patch001 -p1
|
||||
# 1162714 - Non blocking mode for writes is broken
|
||||
%patch002 -p1
|
||||
# 1236187 - Memory Leak in libtirpc
|
||||
%patch003 -p1
|
||||
# 1273159 - Backport libtirpc's new debugging interface from upstream
|
||||
%patch004 -p1
|
||||
# 1276685 - memory leak in svc_vc_create
|
||||
%patch005 -p1
|
||||
# 1282488 - Address memory leaks in server-side GSS authenticator
|
||||
%patch006 -p1
|
||||
# 1342545 - Threads specifically interacting with libtirpc library...
|
||||
%patch007 -p1
|
||||
# 1410617 - makefd_xprt: remove obsolete check for fd number
|
||||
%patch008 -p1
|
||||
# CVE-2017-8779 libtirpc: libtirpc, libntirpc: Memory leak....
|
||||
%patch009 -p1
|
||||
|
||||
# Remove .orig files
|
||||
find . -name "*.orig" | xargs rm -f
|
||||
|
||||
%build
|
||||
sh autogen.sh
|
||||
autoreconf -fisv
|
||||
%configure
|
||||
make all
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
mkdir -p %{buildroot}/etc
|
||||
mkdir -p %{buildroot}%{_root_libdir}
|
||||
mkdir -p %{buildroot}%{_libdir}/pkgconfig
|
||||
make install DESTDIR=%{buildroot} \
|
||||
libdir=%{_root_libdir} pkgconfigdir=%{_libdir}/pkgconfig
|
||||
# Don't package .a or .la files
|
||||
rm -f %{buildroot}%{_root_libdir}/*.{a,la}
|
||||
|
||||
# Creat the man diretory
|
||||
mv %{buildroot}%{_mandir}/man3 %{buildroot}%{_mandir}/man3t
|
||||
|
||||
%post -p /sbin/ldconfig
|
||||
|
||||
%postun -p /sbin/ldconfig
|
||||
|
||||
%post devel
|
||||
# Register the new man section
|
||||
#if [ "$1" -eq 1 ]; then
|
||||
# makewhatis -s 3t
|
||||
#fi
|
||||
|
||||
%postun devel
|
||||
# Remove the existance of the man section
|
||||
#makewhatis -s 3t
|
||||
|
||||
|
||||
%clean
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc AUTHORS ChangeLog NEWS README
|
||||
%{_root_libdir}/libtirpc.so.*
|
||||
%config(noreplace)%{_sysconfdir}/netconfig
|
||||
|
||||
%files devel
|
||||
%defattr(0644,root,root,755)
|
||||
%dir %{_includedir}/tirpc
|
||||
%dir %{_includedir}/tirpc/rpc
|
||||
%dir %{_includedir}/tirpc/rpcsvc
|
||||
%{_root_libdir}/libtirpc.so
|
||||
%{_libdir}/pkgconfig/libtirpc.pc
|
||||
%{_includedir}/tirpc/netconfig.h
|
||||
%{_includedir}/tirpc/rpc/auth.h
|
||||
%{_includedir}/tirpc/rpc/auth_des.h
|
||||
%{_includedir}/tirpc/rpc/auth_gss.h
|
||||
%{_includedir}/tirpc/rpc/auth_kerb.h
|
||||
%{_includedir}/tirpc/rpc/auth_unix.h
|
||||
%{_includedir}/tirpc/rpc/clnt.h
|
||||
%{_includedir}/tirpc/rpc/clnt_soc.h
|
||||
%{_includedir}/tirpc/rpc/clnt_stat.h
|
||||
%{_includedir}/tirpc/rpc/des.h
|
||||
%{_includedir}/tirpc/rpc/des_crypt.h
|
||||
%{_includedir}/tirpc/rpc/nettype.h
|
||||
%{_includedir}/tirpc/rpc/pmap_clnt.h
|
||||
%{_includedir}/tirpc/rpc/pmap_prot.h
|
||||
%{_includedir}/tirpc/rpc/pmap_rmt.h
|
||||
%{_includedir}/tirpc/rpc/raw.h
|
||||
%{_includedir}/tirpc/rpc/rpc.h
|
||||
%{_includedir}/tirpc/rpc/rpc_com.h
|
||||
%{_includedir}/tirpc/rpc/rpc_msg.h
|
||||
%{_includedir}/tirpc/rpc/rpcb_clnt.h
|
||||
%{_includedir}/tirpc/rpc/rpcb_prot.h
|
||||
%{_includedir}/tirpc/rpc/rpcb_prot.x
|
||||
%{_includedir}/tirpc/rpc/rpcent.h
|
||||
%{_includedir}/tirpc/rpc/svc.h
|
||||
%{_includedir}/tirpc/rpc/svc_auth.h
|
||||
%{_includedir}/tirpc/rpc/svc_dg.h
|
||||
%{_includedir}/tirpc/rpc/svc_soc.h
|
||||
%{_includedir}/tirpc/rpc/types.h
|
||||
%{_includedir}/tirpc/rpc/xdr.h
|
||||
%{_includedir}/tirpc/rpcsvc/crypt.h
|
||||
%{_includedir}/tirpc/rpcsvc/crypt.x
|
||||
%{_mandir}/*/*
|
||||
|
||||
%changelog
|
||||
* Wed May 17 2017 Steve Dickson <steved@redhat.com> 0.2.4-0.10
|
||||
- Fix for CVE-2017-8779 (bz 1449463)
|
||||
|
||||
* Sat Feb 25 2017 Steve Dickson <steved@redhat.com> 0.2.4-0.9
|
||||
- makefd_xprt: remove obsolete check for fd number (bz 1410617)
|
||||
|
||||
* Mon Jun 6 2016 Steve Dickson <steved@redhat.com> 0.2.4-0.8
|
||||
- handle concurrent connect calls in clnt_vc_create() (bz 1342545)
|
||||
|
||||
* Fri Apr 8 2016 Steve Dickson <steved@redhat.com> 0.2.4-0.7
|
||||
- Backported upstream debugging (bz 1273159)
|
||||
- Fixed memory leak in svc_vc_create (bz 1276685)
|
||||
- Fixed memory leaks in server-side GSS authenticator (bz 1282488)
|
||||
|
||||
* Mon Jun 29 2015 Steve Dickson <steved@redhat.com> 0.2.4-0.6
|
||||
- Fixed a couple memory leaks (bz 1236187)
|
||||
|
||||
* Sat Nov 15 2014 Steve Dickson <steved@redhat.com> 0.2.4-0.5
|
||||
- Fixed the non-blocking mode (bz 1162714)
|
||||
|
||||
* Wed Sep 17 2014 Steve Dickson <steved@redhat.com> 0.2.4-0.4
|
||||
- Avoid buffer overruns svcauth_gss_validate() (bz 1102765)
|
||||
|
||||
* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 0.2.4-0.3
|
||||
- Mass rebuild 2014-01-24
|
||||
|
||||
* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 0.2.4-0.2
|
||||
- Mass rebuild 2013-12-27
|
||||
|
||||
* Fri Dec 13 2013 Steve Dickson <steved@redhat.com> 0.2.4-0.1
|
||||
- Update to latest upstream release: 0.2.4 (bz 1040593)
|
||||
|
||||
* Wed Dec 11 2013 Steve Dickson <steved@redhat.com> 0.2.4-0
|
||||
- Update to latest upstream release: 0.2.4 (bz 1038736)
|
||||
|
||||
* Tue Nov 26 2013 Steve Dickson <steved@redhat.com> 0.2.3-4
|
||||
- Update to latest RC release: libtirpc-0-2-4-rc3 (bz 1034434)
|
||||
|
||||
* Tue Jul 2 2013 Steve Dickson <steved@redhat.com> 0.2.3-3
|
||||
- Update to latest RC release: libtirpc-0-2-4-rc2 (bz 959469)
|
||||
|
||||
* Mon Apr 22 2013 Steve Dickson <steved@redhat.com> 0.2.3-2
|
||||
- Update to latest RC release: libtirpc-0-2-4-rc1 (bz 948378)
|
||||
|
||||
* Thu Apr 11 2013 Guenther Deschner <gdeschner@redhat.com> 0.2.3-1
|
||||
- Removed libgssglue dependency (patch from master)
|
||||
|
||||
* Wed Feb 13 2013 Steve Dickson <steved@redhat.com> 0.2.3-0
|
||||
- Updated to latest upstream release: 0.2.3
|
||||
|
||||
* Tue Nov 13 2012 Steve Dickson <steved@redhat.com> 0.2.1-43
|
||||
- Updated to latest upstream RC release: 0.2.3-rc4
|
||||
|
||||
* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.2.2-42
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
|
||||
|
||||
* Thu Apr 26 2012 Steve Dickson <steved@redhat.com> 0.2.1-4.1
|
||||
- Updated to latest upstream RC release: libtirpc-0.2.3-rc3
|
||||
|
||||
* Mon Mar 19 2012 Steve Dickson <steved@redhat.com> 0.2.1-3.1
|
||||
- Fixed the install path in doc/Makefile.am
|
||||
|
||||
* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.2.2-2.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
|
||||
|
||||
* Wed Jul 20 2011 Steve Dickson <steved@redhat.com> 0.2.1-1.1
|
||||
- Fixed segfault in SVCAUTH_WRAP call (bz 722594)
|
||||
|
||||
* Tue Jun 21 2011 Steve Dickson <steved@redhat.com> 0.2.1-1
|
||||
- Updated to latest upstream version: 0.2.3-rc1
|
||||
|
||||
* Mon May 2 2011 Steve Dickson <steved@redhat.com> 0.2.1-0
|
||||
- Updated to latest upstream version: 0.2.2
|
||||
|
||||
* Tue Apr 12 2011 Karsten Hopp <karsten@redhat.com> 0.2.1-7.1
|
||||
- replace Requires(devel) with a simple Requires as the new rpm
|
||||
aborts otherwise with "Bad Requireflags: qualifiers: Requires(devel)"
|
||||
|
||||
* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org>
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
|
||||
|
||||
* Thu Dec 2 2010 Steve Dickson <steved@redhat.com> 0.2.1-6
|
||||
- Moved the libraries from /usr/lib to /lib
|
||||
|
||||
* Mon Aug 30 2010 Steve Dickson <steved@redhat.com> 0.2.1-5
|
||||
- Relicense these SISSL files to 3 clause BSD
|
||||
- Fixed last remaining BSD license issues
|
||||
|
||||
* Fri Jul 16 2010 Steve Dickson <steved@redhat.com> 0.2.1-4
|
||||
- Add back SISSL license attribution
|
||||
|
||||
* Fri Jul 09 2010 Mike McGrath <mmcgrath@redhat.com> 0.2.1-3.1
|
||||
- Rebuild to fix broken man dep s/man/man-db/
|
||||
|
||||
* Tue May 18 2010 Steve Dickson <steved@redhat.com> 0.2.1-3
|
||||
- Updated to latest RC release: libtirpc-0-2-2-rc2 [bz 519430]
|
||||
|
||||
* Mon Mar 22 2010 Steve Dickson <steved@redhat.com> 0.2.1-2
|
||||
- Updated to latest RC release: libtirpc-0-2-2-rc1
|
||||
|
||||
* Mon Nov 30 2009 Steve Dickson <steved@redhat.com> 0.2.1-1
|
||||
- Updated to latest upstream version: 0.2.1
|
||||
|
||||
* Sat Jul 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.2.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
|
||||
|
||||
* Thu Jul 9 2009 Steve Dickson <steved@redhat.com> 0.2.0-3
|
||||
- Updated to latest upstream tag: 0-2-1-rc3
|
||||
Fixed the --disable-gss options
|
||||
Fixed a number of warnings
|
||||
Change how architectures are define in xdr_float.c
|
||||
|
||||
* Mon Jun 29 2009 Steve Dickson <steved@redhat.com> 0.2.0-2
|
||||
- Updated to latest upstream tag: 0-2-1-rc2
|
||||
rpcb_clnt: RPC_PROGNOTREGISTERED is a permanent error
|
||||
clnt_dg: Fix infinite loop when datagram call times ou
|
||||
Updated .gitignore file
|
||||
Replace the hard coded path name with the top_srcdir macrc
|
||||
Added 'doc' to the SUBDIRS list so make install work correctly.
|
||||
|
||||
* Fri May 29 2009 Steve Dickson <steved@redhat.com> 0.2.0-1
|
||||
- Updated to latest upstream version: 0.2.0
|
||||
|
||||
* Tue May 19 2009 Tom "spot" Callaway <tcallawa@redhat.com> 0.1.11-3
|
||||
- Replace the Sun RPC license with the BSD license, with the explicit permission of Sun Microsystems
|
||||
|
||||
* Mon Apr 20 2009 Steve Dickson <steved@redhat.com> 0.1.11-2
|
||||
- Updated to libtirpc-0.1.12-rc1
|
||||
|
||||
* Mon Apr 20 2009 Steve Dickson <steved@redhat.com> 0.1.11-1
|
||||
- Updated to the latest release: 0.1.11
|
||||
|
||||
* Fri Mar 13 2009 Steve Dickson <steved@redhat.com> 0.1.10-6
|
||||
- libtirpc: set r_netid and r_owner in __rpcb_findaddr_timed
|
||||
- libtirpc: be sure to free cl_netid and cl_tp
|
||||
- libtirpc: must free saved wire verifier when destroying context
|
||||
|
||||
* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.1.10-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
|
||||
|
||||
* Wed Jan 28 2009 Steve Dickson <steved@redhat.com> 0.1.10-4
|
||||
- Converted all uids and uids to type uid_t and gid_t (sf 2446314)
|
||||
|
||||
* Wed Jan 28 2009 Steve Dickson <steved@redhat.com> 0.1.10-3
|
||||
- backwards compatibility: fix order of fields in TI-RPC's
|
||||
svc_req (bz 481388)
|
||||
- Removed a number warnings.
|
||||
|
||||
* Thu Jan 22 2009 Steve Dickson <steved@redhat.com> 0.1.10-2
|
||||
- Header file fixes for C++
|
||||
|
||||
* Thu Nov 20 2008 Steve Dickson <steved@redhat.com> 0.1.10-1
|
||||
- Updated to latest upstream version: 0.1.10
|
||||
|
||||
* Tue Oct 28 2008 Steve Dickson <steved@redhat.com> 0.1.9-7
|
||||
- Fixed some incorrect function declarations (bz468815)
|
||||
|
||||
* Mon Oct 27 2008 Steve Dickson <steved@redhat.com> 0.1.9-6
|
||||
- Fix bad assumption taddr2uaddr processing that
|
||||
caused a segfault (bz468014)
|
||||
|
||||
* Tue Sep 16 2008 Steve Dickson <steved@redhat.com> 0.1.9-5
|
||||
- Fix for taddr2addr conversion bug of local addresses
|
||||
- Fixed some of warnings in: src/auth_time.c, src/clnt_dg.c and
|
||||
src/clnt_raw.c
|
||||
- Added some #ifdef NOTUSED around some code in src/rpbc_clnt.c
|
||||
that was not being used...
|
||||
|
||||
* Thu Sep 4 2008 Steve Dickson <steved@redhat.com> 0.1.9-4
|
||||
- Always make IPv6 sockets V6ONLY
|
||||
- Fix incorrect sizeof() in __rpc_getbroadifs
|
||||
|
||||
* Thu Aug 7 2008 Tom "spot" Callaway <tcallawa@redhat.com> 0.1.9-3
|
||||
- fix license tag
|
||||
|
||||
* Tue Jul 8 2008 Steve Dickson <steved@redhat.com> 0.1.9-1
|
||||
- Update to latest upstream version 0.1.9
|
||||
|
||||
* Fri Jun 27 2008 Steve Dickson <steved@redhat.com> 0.1.8-2
|
||||
- Added super-H(sh3,4) architecture support (bz 446559)
|
||||
|
||||
* Tue Jun 10 2008 Steve Dickson <steved@redhat.com> 0.1.8-1
|
||||
- Update to latest upstream version 0.1.8
|
||||
|
||||
* Wed Mar 12 2008 Steve Dickson <steved@redhat.com> 0.1.7-18
|
||||
- Install man pages in the 3t section
|
||||
|
||||
* Tue Feb 19 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 0.1.7-17
|
||||
- Autorebuild for GCC 4.3
|
||||
|
||||
* Mon Feb 18 2008 Steve Dickson <steved@redhat.com> 0.1.7-16
|
||||
- Added patch that creates a libtirpc.pc used by the
|
||||
pkg-config command.
|
||||
|
||||
* Thu Jan 24 2008 Steve Dickson <steved@redhat.com> 0.1.7-15
|
||||
- Protect from buffer overflow in the GSS code. (bz 362121)
|
||||
|
||||
* Mon Dec 17 2007 Steve Dickson <steved@redhat.com> 0.1.7-14
|
||||
- Fixed typo in /etc/netconfig file (bz 414471)
|
||||
|
||||
* Thu Oct 25 2007 Steve Dickson <steved@redhat.com> 0.1.7-13
|
||||
- Added a check for the ARM arch (bz 351071)
|
||||
|
||||
* Wed Oct 17 2007 Steve Dickson <steved@redhat.com> 0.1.7-12
|
||||
- Switch the libgssapi dependency to libgssglue
|
||||
|
||||
* Mon Oct 15 2007 Steve Dickson <steved@redhat.com> 0.1.7-11
|
||||
- Made tcp6/udp6 network ids no longer visible in the netconfig
|
||||
file since the ipv6 code is not fully baked yet in rpcbind. (bz 249121)
|
||||
|
||||
* Wed Aug 29 2007 Fedora Release Engineering <rel-eng at fedoraproject dot org> - 0.1.7-10
|
||||
- Rebuild for selinux ppc32 issue.
|
||||
|
||||
* Mon Jul 30 2007 <steved@redhat.com> 0.1.7-9
|
||||
- Fixed mutex lock problem in clnt_raw_create()
|
||||
- Ignore the return value of snprintf() and use strlen() instead
|
||||
to bump the pointer in clnt_sperror()
|
||||
- A couple ntohs() were needed in bindresvport_sa()
|
||||
- Added IP_RECVERR processing with to clnt_dg_call() so
|
||||
application will see errors instead of timing out
|
||||
- Make sure remote address (xp_rtaddr) is populated
|
||||
with the correct type of address.
|
||||
- Change the order of network ids in /etc/netconfg
|
||||
putting ipv4 ids before ipv6.
|
||||
- Bumped up Release from 8 to 9.
|
||||
|
||||
* Mon Jul 9 2007 <steved@redhat.com> 0.1.7-7
|
||||
- Fixed infinite loop in svc_run() (bz 246677)
|
||||
|
||||
* Thu Apr 26 2007 <steved@redhat.com> 0.1.7-6
|
||||
- Fixed potential buffer overflow in xdr_strings
|
||||
- Added a optimization to bindresvport that allows more
|
||||
ports to be tried.
|
||||
|
||||
* Mon Mar 26 2007 Steve Dickson <steved@redhat.com> 0.1.7-5
|
||||
- Fixed Unowned Directory RPM problem (bz 233873)
|
||||
|
||||
* Mon Aug 28 2006 Steve Dickson <steved@redhat.com> 0.1.7-4
|
||||
- Fixed undefined symbol (bz 204296)
|
||||
|
||||
* Mon Aug 14 2006 Steve Dickson <steved@redhat.com> 0.1.7-3
|
||||
- Added in svc_auth_none needed by the GSSAPI code.
|
||||
- Added compile define for ppc64 archs
|
||||
|
||||
* Fri Aug 11 2006 Steve Dickson <steved@redhat.com> 0.1.7-2
|
||||
- Uncommented tcp6 and udp6 in the default /etc/netconfig file.
|
||||
- Added hooks to used the libgssapi library.
|
||||
|
||||
* Fri Aug 4 2006 Steve Dickson <steved@redhat.com> 0.1.7-1
|
||||
- Initial commit
|
Loading…
Reference in New Issue