Fix several memory and lock leaks on the out of memory condition.

Reported by:	Matt Miller <matt matthewjmiller net>
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2012-04-28 18:57:27 +00:00
parent 641d61c78e
commit ed8ddc6ea0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=234769
2 changed files with 22 additions and 2 deletions

View file

@ -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;

View file

@ -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;