Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 May 2012 00:30:43 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r235046 - stable/8/lib/libc/rpc
Message-ID:  <201205050030.q450UiwU029965@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205050030.q450UiwU029965>