Author: kib
Date: Sat May  5 00:30:43 2012
New Revision: 235046
URL: http://svn.freebsd.org/changeset/base/235046

Log:
  MFC r234769:
  Fix several memory and lock leaks on the out of memory condition.

Modified:
  stable/8/lib/libc/rpc/svc.c
  stable/8/lib/libc/rpc/svc_raw.c
Directory Properties:
  stable/8/lib/libc/   (props changed)

Modified: stable/8/lib/libc/rpc/svc.c
==============================================================================
--- stable/8/lib/libc/rpc/svc.c Sat May  5 00:28:08 2012        (r235045)
+++ stable/8/lib/libc/rpc/svc.c Sat May  5 00:30:43 2012        (r235046)
@@ -108,8 +108,10 @@ xprt_register(xprt)
        if (__svc_xports == NULL) {
                __svc_xports = (SVCXPRT **)
                        mem_alloc(FD_SETSIZE * sizeof(SVCXPRT *));
-               if (__svc_xports == NULL)
+               if (__svc_xports == NULL) {
+                       rwlock_unlock(&svc_fd_lock);
                        return;
+               }
                memset(__svc_xports, '\0', FD_SETSIZE * sizeof(SVCXPRT *));
        }
        if (sock < FD_SETSIZE) {
@@ -565,8 +567,14 @@ svc_xprt_alloc()
        SVCXPRT_EXT *ext;
 
        xprt = mem_alloc(sizeof(SVCXPRT));
+       if (xprt == NULL)
+               return (NULL);
        memset(xprt, 0, sizeof(SVCXPRT));
        ext = mem_alloc(sizeof(SVCXPRT_EXT));
+       if (ext == NULL) {
+               mem_free(xprt, sizeof(SVCXPRT));
+               return (NULL);
+       }
        memset(ext, 0, sizeof(SVCXPRT_EXT));
        xprt->xp_p3 = ext;
        ext->xp_auth.svc_ah_ops = &svc_auth_null_ops;

Modified: stable/8/lib/libc/rpc/svc_raw.c
==============================================================================
--- stable/8/lib/libc/rpc/svc_raw.c     Sat May  5 00:28:08 2012        
(r235045)
+++ stable/8/lib/libc/rpc/svc_raw.c     Sat May  5 00:30:43 2012        
(r235046)
@@ -96,10 +96,22 @@ svc_raw_create()
                        mutex_unlock(&svcraw_lock);
                        return (NULL);
                }
-               if (__rpc_rawcombuf == NULL)
+               if (__rpc_rawcombuf == NULL) {
                        __rpc_rawcombuf = calloc(UDPMSGSIZE, sizeof (char));
+                       if (__rpc_rawcombuf == NULL) {
+                               free(srp);
+                               mutex_unlock(&svcraw_lock);
+                               return (NULL);
+                       }
+               }
                srp->raw_buf = __rpc_rawcombuf; /* Share it with the client */
                srp->server = svc_xprt_alloc();
+               if (srp->server == NULL) {
+                       free(__rpc_rawcombuf);
+                       free(srp);
+                       mutex_unlock(&svcraw_lock);
+                       return (NULL);
+               }
                svc_raw_private = srp;
        }
        srp->server->xp_fd = FD_SETSIZE;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to