SHA256
1
0
forked from pool/libtirpc

Accepting request 346346 from Base:System

1

OBS-URL: https://build.opensuse.org/request/show/346346
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libtirpc?expand=0&rev=41
This commit is contained in:
Dominique Leuenberger 2015-12-03 12:28:48 +00:00 committed by Git OBS Bridge
commit 8a7951b2dd
15 changed files with 414 additions and 430 deletions

View File

@ -3,7 +3,7 @@ index 290c635..a6a202e 100644
--- a/configure.ac --- a/configure.ac
+++ b/configure.ac +++ b/configure.ac
@@ -1,5 +1,4 @@ @@ -1,5 +1,4 @@
AC_INIT(libtirpc, 0.3.2) AC_INIT(libtirpc, 1.0.1)
-AM_INIT_AUTOMAKE([silent-rules]) -AM_INIT_AUTOMAKE([silent-rules])
+AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE
-AM_SILENT_RULES([yes]) -AM_SILENT_RULES([yes])

View File

@ -0,0 +1,365 @@
diff --git a/src/svc.c b/src/svc.c
index 9c41445..b59467b 100644
--- a/src/svc.c
+++ b/src/svc.c
@@ -99,7 +99,7 @@ xprt_register (xprt)
{
__svc_xports = (SVCXPRT **) calloc (_rpc_dtablesize(), sizeof (SVCXPRT *));
if (__svc_xports == NULL)
- return;
+ goto unlock;
}
if (sock < _rpc_dtablesize())
{
@@ -120,14 +120,14 @@ xprt_register (xprt)
svc_pollfd[i].fd = sock;
svc_pollfd[i].events = (POLLIN | POLLPRI |
POLLRDNORM | POLLRDBAND);
- return;
+ goto unlock;
}
new_svc_pollfd = (struct pollfd *) realloc (svc_pollfd,
sizeof (struct pollfd)
* (svc_max_pollfd + 1));
if (new_svc_pollfd == NULL) /* Out of memory */
- return;
+ goto unlock;
svc_pollfd = new_svc_pollfd;
++svc_max_pollfd;
@@ -135,6 +135,7 @@ xprt_register (xprt)
svc_pollfd[svc_max_pollfd - 1].events = (POLLIN | POLLPRI |
POLLRDNORM | POLLRDBAND);
}
+unlock:
rwlock_unlock (&svc_fd_lock);
}
diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c
index b6aa407..bece46a 100644
--- a/src/svc_auth_gss.c
+++ b/src/svc_auth_gss.c
@@ -129,6 +129,8 @@ struct svc_rpc_gss_data {
((struct svc_rpc_gss_data *)(auth)->svc_ah_private)
/* Global server credentials. */
+static u_int _svcauth_req_time = 0;
+static gss_OID_set_desc _svcauth_oid_set = {1, GSS_C_NULL_OID };
static gss_cred_id_t _svcauth_gss_creds;
static gss_name_t _svcauth_gss_name = GSS_C_NO_NAME;
static char * _svcauth_svc_name = NULL;
@@ -167,6 +169,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()");
@@ -181,22 +184,21 @@ 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
-svcauth_gss_acquire_cred(u_int req_time, gss_OID_set_desc *oid_set)
+svcauth_gss_acquire_cred(void)
{
OM_uint32 maj_stat, min_stat;
gss_log_debug("in svcauth_gss_acquire_cred()");
- maj_stat = gss_acquire_cred(&min_stat, _svcauth_gss_name, req_time,
- oid_set, GSS_C_ACCEPT,
+ maj_stat = gss_acquire_cred(&min_stat, _svcauth_gss_name,
+ _svcauth_req_time, &_svcauth_oid_set,
+ GSS_C_ACCEPT,
&_svcauth_gss_creds, NULL, NULL);
if (maj_stat != GSS_S_COMPLETE) {
@@ -300,6 +302,8 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
NULL,
&gd->deleg);
+ 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",
@@ -352,8 +356,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);
}
@@ -435,10 +442,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);
}
@@ -568,6 +578,8 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
gss_qop_t qop;
struct svcauth_gss_cache_entry **ce;
time_t now;
+ enum auth_stat result = AUTH_OK;
+ OM_uint32 min_stat;
gss_log_debug("in svcauth_gss()");
@@ -621,19 +633,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;
@@ -643,7 +661,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);
@@ -654,35 +673,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; /* XXX ? */
+ break;
+ }
if (_svcauth_gss_name == GSS_C_NO_NAME) {
- if (!svcauth_gss_import_name("nfs"))
- return (AUTH_FAILED);
+ if (!svcauth_gss_import_name("nfs")) {
+ result = AUTH_FAILED;
+ break;
+ }
}
- if (!svcauth_gss_acquire_cred(0, GSS_C_NULL_OID_SET))
- 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;
@@ -690,27 +726,37 @@ _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, &qop))
- return (RPCSEC_GSS_CREDPROBLEM);
+ if (!svcauth_gss_validate(gd, msg, &qop)) {
+ 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 (!gd->callback_done) {
gd->callback_done = TRUE;
gd->sec.qop = qop;
(void)rpc_gss_num_to_qop(gd->rcred.mechanism,
gd->sec.qop, &gd->rcred.qop);
- if (!svcauth_gss_callback(rqst, gd))
- return (AUTH_REJECTEDCRED);
+ if (!svcauth_gss_callback(rqst, gd)) {
+ result = AUTH_REJECTEDCRED;
+ break;
+ }
}
if (gd->locked) {
if (gd->rcred.service !=
- _rpc_gss_svc_to_service(gc->gc_svc))
- return (AUTH_FAILED);
- if (gd->sec.qop != qop)
- return (AUTH_BADVERF);
+ _rpc_gss_svc_to_service(gc->gc_svc)) {
+ result = AUTH_FAILED;
+ break;
+ }
+ if (gd->sec.qop != qop) {
+ result = AUTH_BADVERF;
+ break;
+ }
}
if (gd->sec.qop != qop) {
@@ -724,17 +770,25 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
break;
case RPCSEC_GSS_DESTROY:
- if (rqst->rq_proc != NULLPROC)
- return (AUTH_FAILED); /* XXX ? */
+ if (rqst->rq_proc != NULLPROC) {
+ result = AUTH_FAILED; /* XXX ? */
+ break;
+ }
- if (!svcauth_gss_validate(gd, msg, &qop))
- return (RPCSEC_GSS_CREDPROBLEM);
+ if (!svcauth_gss_validate(gd, msg, &qop)) {
+ 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(&SVC_XP_AUTH(rqst->rq_xprt));
SVC_XP_AUTH(rqst->rq_xprt).svc_ah_ops = svc_auth_none.svc_ah_ops;
@@ -743,10 +797,12 @@ _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);
+ return result;
}
static bool_t
@@ -890,7 +946,6 @@ bool_t
rpc_gss_set_svc_name(char *principal, char *mechanism, u_int req_time,
u_int UNUSED(program), u_int UNUSED(version))
{
- gss_OID_set_desc oid_set;
rpc_gss_OID oid;
char *save;
@@ -902,14 +957,13 @@ rpc_gss_set_svc_name(char *principal, char *mechanism, u_int req_time,
if (!rpc_gss_mech_to_oid(mechanism, &oid))
goto out_err;
- oid_set.count = 1;
- oid_set.elements = (gss_OID)oid;
if (!svcauth_gss_import_name(principal))
goto out_err;
- if (!svcauth_gss_acquire_cred(req_time, &oid_set))
- goto out_err;
+ _svcauth_req_time = req_time;
+ _svcauth_oid_set.count = 1;
+ _svcauth_oid_set.elements = (gss_OID)oid;
free(_svcauth_svc_name);
_svcauth_svc_name = save;
return TRUE;

View File

@ -1,18 +0,0 @@
diff --git a/src/libtirpc.map b/src/libtirpc.map
index 063cddd..449b769 100644
--- a/src/libtirpc.map
+++ b/src/libtirpc.map
@@ -316,6 +316,13 @@ TIRPC_0.3.2 {
xdr_unixcred;
} TIRPC_0.3.1;
+TIRPC_0.3.3 {
+ __getpublickey_LOCAL;
+ __key_decryptsession_pk_LOCAL;
+ __key_encryptsession_pk_LOCAL;
+ __key_gendes_LOCAL;
+} TIRPC_0.3.2;
+
TIRPC_PRIVATE {
global:
__libc_clntudp_bufcreate;

View File

@ -1,41 +0,0 @@
xprt->xp_netid can be allocated by makefd_xprt() in
svc_fd_create(), so don't blindly overwrite the
pointer in svc_tli_create()
The API expection is the nc_netid passed in will be
used for the xp_netid. So the pointer must be
freed then re-allocated.
Reported-by: Michael Theall <mtheall@us.ibm.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
src/svc_generic.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/svc_generic.c b/src/svc_generic.c
index f49d776..7aae796 100644
--- a/src/svc_generic.c
+++ b/src/svc_generic.c
@@ -283,6 +283,8 @@ svc_tli_create(fd, nconf, bindaddr, sendsz, recvsz)
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);
}
--
2.4.3
------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors
network devices and physical & virtual servers, alerts via email & sms
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
Libtirpc-devel mailing list
Libtirpc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libtirpc-devel

View File

@ -1,56 +0,0 @@
A rendezvouser socket is defined by a
xp_port value of (u_short)-1 which does
not work because xp_port is overwritten
by svc_com_create() and 65535 is a valid
port value.
To ensure actual connections get freed
properly in __svc_vc_dodestroy(), compare
the xp_recv value to rendezvous_request.
Reported-by: Michael Theall <mtheall@us.ibm.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
src/svc_vc.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/svc_vc.c b/src/svc_vc.c
index 9824631..6848c09 100644
--- a/src/svc_vc.c
+++ b/src/svc_vc.c
@@ -392,6 +392,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;
@@ -403,7 +409,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));
--
2.4.3
------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors
network devices and physical & virtual servers, alerts via email & sms
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
Libtirpc-devel mailing list
Libtirpc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libtirpc-devel

View File

@ -1,88 +0,0 @@
diff -Naur a/src/Makefile.am b/src/Makefile.am
--- a/src/Makefile.am 2015-06-16 17:35:08.000000000 +0200
+++ b/src/Makefile.am 2015-06-17 21:23:05.185276962 +0200
@@ -69,7 +69,7 @@
endif
libtirpc_la_SOURCES += key_call.c key_prot_xdr.c getpublickey.c
-libtirpc_la_SOURCES += netname.c netnamer.c rtime.c
+libtirpc_la_SOURCES += netname.c netnamer.c rpcdname.c rtime.c
CLEANFILES = cscope.* *~
DISTCLEANFILES = Makefile.in
diff -Naur a/src/rpcdname.c b/src/rpcdname.c
--- a/src/rpcdname.c 1970-01-01 01:00:00.000000000 +0100
+++ b/src/rpcdname.c 2015-06-17 21:23:05.186276982 +0200
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2009, Sun Microsystems, Inc.
+ * All rights reserved.
+ *
+ * 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 Sun Microsystems, 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.
+ */
+
+/*
+ * rpcdname.c
+ * Gets the default domain name
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+static char *default_domain = 0;
+
+static char *
+get_default_domain()
+{
+ char temp[256];
+
+ if (default_domain)
+ return (default_domain);
+ if (getdomainname(temp, sizeof(temp)) < 0)
+ return (0);
+ if ((int) strlen(temp) > 0) {
+ default_domain = (char *)malloc((strlen(temp)+(unsigned)1));
+ if (default_domain == 0)
+ return (0);
+ (void) strcpy(default_domain, temp);
+ return (default_domain);
+ }
+ return (0);
+}
+
+/*
+ * This is a wrapper for the system call getdomainname which returns a
+ * ypclnt.h error code in the failure case. It also checks to see that
+ * the domain name is non-null, knowing that the null string is going to
+ * get rejected elsewhere in the NIS client package.
+ */
+int
+__rpc_get_default_domain(domain)
+ char **domain;
+{
+ if ((*domain = get_default_domain()) != 0)
+ return (0);
+ return (-1);
+}

View File

@ -1,84 +0,0 @@
diff --git a/src/libtirpc.map b/src/libtirpc.map
index 449b769..13bc20a 100644
--- a/src/libtirpc.map
+++ b/src/libtirpc.map
@@ -321,6 +321,7 @@ TIRPC_0.3.3 {
__key_decryptsession_pk_LOCAL;
__key_encryptsession_pk_LOCAL;
__key_gendes_LOCAL;
+ authdes_pk_create;
} TIRPC_0.3.2;
TIRPC_PRIVATE {
diff --git a/src/rpc_soc.c b/src/rpc_soc.c
index e146ed4..03bc0d4 100644
--- a/src/rpc_soc.c
+++ b/src/rpc_soc.c
@@ -61,6 +61,7 @@
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+#include <rpcsvc/nis.h>
#include "rpc_com.h"
@@ -553,6 +554,46 @@ fallback:
}
/*
+ * Create the client des authentication object. Obsoleted by
+ * authdes_pk_seccreate().
+ */
+extern AUTH *authdes_pk_seccreate(const char *, netobj *, u_int, const char *,
+ const des_block *, nis_server *);
+
+AUTH *
+authdes_pk_create(servername, pkey, window, syncaddr, ckey)
+ char *servername; /* network name of server */
+ netobj *pkey; /* public key */
+ u_int window; /* time to live */
+ struct sockaddr *syncaddr; /* optional hostaddr to sync with */
+ des_block *ckey; /* optional conversation key to use */
+{
+ AUTH *nauth;
+ char hostname[NI_MAXHOST];
+
+ if (syncaddr) {
+ /*
+ * Change addr to hostname, because that is the way
+ * new interface takes it.
+ */
+ switch (syncaddr->sa_family) {
+ case AF_INET:
+ if (getnameinfo(syncaddr, sizeof(struct sockaddr_in), hostname,
+ sizeof hostname, NULL, 0, 0) != 0)
+ goto fallback;
+ break;
+ default:
+ goto fallback;
+ }
+ nauth = authdes_pk_seccreate(servername, pkey, window, hostname, ckey, NULL);
+ return (nauth);
+ }
+fallback:
+ return authdes_pk_seccreate(servername, pkey, window, NULL, ckey, NULL);
+}
+
+
+/*
* Create a client handle for a unix connection. Obsoleted by clnt_vc_create()
*/
CLIENT *
diff --git a/tirpc/rpc/auth.h b/tirpc/rpc/auth.h
index 3e44863..e67779c 100644
--- a/tirpc/rpc/auth.h
+++ b/tirpc/rpc/auth.h
@@ -313,6 +313,8 @@ extern AUTH *authnone_create(void); /* takes no parameters */
extern "C" {
#endif
extern AUTH *authdes_create (char *, u_int, struct sockaddr *, des_block *);
+extern AUTH *authdes_pk_create (char *, netobj *, u_int,
+ struct sockaddr *, des_block *);
extern AUTH *authdes_seccreate (const char *, const u_int, const char *,
const des_block *);
#ifdef __cplusplus

View File

@ -1,59 +0,0 @@
diff --git a/src/Makefile.am b/src/Makefile.am
index 18b1cec..a29f607 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,7 +54,7 @@ libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c cln
auth_time.c auth_des.c authdes_prot.c debug.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
+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
if SYMVERS
libtirpc_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libtirpc.map
diff --git a/src/libtirpc.map b/src/libtirpc.map
index 449b769..855d6b3 100644
--- a/src/libtirpc.map
+++ b/src/libtirpc.map
@@ -321,6 +321,7 @@ TIRPC_0.3.3 {
__key_encryptsession_pk_LOCAL;
__key_gendes_LOCAL;
authdes_pk_create;
+ xdr_sizeof;
} TIRPC_0.3.2;
TIRPC_PRIVATE {
diff --git a/src/xdr_sizeof.c b/src/xdr_sizeof.c
index cc5414b..4ecc977 100644
--- a/src/xdr_sizeof.c
+++ b/src/xdr_sizeof.c
@@ -90,7 +90,7 @@ x_inline(xdrs, len)
if (xdrs->x_op != XDR_ENCODE) {
return (NULL);
}
- if (len < (u_int)xdrs->x_base) {
+ if (len < (u_int) (long int) xdrs->x_base) {
/* x_private was already allocated */
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
@@ -102,7 +102,7 @@ x_inline(xdrs, len)
xdrs->x_base = 0;
return (NULL);
}
- xdrs->x_base = (caddr_t) len;
+ xdrs->x_base = (void *) (long) len;
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
}
diff --git a/tirpc/rpc/xdr.h b/tirpc/rpc/xdr.h
index 64069ab..904e5bb 100644
--- a/tirpc/rpc/xdr.h
+++ b/tirpc/rpc/xdr.h
@@ -327,6 +327,7 @@ extern bool_t xdr_hyper(XDR *, quad_t *);
extern bool_t xdr_u_hyper(XDR *, u_quad_t *);
extern bool_t xdr_longlong_t(XDR *, quad_t *);
extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *);
+extern u_long xdr_sizeof(xdrproc_t, void *);
#ifdef __cplusplus
}
#endif

View File

@ -1,39 +0,0 @@
diff --git a/src/rpc_soc.c b/src/rpc_soc.c
index e146ed4..9d555d3 100644
--- a/src/rpc_soc.c
+++ b/src/rpc_soc.c
@@ -531,7 +531,6 @@ authdes_create(servername, window, syncaddr, ckey)
struct sockaddr *syncaddr; /* optional hostaddr to sync with */
des_block *ckey; /* optional conversation key to use */
{
- AUTH *dummy;
AUTH *nauth;
char hostname[NI_MAXHOST];
@@ -540,16 +539,20 @@ authdes_create(servername, window, syncaddr, ckey)
* Change addr to hostname, because that is the way
* new interface takes it.
*/
- if (getnameinfo(syncaddr, sizeof(syncaddr), hostname,
- sizeof hostname, NULL, 0, 0) != 0)
- goto fallback;
-
+ switch (syncaddr->sa_family) {
+ case AF_INET:
+ if (getnameinfo(syncaddr, sizeof(struct sockaddr_in), hostname,
+ sizeof hostname, NULL, 0, 0) != 0)
+ goto fallback;
+ break;
+ default:
+ goto fallback;
+ }
nauth = authdes_seccreate(servername, window, hostname, ckey);
return (nauth);
}
fallback:
- dummy = authdes_seccreate(servername, window, NULL, ckey);
- return (dummy);
+ return authdes_seccreate(servername, window, NULL, ckey);
}
/*

View File

@ -1,12 +0,0 @@
diff --git a/tirpc/rpc/svc.h b/tirpc/rpc/svc.h
index 8273c95..f647095 100644
--- a/tirpc/rpc/svc.h
+++ b/tirpc/rpc/svc.h
@@ -88,6 +88,7 @@ enum xprt_stat {
*/
typedef struct __rpc_svcxprt {
int xp_fd;
+#define xp_sock xp_fd
u_short xp_port; /* associated port number */
const struct xp_ops {
/* receive incoming requests */

View File

@ -1 +1 @@
libtirpc1 libtirpc3

View File

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

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

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

View File

@ -1,3 +1,35 @@
-------------------------------------------------------------------
Tue Nov 17 12:55:40 CET 2015 - kukuk@suse.de
- Update to libtirpc-1.0.1
- new major soname
- Adjust auth code to match other RPC implementations
- Implement more gss auth stuff
- use poll() instead of select() in svc_run()
- Add more sunrpc compat functions
- Sync compat headers with real functions
- Drop 005-missing-symvers.patch (upstream)
- Drop 006-memleak1.patch (upstream)
- Drop 007-memleak2.patch (upstream)
- Drop 008-fix-undef-ref.patch (upstream)
- Drop 009-authdes_pk_create.patch (upstream)
- Drop 010-xdr_sizeof.patch (upstream)
- Drop 011-authdes_create.patch (upstream)
- Drop 012-xp_sock.patch (upstream)
- Drop 099-poll.patch (upstream)
- Add 005-libtirpc-1.0.2-rc1.patch (fixes deadlock)
-------------------------------------------------------------------
Thu Jul 16 15:46:00 CEST 2015 - kukuk@suse.de
- Update 099-poll.patch with newest version send upstream.
-------------------------------------------------------------------
Fri Jul 10 14:56:02 CEST 2015 - kukuk@suse.de
- Add 099-poll.patch: change svc_run from select() to poll().
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Jul 9 10:47:08 CEST 2015 - kukuk@suse.de Thu Jul 9 10:47:08 CEST 2015 - kukuk@suse.de

View File

@ -17,9 +17,8 @@
Name: libtirpc Name: libtirpc
# src/crypt_client.c tirpc/spinlock.h and tirpc/rpcsvc/crypt.x have the BSD # src/crypt_client.c and tirpc/rpcsvc/crypt.x have the BSD advertising clause
# advertising clause Version: 1.0.1
Version: 0.3.2
Release: 0 Release: 0
Summary: Transport Independent RPC Library Summary: Transport Independent RPC Library
License: BSD-4-Clause License: BSD-4-Clause
@ -33,26 +32,18 @@ BuildRequires: autoconf
BuildRequires: libtool BuildRequires: libtool
BuildRequires: pkg-config BuildRequires: pkg-config
Url: http://sourceforge.net/projects/libtirpc/ Url: http://sourceforge.net/projects/libtirpc/
# http://downloads.sourceforge.net/project/%{name}/%{name}/%{version}/%{name}-%{version}.tar.bz2
Source: %{name}-%{version}.tar.bz2 Source: %{name}-%{version}.tar.bz2
Source1: baselibs.conf Source1: baselibs.conf
Patch0: 000-bindresvport_blacklist.patch Patch0: 000-bindresvport_blacklist.patch
# Patch2 is only needed for SLES11 # Patch2 is only needed for SLES11
Patch2: 002-old-automake.patch Patch2: 002-old-automake.patch
Patch4: 004-netconfig-prefer-IPv6.patch Patch4: 004-netconfig-prefer-IPv6.patch
Patch5: 005-missing-symvers.patch Patch5: 005-libtirpc-1.0.2-rc1.patch
Patch6: 006-memleak1.patch
Patch7: 007-memleak2.patch
Patch8: 008-fix-undef-ref.patch
Patch9: 009-authdes_pk_create.patch
Patch10: 010-xdr_sizeof.patch
Patch11: 011-authdes_create.patch
Patch12: 012-xp_sock.patch
Patch25: patch6_7.diff Patch25: patch6_7.diff
# Patch37 is only needed on openSUSE >= 13.1, SLE >= 12 # Patch37 is only needed on openSUSE >= 13.1, SLE >= 12
Patch37: libtirpc-new-path-rpcbindsock.patch Patch37: libtirpc-new-path-rpcbindsock.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build
%define debug_package_requires libtirpc1 = %{version}-%{release} %define debug_package_requires libtirpc3 = %{version}-%{release}
%description %description
The Transport Independent RPC library (TI-RPC) is a replacement for the The Transport Independent RPC library (TI-RPC) is a replacement for the
@ -60,11 +51,11 @@ standard SunRPC library in glibc which does not support IPv6 addresses.
This implementation allows the support of other transports than UDP and This implementation allows the support of other transports than UDP and
TCP over IPv4 TCP over IPv4
%package -n libtirpc1 %package -n libtirpc3
Summary: Transport Independent RPC Library Summary: Transport Independent RPC Library
Group: System/Libraries Group: System/Libraries
%description -n libtirpc1 %description -n libtirpc3
The Transport Independent RPC library (TI-RPC) is a replacement for the The Transport Independent RPC library (TI-RPC) is a replacement for the
standard SunRPC library in glibc which does not support IPv6 addresses. standard SunRPC library in glibc which does not support IPv6 addresses.
This implementation allows the support of other transports than UDP and This implementation allows the support of other transports than UDP and
@ -76,7 +67,7 @@ TCP over IPv4
Summary: Transport Independent RPC Library Summary: Transport Independent RPC Library
Group: Development/Libraries/C and C++ Group: Development/Libraries/C and C++
Requires: glibc-devel Requires: glibc-devel
Requires: libtirpc1 = %{version} Requires: libtirpc3 = %{version}
%description devel %description devel
The Transport Independent RPC library (TI-RPC) is a replacement for the The Transport Independent RPC library (TI-RPC) is a replacement for the
@ -90,13 +81,6 @@ TCP over IPv4
%patch2 -p1 %patch2 -p1
%patch4 -p1 %patch4 -p1
%patch5 -p1 %patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch25 -p1 %patch25 -p1
%if 0%{suse_version} >= 1310 %if 0%{suse_version} >= 1310
%patch37 -p1 %patch37 -p1
@ -118,7 +102,7 @@ export STRIP_KEEP_SYMTAB=libtirpc*.so*
# NO_BRP_CHECK_ROOTFS is for SLES11 only, but does not harm for Factory # NO_BRP_CHECK_ROOTFS is for SLES11 only, but does not harm for Factory
export NO_BRP_CHECK_ROOTFS=true export NO_BRP_CHECK_ROOTFS=true
make install DESTDIR=$RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT
# move devel so link to %{_libdir} # move devel so link to _libdir
mkdir -p $RPM_BUILD_ROOT%{_libdir} mkdir -p $RPM_BUILD_ROOT%{_libdir}
%{__ln_s} -v /%{_lib}/$(readlink %{buildroot}/%{_lib}/%{name}.so) %{buildroot}%{_libdir}/%{name}.so %{__ln_s} -v /%{_lib}/$(readlink %{buildroot}/%{_lib}/%{name}.so) %{buildroot}%{_libdir}/%{name}.so
%{__rm} -v %{buildroot}/%{_lib}/%{name}.{la,so} %{__rm} -v %{buildroot}/%{_lib}/%{name}.{la,so}
@ -127,14 +111,14 @@ mv -v $RPM_BUILD_ROOT/%{_lib}/pkgconfig $RPM_BUILD_ROOT/%{_libdir}
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%post -n libtirpc1 -p /sbin/ldconfig %post -n libtirpc3 -p /sbin/ldconfig
%postun -n libtirpc1 -p /sbin/ldconfig %postun -n libtirpc3 -p /sbin/ldconfig
%files -n libtirpc1 %files -n libtirpc3
%defattr(-,root,root) %defattr(-,root,root)
%config %{_sysconfdir}/netconfig %config %{_sysconfdir}/netconfig
/%{_lib}/libtirpc.so.1* /%{_lib}/libtirpc.so.3*
%{_mandir}/man5/netconfig.5.gz %{_mandir}/man5/netconfig.5.gz
%files devel %files devel