summaryrefslogtreecommitdiffstats
path: root/libutil
diff options
context:
space:
mode:
authorDavid Nugent <davidn@FreeBSD.org>1997-01-29 06:06:32 +0000
committerDavid Nugent <davidn@FreeBSD.org>1997-01-29 06:06:32 +0000
commit1ba1303637f69fca0b85c33fec7bb8610ebdf48b (patch)
treea36ffd2838a0bab65a01ed61cf39088e63f1ad3c /libutil
parent9c93aff97a6ffa234e6dc63c571754e364c8a128 (diff)
downloadpw-darwin-1ba1303637f69fca0b85c33fec7bb8610ebdf48b.tar.gz
pw-darwin-1ba1303637f69fca0b85c33fec7bb8610ebdf48b.tar.zst
pw-darwin-1ba1303637f69fca0b85c33fec7bb8610ebdf48b.zip
1) Fixed bug in free()ing internal string/array where
allocated size not reset to 0 causing NULL dereference on call after login_close(). 2) Modify login_capsize() behaviour to match manpage, allow concatenated sizes; ie. 10m500k
Diffstat (limited to 'libutil')
-rw-r--r--libutil/login_cap.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/libutil/login_cap.c b/libutil/login_cap.c
index 30a36f0..392f320 100644
--- a/libutil/login_cap.c
+++ b/libutil/login_cap.c
@@ -149,9 +149,11 @@ login_close(login_cap_t * lc)
free(lc);
if (--lc_object_count == 0) {
free(internal_string);
- free(internal_array);
+ freearraystr(internal_array);
internal_array = NULL;
+ internal_arraysz = 0;
internal_string = NULL;
+ internal_stringsz = 0;
cgetclose();
}
}
@@ -334,7 +336,7 @@ login_getcaptime(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
{
char *res, *ep;
int ret;
- rlim_t tot = 0, tim;
+ rlim_t tot;
errno = 0;
if (lc == NULL || lc->lc_cap == NULL)
@@ -363,8 +365,9 @@ login_getcaptime(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
*/
errno = 0;
+ tot = 0;
while (*res) {
- tim = STRTOV(res, &ep, 0);
+ rlim_t tim = STRTOV(res, &ep, 0);
if ((ep == NULL) || (ep == res) || errno) {
return error;
}
@@ -457,8 +460,7 @@ rlim_t
login_getcapsize(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error) {
char *ep, *res;
int ret;
- rlim_t val;
- rlim_t mult;
+ rlim_t tot, mult;
if (lc == NULL || lc->lc_cap == NULL)
return def;
@@ -469,28 +471,34 @@ login_getcapsize(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error) {
return error;
errno = 0;
- val = STRTOV(res, &ep, 0);
- if ((res == NULL) || (res == ep) || errno)
- return error;
- switch (*ep) {
- case 0: /* end of string */
- mult = 1; break;
- case 'b': case 'B': /* 512-byte blocks */
- mult = 512; break;
- case 'k': case 'K': /* 1024-byte Kilobytes */
- mult = 1024; break;
- case 'm': case 'M': /* 1024-k kbytes */
- mult = 1024 * 1024; break;
- case 'g': case 'G': /* 1Gbyte */
- mult = 1024 * 1024 * 1024; break;
+ tot = 0;
+ while (*res) {
+ rlim_t val = STRTOV(res, &ep, 0);
+ if ((res == NULL) || (res == ep) || errno)
+ return error;
+ switch (*ep) {
+ case 0: /* end of string */
+ ep--;
+ mult = 1;
+ break;
+ case 'b': case 'B': /* 512-byte blocks */
+ mult = 512; break;
+ case 'k': case 'K': /* 1024-byte Kilobytes */
+ mult = 1024; break;
+ case 'm': case 'M': /* 1024-k kbytes */
+ mult = 1024 * 1024; break;
+ case 'g': case 'G': /* 1Gbyte */
+ mult = 1024 * 1024 * 1024; break;
#ifndef RLIM_LONG
- case 't': case 'T': /* 1TBte */
- mult = 1024LL * 1024LL * 1024LL * 1024LL; break;
+ case 't': case 'T': /* 1TBte */
+ mult = 1024LL * 1024LL * 1024LL * 1024LL; break;
#endif
- default:
- return error;
+ default:
+ return error;
+ }
+ tot += (val * mult);
}
- return val * mult;
+ return tot;
}