From 99fdd6b0d8b795ec3bd9ad841fa6c8405854de95 Mon Sep 17 00:00:00 2001 From: Steve Dickson Date: Sun, 29 Jul 2018 12:43:48 -0400 Subject: [PATCH] Update the libtirpc-1.0.4-rc2.patch to include big endian fixes (bz 1609208) Signed-off-by: Steve Dickson --- libtirpc-1.0.4-rc2.patch | 178 ++++++++++++++++++++++++++++++++++++++- libtirpc.spec | 3 + 2 files changed, 180 insertions(+), 1 deletion(-) diff --git a/libtirpc-1.0.4-rc2.patch b/libtirpc-1.0.4-rc2.patch index 342e199..35b38cf 100644 --- a/libtirpc-1.0.4-rc2.patch +++ b/libtirpc-1.0.4-rc2.patch @@ -1,3 +1,41 @@ +diff --git a/src/clnt_dg.c b/src/clnt_dg.c +index 04a2aba..eb5467f 100644 +--- a/src/clnt_dg.c ++++ b/src/clnt_dg.c +@@ -160,15 +160,22 @@ clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz) + thr_sigsetmask(SIG_SETMASK, &newmask, &mask); + mutex_lock(&clnt_fd_lock); + if (dg_fd_locks == (int *) NULL) { +- int cv_allocsz; +- size_t fd_allocsz; +- int dtbsize = __rpc_dtbsize(); ++ size_t cv_allocsz, fd_allocsz; ++ unsigned int dtbsize = __rpc_dtbsize(); ++ ++ if ( (size_t) dtbsize > SIZE_MAX/sizeof(cond_t)) { ++ mutex_unlock(&clnt_fd_lock); ++ thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ errno = EOVERFLOW; ++ goto err1; ++ } + + fd_allocsz = dtbsize * sizeof (int); + dg_fd_locks = (int *) mem_alloc(fd_allocsz); + if (dg_fd_locks == (int *) NULL) { + mutex_unlock(&clnt_fd_lock); + thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ errno = ENOMEM; + goto err1; + } else + memset(dg_fd_locks, '\0', fd_allocsz); +@@ -180,6 +187,7 @@ clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz) + dg_fd_locks = (int *) NULL; + mutex_unlock(&clnt_fd_lock); + thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ errno = ENOMEM; + goto err1; + } else { + int i; diff --git a/src/clnt_generic.c b/src/clnt_generic.c index e5a314f..3f3dabf 100644 --- a/src/clnt_generic.c @@ -20,6 +58,55 @@ index e5a314f..3f3dabf 100644 } else { if (!__rpc_fd2sockinfo(fd, &si)) goto err; +diff --git a/src/clnt_vc.c b/src/clnt_vc.c +index 6098c3a..3d775c7 100644 +--- a/src/clnt_vc.c ++++ b/src/clnt_vc.c +@@ -63,6 +63,7 @@ + #include + #include + #include ++#include + + #include + #include "rpc_com.h" +@@ -201,14 +202,25 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz) + thr_sigsetmask(SIG_SETMASK, &newmask, &mask); + mutex_lock(&clnt_fd_lock); + if (vc_fd_locks == (int *) NULL) { +- int cv_allocsz, fd_allocsz; +- int dtbsize = __rpc_dtbsize(); ++ size_t cv_allocsz, fd_allocsz; ++ unsigned int dtbsize = __rpc_dtbsize(); ++ struct rpc_createerr *ce = &get_rpc_createerr(); ++ ++ if ( (size_t) dtbsize > SIZE_MAX/sizeof(cond_t)) { ++ mutex_unlock(&clnt_fd_lock); ++ thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ ce->cf_stat = RPC_SYSTEMERROR; ++ ce->cf_error.re_errno = EOVERFLOW; ++ goto err; ++ } + + fd_allocsz = dtbsize * sizeof (int); + vc_fd_locks = (int *) mem_alloc(fd_allocsz); + if (vc_fd_locks == (int *) NULL) { + mutex_unlock(&clnt_fd_lock); + thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ ce->cf_stat = RPC_SYSTEMERROR; ++ ce->cf_error.re_errno = ENOMEM; + goto err; + } else + memset(vc_fd_locks, '\0', fd_allocsz); +@@ -221,6 +233,8 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz) + vc_fd_locks = (int *) NULL; + mutex_unlock(&clnt_fd_lock); + thr_sigsetmask(SIG_SETMASK, &(mask), NULL); ++ ce->cf_stat = RPC_SYSTEMERROR; ++ ce->cf_error.re_errno = ENOMEM; + goto err; + } else { + int i; diff --git a/src/rpc_soc.c b/src/rpc_soc.c index af6c482..5a6eeb7 100644 --- a/src/rpc_soc.c @@ -44,7 +131,7 @@ index af6c482..5a6eeb7 100644 sendsz, recvsz); if (cl) { diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c -index a94fc73..4b44364 100644 +index a94fc73..e45736a 100644 --- a/src/rpcb_clnt.c +++ b/src/rpcb_clnt.c @@ -752,7 +752,7 @@ __try_protocol_version_2(program, version, nconf, host, tp) @@ -96,3 +183,92 @@ index a94fc73..4b44364 100644 } #endif +@@ -836,6 +846,7 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp) + struct netbuf *address = NULL; + rpcvers_t start_vers = RPCBVERS4; + struct netbuf servaddr; ++ struct rpc_err rpcerr; + + /* parameter checking */ + if (nconf == NULL) { +@@ -892,7 +903,8 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp) + clnt_st = CLNT_CALL(client, (rpcproc_t)RPCBPROC_GETADDR, + (xdrproc_t) xdr_rpcb, (char *)(void *)&parms, + (xdrproc_t) xdr_wrapstring, (char *)(void *) &ua, *tp); +- if (clnt_st == RPC_SUCCESS) { ++ switch (clnt_st) { ++ case RPC_SUCCESS: + if ((ua == NULL) || (ua[0] == 0)) { + /* address unknown */ + rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED; +@@ -914,12 +926,15 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp) + (char *)(void *)&servaddr); + __rpc_fixup_addr(address, &servaddr); + goto done; +- } else if (clnt_st == RPC_PROGVERSMISMATCH) { +- struct rpc_err rpcerr; ++ case RPC_PROGVERSMISMATCH: + clnt_geterr(client, &rpcerr); + if (rpcerr.re_vers.low > RPCBVERS4) + goto error; /* a new version, can't handle */ +- } else if (clnt_st != RPC_PROGUNAVAIL) { ++ /* Try the next lower version */ ++ case RPC_PROGUNAVAIL: ++ case RPC_CANTDECODEARGS: ++ break; ++ default: + /* Cant handle this error */ + rpc_createerr.cf_stat = clnt_st; + clnt_geterr(client, &rpc_createerr.cf_error); +@@ -929,7 +944,7 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp) + + #ifdef PORTMAP /* Try version 2 for TCP or UDP */ + if (strcmp(nconf->nc_protofmly, NC_INET) == 0) { +- address = __try_protocol_version_2(program, 2, nconf, host, tp); ++ address = __try_protocol_version_2(program, version, nconf, host, tp); + if (address == NULL) + goto error; + } +diff --git a/src/xdr_stdio.c b/src/xdr_stdio.c +index 4410262..846c7bf 100644 +--- a/src/xdr_stdio.c ++++ b/src/xdr_stdio.c +@@ -38,6 +38,7 @@ + */ + + #include ++#include + + #include + #include +@@ -103,10 +104,12 @@ xdrstdio_getlong(xdrs, lp) + XDR *xdrs; + long *lp; + { ++ int32_t mycopy; + +- if (fread(lp, sizeof(int32_t), 1, (FILE *)xdrs->x_private) != 1) ++ if (fread(&mycopy, sizeof(int32_t), 1, (FILE *)xdrs->x_private) != 1) + return (FALSE); +- *lp = (long)ntohl((u_int32_t)*lp); ++ ++ *lp = (long)ntohl(mycopy); + return (TRUE); + } + +@@ -115,8 +118,14 @@ xdrstdio_putlong(xdrs, lp) + XDR *xdrs; + const long *lp; + { +- long mycopy = (long)htonl((u_int32_t)*lp); ++ int32_t mycopy; ++ ++#if defined(_LP64) ++ if ((*lp > UINT32_MAX) || (*lp < INT32_MIN)) ++ return (FALSE); ++#endif + ++ mycopy = (int32_t)htonl((int32_t)*lp); + if (fwrite(&mycopy, sizeof(int32_t), 1, (FILE *)xdrs->x_private) != 1) + return (FALSE); + return (TRUE); diff --git a/libtirpc.spec b/libtirpc.spec index 034d327..f97def6 100644 --- a/libtirpc.spec +++ b/libtirpc.spec @@ -127,6 +127,9 @@ mv %{buildroot}%{_mandir}/man3 %{buildroot}%{_mandir}/man3t %{_mandir}/*/* %changelog +* Sun Jul 29 2018 Steve Dickson 1.0.3-2.rc2 +- Update the libtirpc-1.0.4-rc2.patch to include big endian fixes (bz 1609208) + * Fri Jul 20 2018 Steve Dickson 1.0.3-2.rc2 - Updated to latest upstream RC release: libtirpc-1-0-4-rc2