diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2012-06-06 18:43:03 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2012-06-06 18:43:03 +0200 |
commit | ba31ca0c288c71a714a93118acfb214879bf7b8f (patch) | |
tree | 670c914437ba781f34d6ab37962cb337711f7f26 /runtime/cfsysline.c | |
parent | 050db3854d664b47b8b27d7877984500c8ba9568 (diff) | |
parent | 7f109cca88816752a9c9cbe255df9e3a5b5a8b5a (diff) | |
download | rsyslog-ba31ca0c288c71a714a93118acfb214879bf7b8f.tar.gz rsyslog-ba31ca0c288c71a714a93118acfb214879bf7b8f.tar.bz2 rsyslog-ba31ca0c288c71a714a93118acfb214879bf7b8f.zip |
Merge branch 'v5-stable' into v6-stable
Conflicts:
ChangeLog
configure.ac
doc/manual.html
Diffstat (limited to 'runtime/cfsysline.c')
-rw-r--r-- | runtime/cfsysline.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/runtime/cfsysline.c b/runtime/cfsysline.c index b9516435..2d91094c 100644 --- a/runtime/cfsysline.c +++ b/runtime/cfsysline.c @@ -339,11 +339,12 @@ static int doParseOnOffOption(uchar **pp) */ static rsRetVal doGetGID(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *pVal) { - struct group *pgBuf; + struct group *pgBuf = NULL; struct group gBuf; DEFiRet; uchar szName[256]; - char stringBuf[2048]; /* I hope this is large enough... */ + int bufSize = 2048; + char * stringBuf = NULL; assert(pp != NULL); assert(*pp != NULL); @@ -353,7 +354,17 @@ static rsRetVal doGetGID(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *p ABORT_FINALIZE(RS_RET_NOT_FOUND); } - getgrnam_r((char*)szName, &gBuf, stringBuf, sizeof(stringBuf), &pgBuf); + + CHKmalloc(stringBuf = malloc(bufSize)); + while(pgBuf == NULL) { + errno = 0; + getgrnam_r((char*)szName, &gBuf, stringBuf, bufSize, &pgBuf); + if((pgBuf == NULL) && (errno == ERANGE)) { + /* Increase bufsize and try again.*/ + bufSize *= 2; + CHKmalloc(stringBuf = realloc(stringBuf, bufSize)); + } + } if(pgBuf == NULL) { errmsg.LogError(0, RS_RET_NOT_FOUND, "ID for group '%s' could not be found or error", (char*)szName); @@ -372,6 +383,7 @@ static rsRetVal doGetGID(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *p skipWhiteSpace(pp); /* skip over any whitespace */ finalize_it: + free(stringBuf); RETiRet; } |