hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From 4e201b75928ff7d4894cd30ab0f5f67b9cd95f5c Mon Sep 17 00:00:00 2001
From: Steve Dickson <steved@redhat.com>
Date: Thu, 18 Jan 2018 17:33:56 +0000
Subject: [PATCH] rpcbproc_callit_com: Stop freeing a static pointer
 
commit 7ea36ee introduced a svc_freeargs() call
that ended up freeing static pointer.
 
It turns out the allocations for the rmt_args
is not necessary . The xdr routines (xdr_bytes) will
handle the memory management and the largest
possible message size is UDPMSGSIZE (due to UDP only)
which is smaller than RPC_BUF_MAX
 
Signed-off-by: Steve Dickson <steved@redhat.com>
(cherry picked from commit 7c7590ad536c0e24bef790cb1e65702fc54db566)
Signed-off-by: Ed Blake <ed.blake@sondrel.com>
---
 src/rpcb_svc_com.c | 39 ++++++---------------------------------
 1 file changed, 6 insertions(+), 33 deletions(-)
 
diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c
index 0432b6f..64f1104 100644
--- a/src/rpcb_svc_com.c
+++ b/src/rpcb_svc_com.c
@@ -616,9 +616,9 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp,
     struct netconfig *nconf;
     struct netbuf *caller;
     struct r_rmtcall_args a;
-    char *buf_alloc = NULL, *outbufp;
+    char *outbufp;
     char *outbuf_alloc = NULL;
-    char buf[RPC_BUF_MAX], outbuf[RPC_BUF_MAX];
+    char  outbuf[RPC_BUF_MAX];
     struct netbuf *na = (struct netbuf *) NULL;
     struct rpc_msg call_msg;
     int outlen;
@@ -639,36 +639,10 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp,
     }
     if (si.si_socktype != SOCK_DGRAM)
         return;    /* Only datagram type accepted */
-    sendsz = __rpc_get_t_size(si.si_af, si.si_proto, UDPMSGSIZE);
-    if (sendsz == 0) {    /* data transfer not supported */
-        if (reply_type == RPCBPROC_INDIRECT)
-            svcerr_systemerr(transp);
-        return;
-    }
-    /*
-     * Should be multiple of 4 for XDR.
-     */
-    sendsz = ((sendsz + 3) / 4) * 4;
-    if (sendsz > RPC_BUF_MAX) {
-#ifdef    notyet
-        buf_alloc = alloca(sendsz);        /* not in IDR2? */
-#else
-        buf_alloc = malloc(sendsz);
-#endif    /* notyet */
-        if (buf_alloc == NULL) {
-            if (debugging)
-                xlog(LOG_DEBUG,
-                    "rpcbproc_callit_com:  No Memory!\n");
-            if (reply_type == RPCBPROC_INDIRECT)
-                svcerr_systemerr(transp);
-            return;
-        }
-        a.rmt_args.args = buf_alloc;
-    } else {
-        a.rmt_args.args = buf;
-    }
+    sendsz = UDPMSGSIZE;
 
     call_msg.rm_xid = 0;    /* For error checking purposes */
+    memset(&a, 0, sizeof(a)); /* Zero out the input buffer */
     if (!svc_getargs(transp, (xdrproc_t) xdr_rmtcall_args, (char *) &a)) {
         if (reply_type == RPCBPROC_INDIRECT)
             svcerr_decode(transp);
@@ -708,7 +682,8 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp,
     if (rbl == (rpcblist_ptr)NULL) {
 #ifdef RPCBIND_DEBUG
         if (debugging)
-            xlog(LOG_DEBUG, "not found\n");
+            xlog(LOG_DEBUG, "prog %lu vers %lu: not found\n", 
+                a.rmt_prog, a.rmt_vers);
 #endif
         if (reply_type == RPCBPROC_INDIRECT)
             svcerr_noprog(transp);
@@ -941,8 +916,6 @@ out:
     }
     if (local_uaddr)
         free(local_uaddr);
-    if (buf_alloc)
-        free(buf_alloc);
     if (outbuf_alloc)
         free(outbuf_alloc);
     if (na) {
-- 
2.11.0