diff --git a/lib/libutil/login_cap.c b/lib/libutil/login_cap.c --- a/lib/libutil/login_cap.c +++ b/lib/libutil/login_cap.c @@ -481,12 +481,15 @@ login_getcaplist(login_cap_t *lc, const char *cap, const char *chars) { const char *lstring; + const char **ret = NULL; if (chars == NULL) chars = ", \t"; - if ((lstring = login_getcapstr(lc, cap, NULL, NULL)) != NULL) - return arrayize(lstring, chars, NULL); - return NULL; + if ((lstring = login_getcapstr(lc, cap, NULL, NULL)) != NULL) { + ret = arrayize(lstring, chars, NULL); + free(__DECONST(char *, lstring)); + } + return ret; } @@ -653,8 +656,10 @@ return error; /* "inf" and "infinity" are special cases */ - if (isinfinite(res)) + if (isinfinite(res)) { + free(res); return RLIM_INFINITY; + } /* * Now go through the string, turning something like 1h2m3s into @@ -672,6 +677,7 @@ invalid: syslog(LOG_WARNING, "login_getcaptime: class '%s' bad value %s=%s", lc->lc_class, cap, oval); + free(oval); errno = ERANGE; return error; } @@ -706,6 +712,7 @@ goto invalid; } + free(oval); return tot; } @@ -745,18 +752,22 @@ } else if (r < 0) return error; - if (isinfinite(res)) + if (isinfinite(res)) { + free(res); return RLIM_INFINITY; + } errno = 0; val = strtoq(res, &ep, 0); if (ep == NULL || ep == res || errno != 0) { syslog(LOG_WARNING, "login_getcapnum: class '%s' bad value %s=%s", lc->lc_class, cap, res); + free(res); errno = ERANGE; return error; } + free(res); return val; } @@ -831,8 +842,10 @@ else if (r < 0) return error; - if (isinfinite(res)) + if (isinfinite(res)) { + free(res); return RLIM_INFINITY; + } errno = 0; tot = 0; @@ -845,6 +858,7 @@ invalid: syslog(LOG_WARNING, "login_getcapsize: class '%s' bad value %s=%s", lc->lc_class, cap, oval); + free(oval); errno = ERANGE; return error; } @@ -876,6 +890,7 @@ goto invalid; } + free(oval); return tot; }