diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..df50e94 --- /dev/null +++ b/configure.ac @@ -0,0 +1,29 @@ +AC_INIT(libtirpc, 0.2.0) +AM_INIT_AUTOMAKE(libtirpc, 0.2.0) +AM_MAINTAINER_MODE +AC_CONFIG_SRCDIR([src/auth_des.c]) + +AC_ARG_ENABLE(gss,[ --enable-gss Turn on gss api], [case "${enableval}" in + yes) gss=true ; AC_CHECK_LIB([gssapi],[gss_init_sec_context]) ;; + no) gss=false ;; + *) 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 + AC_DEFINE(HAVE_LIBGSSAPI, 1, []) + PKG_CHECK_MODULES(GSSGLUE, libgssglue, [], + AC_MSG_ERROR([Unable to locate information required to use libgssglue.])) +fi + +AC_PROG_CC +AM_CONFIG_HEADER(config.h) +AC_PROG_LIBTOOL +##AC_PROG_RANLIB +AC_HEADER_DIRENT +AC_PREFIX_DEFAULT(/usr) +AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h]) +AC_CHECK_LIB([pthread], [pthread_create]) + + +AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile]) +AC_OUTPUT(libtirpc.pc) diff --git a/configure.in b/configure.in deleted file mode 100644 index bacb265..0000000 --- a/configure.in +++ /dev/null @@ -1,28 +0,0 @@ -AC_INIT(libtirpc, 0.2.0) -AM_INIT_AUTOMAKE(libtirpc, 0.2.0) -AM_MAINTAINER_MODE -AC_CONFIG_SRCDIR([src/auth_des.c]) - -AC_ARG_ENABLE(gss,[ --enable-gss Turn on gss api], [case "${enableval}" in - yes) gss=true ; AC_CHECK_LIB([gssapi],[gss_init_sec_context]) ;; - no) gss=false ;; - *) 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 -AM_CONFIG_HEADER(config.h) -AC_PROG_LIBTOOL -##AC_PROG_RANLIB -AC_HEADER_DIRENT -AC_PREFIX_DEFAULT(/usr) -AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h]) -AC_CHECK_LIB([pthread], [pthread_create]) - - -AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile]) -AC_OUTPUT(libtirpc.pc) diff --git a/src/authgss_prot.c b/src/authgss_prot.c index be0d1a6..ab72d91 100644 --- a/src/authgss_prot.c +++ b/src/authgss_prot.c @@ -54,7 +54,7 @@ xdr_rpc_gss_cred(XDR *xdrs, struct rpc_gss_cred *p) xdr_u_int(xdrs, &p->gc_seq) && xdr_enum(xdrs, (enum_t *)&p->gc_svc) && xdr_bytes(xdrs, (char **)&p->gc_ctx.value, - &p->gc_ctx.length, MAX_AUTH_BYTES)); + (u_int *)&p->gc_ctx.length, MAX_AUTH_BYTES)); log_debug("xdr_rpc_gss_cred: %s %s " "(v %d, proc %d, seq %d, svc %d, ctx %p:%d)", @@ -72,7 +72,7 @@ xdr_rpc_gss_init_args(XDR *xdrs, gss_buffer_desc *p) bool_t xdr_stat; xdr_stat = xdr_bytes(xdrs, (char **)&p->value, - &p->length, MAX_NETOBJ_SZ); + (u_int *)&p->length, MAX_NETOBJ_SZ); log_debug("xdr_rpc_gss_init_args: %s %s (token %p:%d)", (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode", @@ -88,12 +88,12 @@ xdr_rpc_gss_init_res(XDR *xdrs, struct rpc_gss_init_res *p) bool_t xdr_stat; xdr_stat = (xdr_bytes(xdrs, (char **)&p->gr_ctx.value, - &p->gr_ctx.length, MAX_NETOBJ_SZ) && + (u_int *)&p->gr_ctx.length, MAX_NETOBJ_SZ) && xdr_u_int(xdrs, &p->gr_major) && xdr_u_int(xdrs, &p->gr_minor) && xdr_u_int(xdrs, &p->gr_win) && xdr_bytes(xdrs, (char **)&p->gr_token.value, - &p->gr_token.length, MAX_NETOBJ_SZ)); + (u_int *)&p->gr_token.length, MAX_NETOBJ_SZ)); log_debug("xdr_rpc_gss_init_res %s %s " "(ctx %p:%d, maj %d, min %d, win %d, token %p:%d)", @@ -135,7 +135,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, if (svc == RPCSEC_GSS_SVC_INTEGRITY) { /* Marshal databody_integ length. */ XDR_SETPOS(xdrs, start); - if (!xdr_u_int(xdrs, &databuf.length)) + if (!xdr_u_int(xdrs, (u_int *)&databuf.length)) return (FALSE); /* Checksum rpc_gss_data_t. */ @@ -148,7 +148,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, /* Marshal checksum. */ XDR_SETPOS(xdrs, end); xdr_stat = xdr_bytes(xdrs, (char **)&wrapbuf.value, - &wrapbuf.length, MAX_NETOBJ_SZ); + (u_int *)&wrapbuf.length, MAX_NETOBJ_SZ); gss_release_buffer(&min_stat, &wrapbuf); } else if (svc == RPCSEC_GSS_SVC_PRIVACY) { @@ -162,7 +162,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, /* Marshal databody_priv. */ XDR_SETPOS(xdrs, start); xdr_stat = xdr_bytes(xdrs, (char **)&wrapbuf.value, - &wrapbuf.length, MAX_NETOBJ_SZ); + (u_int *)&wrapbuf.length, MAX_NETOBJ_SZ); gss_release_buffer(&min_stat, &wrapbuf); } return (xdr_stat); @@ -188,13 +188,13 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, if (svc == RPCSEC_GSS_SVC_INTEGRITY) { /* Decode databody_integ. */ - if (!xdr_bytes(xdrs, (char **)&databuf.value, &databuf.length, + if (!xdr_bytes(xdrs, (char **)&databuf.value, (u_int *)&databuf.length, MAX_NETOBJ_SZ)) { log_debug("xdr decode databody_integ failed"); return (FALSE); } /* Decode checksum. */ - if (!xdr_bytes(xdrs, (char **)&wrapbuf.value, &wrapbuf.length, + if (!xdr_bytes(xdrs, (char **)&wrapbuf.value, (u_int *)&wrapbuf.length, MAX_NETOBJ_SZ)) { gss_release_buffer(&min_stat, &databuf); log_debug("xdr decode checksum failed"); @@ -213,7 +213,7 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, } else if (svc == RPCSEC_GSS_SVC_PRIVACY) { /* Decode databody_priv. */ - if (!xdr_bytes(xdrs, (char **)&wrapbuf.value, &wrapbuf.length, + if (!xdr_bytes(xdrs, (char **)&wrapbuf.value, (u_int *)&wrapbuf.length, MAX_NETOBJ_SZ)) { log_debug("xdr decode databody_priv failed"); return (FALSE); diff --git a/src/bindresvport.c b/src/bindresvport.c index 730dc6b..6ce3e81 100644 --- a/src/bindresvport.c +++ b/src/bindresvport.c @@ -88,11 +88,10 @@ bindresvport_sa(sd, sa) salen = sizeof(myaddr); sa = (struct sockaddr *)&myaddr; - if (getsockname(sd, sa, &salen) == -1) + if (getsockname(sd, (struct sockaddr *)&myaddr, &salen) == -1) return -1; /* errno is correctly set */ - af = sa->sa_family; - memset(sa, 0, salen); + af = myaddr.ss_family; } else af = sa->sa_family; diff --git a/src/clnt_bcast.c b/src/clnt_bcast.c index fef7a4b..140407b 100644 --- a/src/clnt_bcast.c +++ b/src/clnt_bcast.c @@ -586,13 +586,12 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, struct netbuf *np; #ifdef PORTMAP struct netbuf taddr; - struct sockaddr_in *sin; + struct sockaddr_in sin; if (pmap_flag && pmap_reply_flag) { - sin = (struct sockaddr_in *) - (void *)&fdlist[i].raddr; - sin->sin_port = - htons((u_short)port); + memcpy(&sin, &fdlist[i].raddr, sizeof(sin)); + sin.sin_port = htons((u_short)port); + memcpy(&fdlist[i].raddr, &sin, sizeof(sin)); taddr.len = taddr.maxlen = sizeof(fdlist[i].raddr); taddr.buf = &fdlist[i].raddr; diff --git a/src/clnt_dg.c b/src/clnt_dg.c index 2f870b1..79fed5d 100644 --- a/src/clnt_dg.c +++ b/src/clnt_dg.c @@ -312,7 +312,7 @@ clnt_dg_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout) socklen_t inlen, salen; ssize_t recvlen = 0; int rpc_lock_value; - u_int32_t xid; + u_int32_t xid, inval, outval; outlen = 0; sigfillset(&newmask); @@ -475,15 +475,23 @@ get_reply: cu->cu_error.re_status = RPC_CANTRECV; goto out; } - if (recvlen >= sizeof(u_int32_t) && - (cu->cu_async == TRUE || - *((u_int32_t *)(void *)(cu->cu_inbuf)) == - *((u_int32_t *)(void *)(cu->cu_outbuf)))) - inlen = (socklen_t)recvlen; - else { - total_time -= tv; - goto send_again; - } + + if (recvlen < sizeof(u_int32_t)) { + total_time -= tv; + goto send_again; + } + + if (cu->cu_async == TRUE) + inlen = (socklen_t)recvlen; + else { + memcpy(&inval, cu->cu_inbuf, sizeof(u_int32_t)); + memcpy(&outval, cu->cu_outbuf, sizeof(u_int32_t)); + if (inval != outval) { + total_time -= tv; + goto send_again; + } + inlen = (socklen_t)recvlen; + } /* * now decode and validate the response diff --git a/src/mt_misc.c b/src/mt_misc.c index 94bb645..4cba143 100644 --- a/src/mt_misc.c +++ b/src/mt_misc.c @@ -120,7 +120,7 @@ __rpc_createerr() return (rce_addr); } -void __attribute ((descructor)) tsd_key_delete(void) +void tsd_key_delete(void) { if (clnt_broadcast_key != -1) thr_keydelete(clnt_broadcast_key); diff --git a/src/rpc_generic.c b/src/rpc_generic.c index 8219483..541275c 100644 --- a/src/rpc_generic.c +++ b/src/rpc_generic.c @@ -812,6 +812,11 @@ int __rpc_sockisbound(int fd) { struct sockaddr_storage ss; + union { + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr_un usin; + } u_addr; socklen_t slen; slen = sizeof (struct sockaddr_storage); @@ -820,17 +825,17 @@ __rpc_sockisbound(int fd) switch (ss.ss_family) { case AF_INET: - return (((struct sockaddr_in *) - (void *)&ss)->sin_port != 0); + memcpy(&u_addr.sin, &ss, sizeof(u_addr.sin)); + return (u_addr.sin.sin_port != 0); #ifdef INET6 case AF_INET6: - return (((struct sockaddr_in6 *) - (void *)&ss)->sin6_port != 0); + memcpy(&u_addr.sin6, &ss, sizeof(u_addr.sin6)); + return (u_addr.sin6.sin6_port != 0); #endif case AF_LOCAL: /* XXX check this */ - return (((struct sockaddr_un *) - (void *)&ss)->sun_path[0] != '\0'); + memcpy(&u_addr.usin, &ss, sizeof(u_addr.usin)); + return (u_addr.usin.sun_path[0] != 0); default: break; } diff --git a/src/svc.c b/src/svc.c index a61c14b..cc65e6a 100644 --- a/src/svc.c +++ b/src/svc.c @@ -77,7 +77,9 @@ static struct svc_callout extern rwlock_t svc_lock; extern rwlock_t svc_fd_lock; +#ifdef HAVE_LIBGSSAPI extern struct svc_auth_ops svc_auth_gss_ops; +#endif static struct svc_callout *svc_find (rpcprog_t, rpcvers_t, struct svc_callout **, char *); @@ -715,9 +717,11 @@ svc_getreq_common (fd) SVC_DESTROY (xprt); break; } - else if ((xprt->xp_auth != NULL) && - (xprt->xp_auth->svc_ah_ops != &svc_auth_gss_ops)) - { + else if ((xprt->xp_auth != NULL) +#ifdef HAVE_LIBGSSAPI + && (xprt->xp_auth->svc_ah_ops != &svc_auth_gss_ops) +#endif + ) { xprt->xp_auth = NULL; } } diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c index 9e9ff81..54b23b1 100644 --- a/src/svc_auth_gss.c +++ b/src/svc_auth_gss.c @@ -121,7 +121,7 @@ svcauth_gss_import_name(char *service) namebuf.length = strlen(service); maj_stat = gss_import_name(&min_stat, &namebuf, - GSS_C_NT_HOSTBASED_SERVICE, &name); + (gss_OID)GSS_C_NT_HOSTBASED_SERVICE, &name); if (maj_stat != GSS_S_COMPLETE) { log_status("gss_import_name", maj_stat, min_stat); diff --git a/src/xdr_float.c b/src/xdr_float.c index 4c5b28a..114b192 100644 --- a/src/xdr_float.c +++ b/src/xdr_float.c @@ -54,16 +54,6 @@ * This routine works on machines with IEEE754 FP and Vaxen. */ -#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(__powerpc__) || defined(__s390__) || defined(__arm__) || \ - defined(__sh__) -#include -#define IEEEFP -#endif - #if defined(__vax__) /* What IEEE single precision floating point looks like on a Vax */ @@ -93,6 +83,11 @@ static struct sgl_limits { {{ 0x0, 0x0, 0x0, 0x0 }, /* Min Vax */ { 0x0, 0x0, 0x0 }} /* Min IEEE */ }; +#else + +#include +#define IEEEFP + #endif /* vax */ bool_t