diff options
| -rw-r--r-- | meta/recipes-extended/rpcbind/rpcbind/rpcbproc_callit_com-Stop-freeing-a-static-pointer.patch | 100 | ||||
| -rw-r--r-- | meta/recipes-extended/rpcbind/rpcbind_0.2.4.bb | 1 |
2 files changed, 101 insertions, 0 deletions
diff --git a/meta/recipes-extended/rpcbind/rpcbind/rpcbproc_callit_com-Stop-freeing-a-static-pointer.patch b/meta/recipes-extended/rpcbind/rpcbind/rpcbproc_callit_com-Stop-freeing-a-static-pointer.patch new file mode 100644 index 0000000000..9a000d0285 --- /dev/null +++ b/meta/recipes-extended/rpcbind/rpcbind/rpcbproc_callit_com-Stop-freeing-a-static-pointer.patch | |||
| @@ -0,0 +1,100 @@ | |||
| 1 | From 7c7590ad536c0e24bef790cb1e65702fc54db566 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Steve Dickson <steved@redhat.com> | ||
| 3 | Date: Tue, 30 May 2017 11:27:22 -0400 | ||
| 4 | Subject: [PATCH] rpcbproc_callit_com: Stop freeing a static pointer | ||
| 5 | |||
| 6 | commit 7ea36ee introduced a svc_freeargs() call | ||
| 7 | that ended up freeing static pointer. | ||
| 8 | |||
| 9 | It turns out the allocations for the rmt_args | ||
| 10 | is not necessary . The xdr routines (xdr_bytes) will | ||
| 11 | handle the memory management and the largest | ||
| 12 | possible message size is UDPMSGSIZE (due to UDP only) | ||
| 13 | which is smaller than RPC_BUF_MAX | ||
| 14 | |||
| 15 | Signed-off-by: Steve Dickson <steved@redhat.com> | ||
| 16 | |||
| 17 | Upstream-Status: Backport | ||
| 18 | |||
| 19 | Signed-off-by: Jackie Huang <jackie.huang@windriver.com> | ||
| 20 | --- | ||
| 21 | src/rpcb_svc_com.c | 39 ++++++--------------------------------- | ||
| 22 | 1 file changed, 6 insertions(+), 33 deletions(-) | ||
| 23 | |||
| 24 | diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c | ||
| 25 | index cb63afd..1fc2229 100644 | ||
| 26 | --- a/src/rpcb_svc_com.c | ||
| 27 | +++ b/src/rpcb_svc_com.c | ||
| 28 | @@ -612,9 +612,9 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, | ||
| 29 | struct netconfig *nconf; | ||
| 30 | struct netbuf *caller; | ||
| 31 | struct r_rmtcall_args a; | ||
| 32 | - char *buf_alloc = NULL, *outbufp; | ||
| 33 | + char *outbufp; | ||
| 34 | char *outbuf_alloc = NULL; | ||
| 35 | - char buf[RPC_BUF_MAX], outbuf[RPC_BUF_MAX]; | ||
| 36 | + char outbuf[RPC_BUF_MAX]; | ||
| 37 | struct netbuf *na = (struct netbuf *) NULL; | ||
| 38 | struct rpc_msg call_msg; | ||
| 39 | int outlen; | ||
| 40 | @@ -635,36 +635,10 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, | ||
| 41 | } | ||
| 42 | if (si.si_socktype != SOCK_DGRAM) | ||
| 43 | return; /* Only datagram type accepted */ | ||
| 44 | - sendsz = __rpc_get_t_size(si.si_af, si.si_proto, UDPMSGSIZE); | ||
| 45 | - if (sendsz == 0) { /* data transfer not supported */ | ||
| 46 | - if (reply_type == RPCBPROC_INDIRECT) | ||
| 47 | - svcerr_systemerr(transp); | ||
| 48 | - return; | ||
| 49 | - } | ||
| 50 | - /* | ||
| 51 | - * Should be multiple of 4 for XDR. | ||
| 52 | - */ | ||
| 53 | - sendsz = ((sendsz + 3) / 4) * 4; | ||
| 54 | - if (sendsz > RPC_BUF_MAX) { | ||
| 55 | -#ifdef notyet | ||
| 56 | - buf_alloc = alloca(sendsz); /* not in IDR2? */ | ||
| 57 | -#else | ||
| 58 | - buf_alloc = malloc(sendsz); | ||
| 59 | -#endif /* notyet */ | ||
| 60 | - if (buf_alloc == NULL) { | ||
| 61 | - if (debugging) | ||
| 62 | - xlog(LOG_DEBUG, | ||
| 63 | - "rpcbproc_callit_com: No Memory!\n"); | ||
| 64 | - if (reply_type == RPCBPROC_INDIRECT) | ||
| 65 | - svcerr_systemerr(transp); | ||
| 66 | - return; | ||
| 67 | - } | ||
| 68 | - a.rmt_args.args = buf_alloc; | ||
| 69 | - } else { | ||
| 70 | - a.rmt_args.args = buf; | ||
| 71 | - } | ||
| 72 | + sendsz = UDPMSGSIZE; | ||
| 73 | |||
| 74 | call_msg.rm_xid = 0; /* For error checking purposes */ | ||
| 75 | + memset(&a, 0, sizeof(a)); /* Zero out the input buffer */ | ||
| 76 | if (!svc_getargs(transp, (xdrproc_t) xdr_rmtcall_args, (char *) &a)) { | ||
| 77 | if (reply_type == RPCBPROC_INDIRECT) | ||
| 78 | svcerr_decode(transp); | ||
| 79 | @@ -704,7 +678,8 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, | ||
| 80 | if (rbl == (rpcblist_ptr)NULL) { | ||
| 81 | #ifdef RPCBIND_DEBUG | ||
| 82 | if (debugging) | ||
| 83 | - xlog(LOG_DEBUG, "not found\n"); | ||
| 84 | + xlog(LOG_DEBUG, "prog %lu vers %lu: not found\n", | ||
| 85 | + a.rmt_prog, a.rmt_vers); | ||
| 86 | #endif | ||
| 87 | if (reply_type == RPCBPROC_INDIRECT) | ||
| 88 | svcerr_noprog(transp); | ||
| 89 | @@ -937,8 +912,6 @@ out: | ||
| 90 | } | ||
| 91 | if (local_uaddr) | ||
| 92 | free(local_uaddr); | ||
| 93 | - if (buf_alloc) | ||
| 94 | - free(buf_alloc); | ||
| 95 | if (outbuf_alloc) | ||
| 96 | free(outbuf_alloc); | ||
| 97 | if (na) { | ||
| 98 | -- | ||
| 99 | 2.7.4 | ||
| 100 | |||
diff --git a/meta/recipes-extended/rpcbind/rpcbind_0.2.4.bb b/meta/recipes-extended/rpcbind/rpcbind_0.2.4.bb index d3eeaf94b6..dcdee6c468 100644 --- a/meta/recipes-extended/rpcbind/rpcbind_0.2.4.bb +++ b/meta/recipes-extended/rpcbind/rpcbind_0.2.4.bb | |||
| @@ -17,6 +17,7 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/rpcbind/rpcbind-${PV}.tar.bz2 \ | |||
| 17 | file://rpcbind.service \ | 17 | file://rpcbind.service \ |
| 18 | file://0001-rpcbind-pair-all-svc_getargs-calls-with-svc_freeargs.patch \ | 18 | file://0001-rpcbind-pair-all-svc_getargs-calls-with-svc_freeargs.patch \ |
| 19 | file://pmapproc_dump-Fixed-typo-in-memory-leak-patch.patch \ | 19 | file://pmapproc_dump-Fixed-typo-in-memory-leak-patch.patch \ |
| 20 | file://rpcbproc_callit_com-Stop-freeing-a-static-pointer.patch \ | ||
| 20 | " | 21 | " |
| 21 | SRC_URI[md5sum] = "cf10cd41ed8228fc54c316191c1f07fe" | 22 | SRC_URI[md5sum] = "cf10cd41ed8228fc54c316191c1f07fe" |
| 22 | SRC_URI[sha256sum] = "074a9a530dc7c11e0d905aa59bcb0847c009313f02e98d3d798aa9568f414c66" | 23 | SRC_URI[sha256sum] = "074a9a530dc7c11e0d905aa59bcb0847c009313f02e98d3d798aa9568f414c66" |
