From: nekral-guest Date: Fri, 24 Apr 2009 23:32:52 +0000 (+0000) Subject: * lib/sgroupio.c: Free allocated structures on failure. X-Git-Tag: 4.1.4~85 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=566fbac1ef59cfa60e201303f2add63f4954ae9b;p=shadow * lib/sgroupio.c: Free allocated structures on failure. * lib/sgroupio.c: Added splint annotations. --- diff --git a/ChangeLog b/ChangeLog index 66931a5c..c12b8d5a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-04-25 Nicolas François + + * lib/sgroupio.c: Free allocated structures on failure. + * lib/sgroupio.c: Added splint annotations. + 2009-04-25 Nicolas François * lib/Makefile.am, lib/get_pid.c, lib/getulong.c: Added get_pid() diff --git a/lib/sgroupio.c b/lib/sgroupio.c index 8437970c..5a882cc9 100644 --- a/lib/sgroupio.c +++ b/lib/sgroupio.c @@ -54,21 +54,34 @@ *sg = *sgent; sg->sg_name = strdup (sgent->sg_name); if (NULL == sg->sg_name) { + free (sg); return NULL; } sg->sg_passwd = strdup (sgent->sg_passwd); if (NULL == sg->sg_passwd) { + free (sg->sg_name); + free (sg); return NULL; } for (i = 0; NULL != sgent->sg_adm[i]; i++); sg->sg_adm = (char **) malloc ((i + 1) * sizeof (char *)); if (NULL == sg->sg_adm) { + free (sg->sg_passwd); + free (sg->sg_name); + free (sg); return NULL; } for (i = 0; NULL != sgent->sg_adm[i]; i++) { sg->sg_adm[i] = strdup (sgent->sg_adm[i]); if (NULL == sg->sg_adm[i]) { + for (i = 0; NULL != sg->sg_adm[i]; i++) { + free (sg->sg_adm[i]); + } + free (sg->sg_adm); + free (sg->sg_passwd); + free (sg->sg_name); + free (sg); return NULL; } } @@ -77,11 +90,29 @@ for (i = 0; NULL != sgent->sg_mem[i]; i++); sg->sg_mem = (char **) malloc ((i + 1) * sizeof (char *)); if (NULL == sg->sg_mem) { + for (i = 0; NULL != sg->sg_adm[i]; i++) { + free (sg->sg_adm[i]); + } + free (sg->sg_adm); + free (sg->sg_passwd); + free (sg->sg_name); + free (sg); return NULL; } for (i = 0; NULL != sgent->sg_mem[i]; i++) { sg->sg_mem[i] = strdup (sgent->sg_mem[i]); if (NULL == sg->sg_mem[i]) { + for (i = 0; NULL != sg->sg_mem[i]; i++) { + free (sg->sg_mem[i]); + } + free (sg->sg_mem); + for (i = 0; NULL != sg->sg_adm[i]; i++) { + free (sg->sg_adm[i]); + } + free (sg->sg_adm); + free (sg->sg_passwd); + free (sg->sg_name); + free (sg); return NULL; } } @@ -192,7 +223,7 @@ int sgr_open (int mode) return commonio_open (&gshadow_db, mode); } -const struct sgrp *sgr_locate (const char *name) +/*@observer@*/ /*@null@*/const struct sgrp *sgr_locate (const char *name) { return commonio_locate (&gshadow_db, name); } @@ -232,7 +263,7 @@ void __sgr_set_changed (void) gshadow_db.changed = true; } -/*@null@*/struct commonio_entry *__sgr_get_head (void) +/*@dependent@*/ /*@null@*/struct commonio_entry *__sgr_get_head (void) { return gshadow_db.head; }