diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2010-09-16 13:51:51 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2010-09-16 14:33:51 -0400 |
commit | 76209cdbe989ee4cdfbf489f2695ac779457e763 (patch) | |
tree | f8aa455371e4c16f82ced0a925706e3b540e3d1f /utils/mountd/rmtab.c | |
parent | a8348c2c48d45f991995707fa22a2fa441aaa907 (diff) | |
download | nfs-utils-76209cdbe989ee4cdfbf489f2695ac779457e763.tar.gz nfs-utils-76209cdbe989ee4cdfbf489f2695ac779457e763.tar.xz nfs-utils-76209cdbe989ee4cdfbf489f2695ac779457e763.zip |
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 <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mountd/rmtab.c')
-rw-r--r-- | utils/mountd/rmtab.c | 32 |
1 files changed, 24 insertions, 8 deletions
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 <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> -#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; } |