From: Chuck Lever Date: Thu, 16 Sep 2010 17:51:51 +0000 (-0400) Subject: mountd: Handle memory exhaustion in mountlist_list() X-Git-Tag: nfs-utils-1-2-3-rc6~7 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=commitdiff_plain;h=76209cdbe989ee4cdfbf489f2695ac779457e763 mountd: Handle memory exhaustion in mountlist_list() I'm about to replace inet_aton(3)/gethostbyaddr(3) with host_pton()/host_canonname() in mountlist_list(). Since host_canonname() returns a string allocated with strdup(3) instead of xstrdup(), mountlist_list() must now deal with memory exhaustion properly. Signed-off-by: Chuck Lever Signed-off-by: Steve Dickson --- diff --git a/utils/mountd/rmtab.c b/utils/mountd/rmtab.c index 854d519..cd6abc8 100644 --- a/utils/mountd/rmtab.c +++ b/utils/mountd/rmtab.c @@ -16,7 +16,7 @@ #include #include #include -#include "xmalloc.h" + #include "misc.h" #include "exportfs.h" #include "xio.h" @@ -179,9 +179,9 @@ mountlist_freeall(mountlist list) while (list != NULL) { mountlist m = list; list = m->ml_next; - xfree(m->ml_hostname); - xfree(m->ml_directory); - xfree(m); + free(m->ml_hostname); + free(m->ml_directory); + free(m); } } @@ -211,16 +211,32 @@ mountlist_list(void) setrmtabent("r"); while ((rep = getrmtabent(1, NULL)) != NULL) { - m = (mountlist) xmalloc(sizeof(*m)); + m = calloc(1, sizeof(*m)); + if (m == NULL) { + mountlist_freeall(mlist); + mlist = NULL; + xlog(L_ERROR, "%s: memory allocation failed", + __func__); + break; + } if (reverse_resolve && inet_aton((const char *) rep->r_client, &addr) && (he = gethostbyaddr(&addr, sizeof(addr), AF_INET))) - m->ml_hostname = xstrdup(he->h_name); + m->ml_hostname = strdup(he->h_name); else - m->ml_hostname = xstrdup(rep->r_client); + m->ml_hostname = strdup(rep->r_client); + + m->ml_directory = strdup(rep->r_path); + + if (m->ml_hostname == NULL || m->ml_directory == NULL) { + mountlist_freeall(mlist); + mlist = NULL; + xlog(L_ERROR, "%s: memory allocation failed", + __func__); + break; + } - m->ml_directory = xstrdup(rep->r_path); m->ml_next = mlist; mlist = m; }