summaryrefslogtreecommitdiff
path: root/usr/src/lib/libresolv2/common/irs/gen_gr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libresolv2/common/irs/gen_gr.c')
-rw-r--r--usr/src/lib/libresolv2/common/irs/gen_gr.c100
1 files changed, 52 insertions, 48 deletions
diff --git a/usr/src/lib/libresolv2/common/irs/gen_gr.c b/usr/src/lib/libresolv2/common/irs/gen_gr.c
index 1caf7a22c5..d689e19319 100644
--- a/usr/src/lib/libresolv2/common/irs/gen_gr.c
+++ b/usr/src/lib/libresolv2/common/irs/gen_gr.c
@@ -1,29 +1,22 @@
/*
- * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 1996-1999 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: gen_gr.c,v 1.26 2002/07/18 02:07:44 marka Exp $";
+static const char rcsid[] = "$Id: gen_gr.c,v 1.8 2005/04/27 04:56:23 sra Exp $";
#endif
/* Imports */
@@ -68,7 +61,7 @@ struct pvt {
* we keep one buffer and resize it as needed.
*/
struct group group;
- size_t nmemb; /* Malloc'd max index of gr_mem[]. */
+ size_t nmemb; /*%< Malloc'd max index of gr_mem[]. */
char * membuf;
size_t membufsize;
struct __res_state * res;
@@ -90,7 +83,7 @@ static void gr_res_set(struct irs_gr *,
struct __res_state *,
void (*)(void *));
-static void grmerge(struct irs_gr *gr, const struct group *src,
+static int grmerge(struct irs_gr *gr, const struct group *src,
int preserve);
static int countvec(char **vec);
@@ -99,6 +92,10 @@ static int countnew(char **old, char **new);
static size_t sizenew(char **old, char **new);
static int newgid(int, gid_t *, gid_t);
+/* Macros */
+
+#define FREE_IF(x) do { if ((x) != NULL) { free(x); (x) = NULL; } } while (0)
+
/* Public */
struct irs_gr *
@@ -178,7 +175,8 @@ gr_byname(struct irs_gr *this, const char *name) {
gr = rule->inst->gr;
tval = (*gr->byname)(gr, name);
if (tval) {
- grmerge(this, tval, dirty++);
+ if (!grmerge(this, tval, dirty++))
+ return (NULL);
if (!(rule->flags & IRS_MERGE))
break;
} else {
@@ -204,7 +202,8 @@ gr_bygid(struct irs_gr *this, gid_t gid) {
gr = rule->inst->gr;
tval = (*gr->bygid)(gr, gid);
if (tval) {
- grmerge(this, tval, dirty++);
+ if (!grmerge(this, tval, dirty++))
+ return (NULL);
if (!(rule->flags & IRS_MERGE))
break;
} else {
@@ -328,7 +327,7 @@ gr_res_set(struct irs_gr *this, struct __res_state *res,
/* Private. */
-static void
+static int
grmerge(struct irs_gr *this, const struct group *src, int preserve) {
struct pvt *pvt = (struct pvt *)this->private;
char *cp, **m, **p, *oldmembuf, *ep;
@@ -339,9 +338,9 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
pvt->group.gr_gid = src->gr_gid;
if (pvt->nmemb < 1) {
m = malloc(sizeof *m);
- if (!m) {
+ if (m == NULL) {
/* No harm done, no work done. */
- return;
+ return (0);
}
pvt->group.gr_mem = m;
pvt->nmemb = 1;
@@ -358,9 +357,9 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
n = ndst + nnew + 1;
if ((size_t)n > pvt->nmemb) {
m = realloc(pvt->group.gr_mem, n * sizeof *m);
- if (!m) {
+ if (m == NULL) {
/* No harm done, no work done. */
- return;
+ return (0);
}
pvt->group.gr_mem = m;
pvt->nmemb = n;
@@ -378,13 +377,13 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
}
if (n == 0) {
/* No work to do. */
- return;
+ return (1);
}
used = preserve ? pvt->membufsize : 0;
cp = malloc(used + n);
- if (!cp) {
+ if (cp == NULL) {
/* No harm done, no work done. */
- return;
+ return (0);
}
ep = cp + used + n;
if (used != 0)
@@ -408,12 +407,13 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
if (isnew(pvt->group.gr_mem, *m)) {
*p++ = cp;
*p = NULL;
-#ifdef HAVE_STRLCPY
- strlcpy(cp, *m, ep - cp);
-#else
- strcpy(cp, *m);
-#endif
- cp += strlen(cp) + 1;
+ n = strlen(*m) + 1;
+ if (n > ep - cp) {
+ FREE_IF(oldmembuf);
+ return (0);
+ }
+ strcpy(cp, *m); /* (checked) */
+ cp += n;
}
if (preserve) {
pvt->group.gr_name = pvt->membuf +
@@ -422,23 +422,26 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
(pvt->group.gr_passwd - oldmembuf);
} else {
pvt->group.gr_name = cp;
-#ifdef HAVE_STRLCPY
- strlcpy(cp, src->gr_name, ep - cp);
-#else
- strcpy(cp, src->gr_name);
-#endif
- cp += strlen(src->gr_name) + 1;
+ n = strlen(src->gr_name) + 1;
+ if (n > ep - cp) {
+ FREE_IF(oldmembuf);
+ return (0);
+ }
+ strcpy(cp, src->gr_name); /* (checked) */
+ cp += n;
+
pvt->group.gr_passwd = cp;
-#ifdef HAVE_STRLCPY
- strlcpy(cp, src->gr_passwd, ep - cp);
-#else
- strcpy(cp, src->gr_passwd);
-#endif
- cp += strlen(src->gr_passwd) + 1;
+ n = strlen(src->gr_passwd) + 1;
+ if (n > ep - cp) {
+ FREE_IF(oldmembuf);
+ return (0);
+ }
+ strcpy(cp, src->gr_passwd); /* (checked) */
+ cp += n;
}
- if (oldmembuf != NULL)
- free(oldmembuf);
+ FREE_IF(oldmembuf);
INSIST(cp >= pvt->membuf && cp <= &pvt->membuf[pvt->membufsize]);
+ return (1);
}
static int
@@ -487,3 +490,4 @@ newgid(int ngroups, gid_t *groups, gid_t group) {
}
#endif /* WANT_IRS_GR */
+/*! \file */