diff options
Diffstat (limited to 'usr/src/lib/libshare/nfs/libshare_nfs.c')
-rw-r--r-- | usr/src/lib/libshare/nfs/libshare_nfs.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/usr/src/lib/libshare/nfs/libshare_nfs.c b/usr/src/lib/libshare/nfs/libshare_nfs.c index ccfd7f2990..3d781980ce 100644 --- a/usr/src/lib/libshare/nfs/libshare_nfs.c +++ b/usr/src/lib/libshare/nfs/libshare_nfs.c @@ -1042,14 +1042,17 @@ cleanup_export(struct exportdata *export) { int i; - if (export->ex_index != NULL) - free(export->ex_index); - if (export->ex_secinfo != NULL) { - for (i = 0; i < export->ex_seccnt; i++) - if (export->ex_secinfo[i].s_rootnames != NULL) - free(export->ex_secinfo[i].s_rootnames); - free(export->ex_secinfo); + free(export->ex_index); + + for (i = 0; i < export->ex_seccnt; i++) { + struct secinfo *s = &export->ex_secinfo[i]; + + while (s->s_rootcnt > 0) + free(s->s_rootnames[--s->s_rootcnt]); + + free(s->s_rootnames); } + free(export->ex_secinfo); } /* @@ -1085,6 +1088,8 @@ get_rootnames(seconfig_t *sec, char *list, int *count) for (i = 0; i < c; i++) { host = strtok(list, ":"); if (!nfs_get_root_principal(sec, host, &a[i])) { + while (i > 0) + free(a[--i]); free(a); a = NULL; break; @@ -1151,7 +1156,7 @@ fill_security_from_secopts(struct secinfo *sp, sa_security_t secopts) * such as RO/RW */ if (sp->s_secinfo.sc_rpcnum == AUTH_UNIX) - continue; + break; /* not AUTH_UNIX */ if (value != NULL) { sp->s_rootnames = get_rootnames(&sp->s_secinfo, |