SUNRPC: Free address buffers in a loop
authorChuck Lever <chuck.lever@oracle.com>
Mon, 6 Aug 2007 15:56:57 +0000 (11:56 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 9 Oct 2007 21:15:49 +0000 (17:15 -0400)
Use more generic logic to free buffers holding formatted addresses.  This
makes it less likely a bug will be introduced when adding additional buffer
types in xs_format_peer_address().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/xprtsock.c

index 015f29e..b3f40b8 100644 (file)
@@ -279,10 +279,14 @@ static void xs_format_peer_addresses(struct rpc_xprt *xprt)
        }
        xprt->address_strings[RPC_DISPLAY_PORT] = buf;
 
-       if (xprt->prot == IPPROTO_UDP)
-               xprt->address_strings[RPC_DISPLAY_PROTO] = "udp";
-       else
-               xprt->address_strings[RPC_DISPLAY_PROTO] = "tcp";
+       buf = kzalloc(8, GFP_KERNEL);
+       if (buf) {
+               if (xprt->prot == IPPROTO_UDP)
+                       snprintf(buf, 8, "udp");
+               else
+                       snprintf(buf, 8, "tcp");
+       }
+       xprt->address_strings[RPC_DISPLAY_PROTO] = buf;
 
        buf = kzalloc(48, GFP_KERNEL);
        if (buf) {
@@ -296,9 +300,10 @@ static void xs_format_peer_addresses(struct rpc_xprt *xprt)
 
 static void xs_free_peer_addresses(struct rpc_xprt *xprt)
 {
-       kfree(xprt->address_strings[RPC_DISPLAY_ADDR]);
-       kfree(xprt->address_strings[RPC_DISPLAY_PORT]);
-       kfree(xprt->address_strings[RPC_DISPLAY_ALL]);
+       int i;
+
+       for (i = 0; i < RPC_DISPLAY_MAX; i++)
+               kfree(xprt->address_strings[i]);
 }
 
 #define XS_SENDMSG_FLAGS       (MSG_DONTWAIT | MSG_NOSIGNAL)