aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/gen/getnetgrent.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2012-06-16 13:10:22 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2012-06-16 13:10:22 +0000
commit3a3c91219b72833774d8248b2052e38a22e85b1f (patch)
treec39a5ffd32c13ba1379150d2fb001b18febe0b96 /lib/libc/gen/getnetgrent.c
parentcff2dcd10d65cd91e83860650a8cb1afcc5e4910 (diff)
downloadsrc-3a3c91219b72833774d8248b2052e38a22e85b1f.tar.gz
src-3a3c91219b72833774d8248b2052e38a22e85b1f.zip
Revert part of the r235740 which changed separate allocation of the
string buffer for each linelist l_line into one large string. Since linelists parsed out during the previous passes store the pointers to previously allocated l_lines, the reallocation caused undefined behaviour on accessing the buffers, and quite deterministic fault on freeing them (in mountd(8) startup). This fixes reading of netgroup(5) file which contains more then one netgroup. Discussed with: ghelmer MFC after: 3 days
Notes
Notes: svn path=/head/; revision=237159
Diffstat (limited to 'lib/libc/gen/getnetgrent.c')
-rw-r--r--lib/libc/gen/getnetgrent.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/libc/gen/getnetgrent.c b/lib/libc/gen/getnetgrent.c
index 933a7d3e932f..f9dfd7b58397 100644
--- a/lib/libc/gen/getnetgrent.c
+++ b/lib/libc/gen/getnetgrent.c
@@ -538,7 +538,7 @@ parse_netgrp(const char *group)
static struct linelist *
read_for_group(const char *group)
{
- char *pos, *spos, *linep;
+ char *linep, *olinep, *pos, *spos;
int len, olen;
int cont;
struct linelist *lp;
@@ -615,15 +615,20 @@ read_for_group(const char *group)
} else
cont = 0;
if (len > 0) {
- linep = reallocf(linep, olen + len + 1);
+ linep = malloc(olen + len + 1);
if (linep == NULL) {
free(lp->l_groupname);
free(lp);
return (NULL);
}
+ if (olen > 0) {
+ bcopy(olinep, linep, olen);
+ free(olinep);
+ }
bcopy(pos, linep + olen, len);
olen += len;
*(linep + olen) = '\0';
+ olinep = linep;
}
if (cont) {
if (fgets(line, LINSIZ, netf)) {