plug possible memory leak. from openbsd

This commit is contained in:
itojun 2003-09-08 16:19:40 +00:00
parent 2bfde7f903
commit 0676396691
1 changed files with 32 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: login_cap.c,v 1.11 2001/07/22 13:34:01 wiz Exp $ */ /* $NetBSD: login_cap.c,v 1.12 2003/09/08 16:19:40 itojun Exp $ */
/*- /*-
* Copyright (c) 1995,1997 Berkeley Software Design, Inc. All rights reserved. * Copyright (c) 1995,1997 Berkeley Software Design, Inc. All rights reserved.
@ -36,7 +36,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: login_cap.c,v 1.11 2001/07/22 13:34:01 wiz Exp $"); __RCSID("$NetBSD: login_cap.c,v 1.12 2003/09/08 16:19:40 itojun Exp $");
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <sys/types.h> #include <sys/types.h>
@ -168,16 +168,22 @@ login_getcapstr(login_cap_t *lc, char *cap, char *def, char *e)
switch (status = cgetstr(lc->lc_cap, cap, &res)) { switch (status = cgetstr(lc->lc_cap, cap, &res)) {
case -1: case -1:
if (res)
free(res);
return (def); return (def);
case -2: case -2:
syslog(LOG_ERR, "%s: getting capability %s: %m", syslog(LOG_ERR, "%s: getting capability %s: %m",
lc->lc_class, cap); lc->lc_class, cap);
if (res)
free(res);
return (e); return (e);
default: default:
if (status >= 0) if (status >= 0)
return (res); return (res);
syslog(LOG_ERR, "%s: unexpected error with capability %s", syslog(LOG_ERR, "%s: unexpected error with capability %s",
lc->lc_class, cap); lc->lc_class, cap);
if (res)
free(res);
return (e); return (e);
} }
} }
@ -198,11 +204,15 @@ login_getcaptime(login_cap_t *lc, char *cap, quad_t def, quad_t e)
switch (status = cgetstr(lc->lc_cap, cap, &res)) { switch (status = cgetstr(lc->lc_cap, cap, &res)) {
case -1: case -1:
if (res)
free(res);
return (def); return (def);
case -2: case -2:
syslog(LOG_ERR, "%s: getting capability %s: %m", syslog(LOG_ERR, "%s: getting capability %s: %m",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
default: default:
if (status >= 0) if (status >= 0)
@ -210,6 +220,8 @@ login_getcaptime(login_cap_t *lc, char *cap, quad_t def, quad_t e)
syslog(LOG_ERR, "%s: unexpected error with capability %s", syslog(LOG_ERR, "%s: unexpected error with capability %s",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
} }
@ -228,6 +240,7 @@ invalid:
syslog(LOG_ERR, "%s:%s=%s: invalid time", syslog(LOG_ERR, "%s:%s=%s: invalid time",
lc->lc_class, cap, sres); lc->lc_class, cap, sres);
errno = ERANGE; errno = ERANGE;
free(sres);
return (e); return (e);
} }
switch (*ep++) { switch (*ep++) {
@ -257,6 +270,7 @@ invalid:
res = ep; res = ep;
q += r; q += r;
} }
free(sres);
return (q); return (q);
} }
@ -276,11 +290,15 @@ login_getcapnum(login_cap_t *lc, char *cap, quad_t def, quad_t e)
switch (status = cgetstr(lc->lc_cap, cap, &res)) { switch (status = cgetstr(lc->lc_cap, cap, &res)) {
case -1: case -1:
if (res)
free(res);
return (def); return (def);
case -2: case -2:
syslog(LOG_ERR, "%s: getting capability %s: %m", syslog(LOG_ERR, "%s: getting capability %s: %m",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
default: default:
if (status >= 0) if (status >= 0)
@ -288,6 +306,8 @@ login_getcapnum(login_cap_t *lc, char *cap, quad_t def, quad_t e)
syslog(LOG_ERR, "%s: unexpected error with capability %s", syslog(LOG_ERR, "%s: unexpected error with capability %s",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
} }
@ -301,8 +321,10 @@ login_getcapnum(login_cap_t *lc, char *cap, quad_t def, quad_t e)
syslog(LOG_ERR, "%s:%s=%s: invalid number", syslog(LOG_ERR, "%s:%s=%s: invalid number",
lc->lc_class, cap, res); lc->lc_class, cap, res);
errno = ERANGE; errno = ERANGE;
free(res);
return (e); return (e);
} }
free(res);
return (q); return (q);
} }
@ -323,11 +345,15 @@ login_getcapsize(login_cap_t *lc, char *cap, quad_t def, quad_t e)
switch (status = cgetstr(lc->lc_cap, cap, &res)) { switch (status = cgetstr(lc->lc_cap, cap, &res)) {
case -1: case -1:
if (res)
free(res);
return (def); return (def);
case -2: case -2:
syslog(LOG_ERR, "%s: getting capability %s: %m", syslog(LOG_ERR, "%s: getting capability %s: %m",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
default: default:
if (status >= 0) if (status >= 0)
@ -335,6 +361,8 @@ login_getcapsize(login_cap_t *lc, char *cap, quad_t def, quad_t e)
syslog(LOG_ERR, "%s: unexpected error with capability %s", syslog(LOG_ERR, "%s: unexpected error with capability %s",
lc->lc_class, cap); lc->lc_class, cap);
errno = ERANGE; errno = ERANGE;
if (res)
free(res);
return (e); return (e);
} }
@ -345,8 +373,10 @@ login_getcapsize(login_cap_t *lc, char *cap, quad_t def, quad_t e)
syslog(LOG_ERR, "%s:%s=%s: invalid size", syslog(LOG_ERR, "%s:%s=%s: invalid size",
lc->lc_class, cap, res); lc->lc_class, cap, res);
errno = ERANGE; errno = ERANGE;
free(res);
return (e); return (e);
} }
free(res);
return (q); return (q);
} }