Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Feb 2007 09:07:23 GMT
From:      Michael Bushkov <bushman@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 113890 for review
Message-ID:  <200702020907.l1297NhS070608@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113890

Change 113890 by bushman@bushman_nss_ldap_cached on 2007/02/02 09:07:09

	IFC

Affected files ...

.. //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/lib/libc/stdlib/malloc.c#3 integrate
.. //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/lib/libc/sys/quotactl.2#3 integrate
.. //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/share/mk/bsd.libnames.mk#2 integrate
.. //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/usr.bin/quota/quota.c#2 integrate
.. //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/usr.sbin/pkg_install/add/main.c#2 integrate

Differences ...

==== //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/lib/libc/stdlib/malloc.c#3 (text+ko) ====

@@ -185,7 +185,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.138 2006/12/23 00:18:51 jasone Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.139 2007/01/31 22:54:19 jasone Exp $");
 
 #include "libc_private.h"
 #ifdef MALLOC_DEBUG
@@ -550,6 +550,14 @@
 	qr(arena_run_t)	link;
 };
 
+/* Avoid pointer aliasing issues. */
+static inline arena_run_t *
+arena_bin_link(void *ptr)
+{
+
+	return ((arena_run_t *)ptr);
+}
+
 struct arena_bin_s {
 	/*
 	 * Current run being used to service allocations of this bin's size
@@ -1318,7 +1326,7 @@
 			if (incr == size) {
 				ret = brk_cur;
 			} else {
-				ret = (void *)(intptr_t)brk_cur + incr;
+				ret = (void *)((intptr_t)brk_cur + incr);
 				incr += size;
 			}
 
@@ -1326,7 +1334,7 @@
 			if (brk_prev == brk_cur) {
 				/* Success. */
 				malloc_mutex_unlock(&brk_mtx);
-				brk_max = (void *)(intptr_t)ret + size;
+				brk_max = (void *)((intptr_t)ret + size);
 				goto RETURN;
 			}
 		} while (brk_prev != (void *)-1);
@@ -1412,13 +1420,13 @@
 		 * the sake of poorly designed multi-threaded programs.
 		 */
 		if (brk_cur == brk_max
-		    && (void *)(uintptr_t)chunk + size == brk_max
+		    && (void *)((uintptr_t)chunk + size) == brk_max
 		    && sbrk(-(intptr_t)size) == brk_max) {
 			malloc_mutex_unlock(&brk_mtx);
 			if (brk_prev == brk_max) {
 				/* Success. */
-				brk_prev = (void *)(intptr_t)brk_max
-				    - (intptr_t)size;
+				brk_prev = (void *)((intptr_t)brk_max
+				    - (intptr_t)size);
 				brk_max = brk_prev;
 			}
 			goto RETURN;
@@ -1608,7 +1616,7 @@
 		mask = run->regs_mask[i];
 		if (mask != 0) {
 			/* Usable allocation found. */
-			bit = ffs(mask) - 1;
+			bit = ffs((int)mask) - 1;
 
 			regind = ((i << (SIZEOF_INT_2POW + 3)) + bit);
 			ret = (void *)&((char *)run)[bin->reg0_offset
@@ -1764,7 +1772,7 @@
 	/* Update map for trailing pages. */
 	map_offset += need_pages;
 	while (map_offset < run_ind + total_pages) {
-		log2_run_pages = ffs(map_offset) - 1;
+		log2_run_pages = ffs((int)map_offset) - 1;
 		run_pages = (1 << log2_run_pages);
 
 		chunk->map[map_offset].free = true;
@@ -1848,7 +1856,7 @@
 		 * of by "allocating" the leading pages.
 		 */
 		while (map_offset < (chunk_size >> pagesize_2pow)) {
-			log2_run_pages = ffs(map_offset) - 1;
+			log2_run_pages = ffs((int)map_offset) - 1;
 			run_pages = (1 << log2_run_pages);
 
 			chunk->map[map_offset].free = true;
@@ -1904,7 +1912,8 @@
 			assert(0);
 			break;
 		case RUN_Q0:
-			qr_before_insert((arena_run_t *)&bin->runs0, run, link);
+			qr_before_insert(arena_bin_link(&bin->runs0), run,
+			    link);
 			run->free_max = bin->nregs - 1;
 			run->free_min = (bin->nregs >> 1) + 1;
 			assert(run->nfree <= run->free_max);
@@ -1912,7 +1921,7 @@
 			break;
 		case RUN_Q25:
 			qr_remove(run, link);
-			qr_before_insert((arena_run_t *)&bin->runs25, run,
+			qr_before_insert(arena_bin_link(&bin->runs25), run,
 			    link);
 			run->free_max = ((bin->nregs >> 2) * 3) - 1;
 			run->free_min = (bin->nregs >> 2) + 1;
@@ -1921,7 +1930,7 @@
 			break;
 		case RUN_Q50:
 			qr_remove(run, link);
-			qr_before_insert((arena_run_t *)&bin->runs50, run,
+			qr_before_insert(arena_bin_link(&bin->runs50), run,
 			    link);
 			run->free_max = (bin->nregs >> 1) - 1;
 			run->free_min = 1;
@@ -1985,7 +1994,8 @@
 			break;
 		case RUN_Q0:
 			qr_remove(run, link);
-			qr_before_insert((arena_run_t *)&bin->runs0, run, link);
+			qr_before_insert(arena_bin_link(&bin->runs0), run,
+			    link);
 			run->free_max = bin->nregs - 1;
 			run->free_min = (bin->nregs >> 1) + 1;
 			assert(run->nfree <= run->free_max);
@@ -1993,7 +2003,7 @@
 			break;
 		case RUN_Q25:
 			qr_remove(run, link);
-			qr_before_insert((arena_run_t *)&bin->runs25, run,
+			qr_before_insert(arena_bin_link(&bin->runs25), run,
 			    link);
 			run->free_max = ((bin->nregs >> 2) * 3) - 1;
 			run->free_min = (bin->nregs >> 2) + 1;
@@ -2002,7 +2012,7 @@
 			break;
 		case RUN_Q50:
 			qr_remove(run, link);
-			qr_before_insert((arena_run_t *)&bin->runs50, run,
+			qr_before_insert(arena_bin_link(&bin->runs50), run,
 			    link);
 			run->free_max = (bin->nregs >> 1) - 1;
 			run->free_min = 1;
@@ -2010,7 +2020,7 @@
 			assert(run->nfree >= run->free_min);
 			break;
 		case RUN_Q75:
-			qr_before_insert((arena_run_t *)&bin->runs75, run,
+			qr_before_insert(arena_bin_link(&bin->runs75), run,
 			    link);
 			run->free_max = (bin->nregs >> 2) - 1;
 			run->free_min = 1;
@@ -2047,7 +2057,7 @@
 	 * large enough.  Look for a precise fit, but do not pass up a chunk
 	 * that has a run which is large enough to split.
 	 */
-	min_ind = ffs(size >> pagesize_2pow) - 1;
+	min_ind = ffs((int)(size >> pagesize_2pow)) - 1;
 	RB_FOREACH(chunk, arena_chunk_tree_s, &arena->chunks) {
 		for (i = min_ind;
 		    i < (opt_chunk_2pow - pagesize_2pow);
@@ -2096,7 +2106,7 @@
 	run_ind = (unsigned)(((uintptr_t)run - (uintptr_t)chunk)
 	    >> pagesize_2pow);
 	run_pages = (size >> pagesize_2pow);
-	log2_run_pages = ffs(run_pages) - 1;
+	log2_run_pages = ffs((int)run_pages) - 1;
 	assert(run_pages > 0);
 
 	/* Subtract pages from count of pages used in chunk. */
@@ -2168,14 +2178,14 @@
 	unsigned i, remainder;
 
 	/* Look for a usable run. */
-	if ((run = qr_next((arena_run_t *)&bin->runs50, link))
-	    != (arena_run_t *)&bin->runs50
-	    || (run = qr_next((arena_run_t *)&bin->runs25, link))
-	    != (arena_run_t *)&bin->runs25
-	    || (run = qr_next((arena_run_t *)&bin->runs0, link))
-	    != (arena_run_t *)&bin->runs0
-	    || (run = qr_next((arena_run_t *)&bin->runs75, link))
-	    != (arena_run_t *)&bin->runs75) {
+	if ((run = qr_next(arena_bin_link(&bin->runs50), link))
+	    != arena_bin_link(&bin->runs50)
+	    || (run = qr_next(arena_bin_link(&bin->runs25), link))
+	    != arena_bin_link(&bin->runs25)
+	    || (run = qr_next(arena_bin_link(&bin->runs0), link))
+	    != arena_bin_link(&bin->runs0)
+	    || (run = qr_next(arena_bin_link(&bin->runs75), link))
+	    != arena_bin_link(&bin->runs75)) {
 		/* run is guaranteed to have available space. */
 		qr_remove(run, link);
 		return (run);
@@ -2276,7 +2286,8 @@
 		if (size < small_min) {
 			/* Tiny. */
 			size = pow2_ceil(size);
-			bin = &arena->bins[ffs(size >> (tiny_min_2pow + 1))];
+			bin = &arena->bins[ffs((int)(size >> (tiny_min_2pow +
+			    1)))];
 #if (!defined(NDEBUG) || defined(MALLOC_STATS))
 			/*
 			 * Bin calculation is always correct, but we may need
@@ -2295,7 +2306,7 @@
 			/* Sub-page. */
 			size = pow2_ceil(size);
 			bin = &arena->bins[ntbins + nqbins
-			    + (ffs(size >> opt_small_max_2pow) - 2)];
+			    + (ffs((int)(size >> opt_small_max_2pow)) - 2)];
 		}
 		assert(size == bin->reg_size);
 
@@ -2375,8 +2386,8 @@
 	/* Avoid moving the allocation if the size class would not change. */
 	if (size < small_min) {
 		if (oldsize < small_min &&
-		    ffs(pow2_ceil(size) >> (tiny_min_2pow + 1))
-		    == ffs(pow2_ceil(oldsize) >> (tiny_min_2pow + 1)))
+		    ffs((int)(pow2_ceil(size) >> (tiny_min_2pow + 1)))
+		    == ffs((int)(pow2_ceil(oldsize) >> (tiny_min_2pow + 1))))
 			goto IN_PLACE;
 	} else if (size <= small_max) {
 		if (oldsize >= small_min && oldsize <= small_max &&
@@ -2493,10 +2504,10 @@
 	for (i = 0; i < ntbins; i++) {
 		bin = &arena->bins[i];
 		bin->runcur = NULL;
-		qr_new((arena_run_t *)&bin->runs0, link);
-		qr_new((arena_run_t *)&bin->runs25, link);
-		qr_new((arena_run_t *)&bin->runs50, link);
-		qr_new((arena_run_t *)&bin->runs75, link);
+		qr_new(arena_bin_link(&bin->runs0), link);
+		qr_new(arena_bin_link(&bin->runs25), link);
+		qr_new(arena_bin_link(&bin->runs50), link);
+		qr_new(arena_bin_link(&bin->runs75), link);
 
 		bin->reg_size = (1 << (tiny_min_2pow + i));
 
@@ -2530,10 +2541,10 @@
 	for (; i < ntbins + nqbins; i++) {
 		bin = &arena->bins[i];
 		bin->runcur = NULL;
-		qr_new((arena_run_t *)&bin->runs0, link);
-		qr_new((arena_run_t *)&bin->runs25, link);
-		qr_new((arena_run_t *)&bin->runs50, link);
-		qr_new((arena_run_t *)&bin->runs75, link);
+		qr_new(arena_bin_link(&bin->runs0), link);
+		qr_new(arena_bin_link(&bin->runs25), link);
+		qr_new(arena_bin_link(&bin->runs50), link);
+		qr_new(arena_bin_link(&bin->runs75), link);
 
 		bin->reg_size = quantum * (i - ntbins + 1);
 
@@ -2564,10 +2575,10 @@
 	for (; i < ntbins + nqbins + nsbins; i++) {
 		bin = &arena->bins[i];
 		bin->runcur = NULL;
-		qr_new((arena_run_t *)&bin->runs0, link);
-		qr_new((arena_run_t *)&bin->runs25, link);
-		qr_new((arena_run_t *)&bin->runs50, link);
-		qr_new((arena_run_t *)&bin->runs75, link);
+		qr_new(arena_bin_link(&bin->runs0), link);
+		qr_new(arena_bin_link(&bin->runs25), link);
+		qr_new(arena_bin_link(&bin->runs50), link);
+		qr_new(arena_bin_link(&bin->runs75), link);
 
 		bin->reg_size = (small_max << (i - (ntbins + nqbins) + 1));
 
@@ -2940,7 +2951,7 @@
 		malloc_mutex_lock(&chunks_mtx);
 
 		/* Extract from tree of huge allocations. */
-		key.chunk = (void *)ptr;
+		key.chunk = __DECONST(void *, ptr);
 		node = RB_FIND(chunk_tree_s, &huge, &key);
 		assert(node != NULL);
 
@@ -3150,7 +3161,7 @@
 		 * pagesize_2pow.
 		 */
 		assert(((result - 1) & result) == 0);
-		pagesize_2pow = ffs(result) - 1;
+		pagesize_2pow = ffs((int)result) - 1;
 	}
 
 	for (i = 0; i < 3; i++) {
@@ -3410,7 +3421,7 @@
 		    89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
 		    151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211,
 		    223, 227, 229, 233, 239, 241, 251, 257, 263};
-		unsigned i, nprimes, parenas;
+		unsigned nprimes, parenas;
 
 		/*
 		 * Pick a prime number of hash arenas that is more than narenas
@@ -3559,6 +3570,7 @@
 	size_t num_size;
 
 	if (malloc_init()) {
+		num_size = 0;
 		ret = NULL;
 		goto RETURN;
 	}

==== //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/lib/libc/sys/quotactl.2#3 (text+ko) ====

@@ -29,7 +29,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\"	@(#)quotactl.2	8.2 (Berkeley) 3/10/95
-.\" $FreeBSD: src/lib/libc/sys/quotactl.2,v 1.25 2007/01/09 00:28:15 imp Exp $
+.\" $FreeBSD: src/lib/libc/sys/quotactl.2,v 1.26 2007/02/01 02:31:02 mpp Exp $
 .\"
 .Dd March 5, 1999
 .Dt QUOTACTL 2
@@ -54,7 +54,7 @@
 .Fa cmd
 operates on the given filename
 .Fa path
-for the given user
+for the given user or group
 .Fa id .
 (NOTE: One should use the QCMD macro defined in
 .In ufs/ufs/quota.h
@@ -65,6 +65,12 @@
 may be given; its interpretation
 is discussed below with each command.
 .Pp
+For commands that use the
+.Fa id
+identifier, it must be either -1 or any positive value.
+The value of -1 indicates that the current UID or GID should be used.
+Any other negative value will return an error.
+.Pp
 Currently quotas are supported only for the
 .Dq ufs
 file system.
@@ -175,6 +181,15 @@
 and
 .Dv Q_SETQUOTA ,
 quotas are not currently enabled for this file system.
+.Pp
+The
+.Fa id
+argument to
+.Dv Q_GETQUOTA ,
+.Dv Q_SETQUOTA 
+or
+.Dv Q_SETUSE
+is a negative value.
 .It Bq Er EACCES
 In
 .Dv Q_QUOTAON ,

==== //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/share/mk/bsd.libnames.mk#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/share/mk/bsd.libnames.mk,v 1.99 2006/09/30 11:32:46 ru Exp $
+# $FreeBSD: src/share/mk/bsd.libnames.mk,v 1.100 2007/02/01 08:45:27 rafan Exp $
 
 # The include file <bsd.libnames.mk> define library names.
 # Other include files (e.g. bsd.prog.mk, bsd.lib.mk) include this
@@ -81,7 +81,6 @@
 LIBMILTER?=	${DESTDIR}${LIBDIR}/libmilter.a
 .endif
 LIBMP?=		${DESTDIR}${LIBDIR}/libmp.a
-LIBMYTINFO?=	"don't use LIBMYTINFO, use LIBNCURSES"
 .if ${MK_NCP} != "no"
 LIBNCP?=	${DESTDIR}${LIBDIR}/libncp.a
 .endif

==== //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/usr.bin/quota/quota.c#2 (text+ko) ====

@@ -48,7 +48,7 @@
  * Disk quota reporting program.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/quota/quota.c,v 1.25 2006/10/21 23:57:38 ru Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/quota/quota.c,v 1.26 2007/02/01 08:37:44 mpp Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -88,11 +88,11 @@
 static const char *timeprt(time_t seconds);
 static struct quotause *getprivs(long id, int quotatype);
 static void usage(void);
-static void showuid(u_long uid);
-static void showgid(u_long gid);
-static void showusrname(char *name);
-static void showgrpname(char *name);
-static void showquotas(int type, u_long id, const char *name);
+static int showuid(u_long uid);
+static int showgid(u_long gid);
+static int showusrname(char *name);
+static int showgrpname(char *name);
+static int showquotas(int type, u_long id, const char *name);
 static void heading(int type, u_long id, const char *name, const char *tag);
 static int ufshasquota(struct fstab *fs, int type, char **qfnamep);
 static int getufsquota(struct fstab *fs, struct quotause *qup, long id,
@@ -113,7 +113,7 @@
 {
 	int ngroups; 
 	gid_t mygid, gidset[NGROUPS];
-	int i, ch, gflag = 0, uflag = 0;
+	int i, ch, gflag = 0, uflag = 0, errflag = 0;
 
 	while ((ch = getopt(argc, argv, "ghlquv")) != -1) {
 		switch(ch) {
@@ -145,39 +145,39 @@
 		uflag++;
 	if (argc == 0) {
 		if (uflag)
-			showuid(getuid());
+			errflag += showuid(getuid());
 		if (gflag) {
 			mygid = getgid();
 			ngroups = getgroups(NGROUPS, gidset);
 			if (ngroups < 0)
 				err(1, "getgroups");
-			showgid(mygid);
+			errflag += showgid(mygid);
 			for (i = 0; i < ngroups; i++)
 				if (gidset[i] != mygid)
-					showgid(gidset[i]);
+					errflag += showgid(gidset[i]);
 		}
-		return(0);
+		return(errflag);
 	}
 	if (uflag && gflag)
 		usage();
 	if (uflag) {
 		for (; argc > 0; argc--, argv++) {
 			if (alldigits(*argv))
-				showuid(atoi(*argv));
+				errflag += showuid(atoi(*argv));
 			else
-				showusrname(*argv);
+				errflag += showusrname(*argv);
 		}
-		return(0);
+		return(errflag);
 	}
 	if (gflag) {
 		for (; argc > 0; argc--, argv++) {
 			if (alldigits(*argv))
-				showgid(atoi(*argv));
+				errflag += showgid(atoi(*argv));
 			else
-				showgrpname(*argv);
+				errflag += showgrpname(*argv);
 		}
 	}
-	return(0);
+	return(errflag);
 }
 
 static void
@@ -194,7 +194,7 @@
 /*
  * Print out quotas for a specified user identifier.
  */
-static void
+static int
 showuid(u_long uid)
 {
 	struct passwd *pwd = getpwuid(uid);
@@ -204,28 +204,28 @@
 		name = "(no account)";
 	else
 		name = pwd->pw_name;
-	showquotas(USRQUOTA, uid, name);
+	return(showquotas(USRQUOTA, uid, name));
 }
 
 /*
  * Print out quotas for a specifed user name.
  */
-static void
+static int
 showusrname(char *name)
 {
 	struct passwd *pwd = getpwnam(name);
 
 	if (pwd == NULL) {
 		warnx("%s: unknown user", name);
-		return;
+		return(1);
 	}
-	showquotas(USRQUOTA, pwd->pw_uid, name);
+	return(showquotas(USRQUOTA, pwd->pw_uid, name));
 }
 
 /*
  * Print out quotas for a specified group identifier.
  */
-static void
+static int
 showgid(u_long gid)
 {
 	struct group *grp = getgrgid(gid);
@@ -235,22 +235,22 @@
 		name = "(no entry)";
 	else
 		name = grp->gr_name;
-	showquotas(GRPQUOTA, gid, name);
+	return(showquotas(GRPQUOTA, gid, name));
 }
 
 /*
  * Print out quotas for a specifed group name.
  */
-static void
+static int
 showgrpname(char *name)
 {
 	struct group *grp = getgrnam(name);
 
 	if (grp == NULL) {
 		warnx("%s: unknown group", name);
-		return;
+		return(1);
 	}
-	showquotas(GRPQUOTA, grp->gr_gid, name);
+	return(showquotas(GRPQUOTA, grp->gr_gid, name));
 }
 
 static void
@@ -264,14 +264,14 @@
 	(void)printf(" %*s", len, buf);
 }
 
-static void
+static int
 showquotas(int type, u_long id, const char *name)
 {
 	struct quotause *qup;
 	struct quotause *quplist;
 	const char *msgi, *msgb;
 	const char *nam;
-	int lines = 0;
+	int lines = 0, overquota = 0;
 	static time_t now;
 
 	if (now == 0)
@@ -286,10 +286,13 @@
 			continue;
 		msgi = (char *)0;
 		if (qup->dqblk.dqb_ihardlimit &&
-		    qup->dqblk.dqb_curinodes >= qup->dqblk.dqb_ihardlimit)
+		    qup->dqblk.dqb_curinodes >= qup->dqblk.dqb_ihardlimit) {
+			overquota++;
 			msgi = "File limit reached on";
+		}
 		else if (qup->dqblk.dqb_isoftlimit &&
 		    qup->dqblk.dqb_curinodes >= qup->dqblk.dqb_isoftlimit) {
+			overquota++;
 			if (qup->dqblk.dqb_itime > now)
 				msgi = "In file grace period on";
 			else
@@ -297,10 +300,13 @@
 		}
 		msgb = (char *)0;
 		if (qup->dqblk.dqb_bhardlimit &&
-		    qup->dqblk.dqb_curblocks >= qup->dqblk.dqb_bhardlimit)
+		    qup->dqblk.dqb_curblocks >= qup->dqblk.dqb_bhardlimit) {
+			overquota++;
 			msgb = "Block limit reached on";
+		}
 		else if (qup->dqblk.dqb_bsoftlimit &&
 		    qup->dqblk.dqb_curblocks >= qup->dqblk.dqb_bsoftlimit) {
+			overquota++;
 			if (qup->dqblk.dqb_btime > now)
 				msgb = "In block grace period on";
 			else
@@ -357,6 +363,7 @@
 	}
 	if (!qflag && lines == 0)
 		heading(type, id, name, "none");
+	return(overquota);
 }
 
 static void

==== //depot/projects/soc2006/nss_ldap_cached_no_nss_ldap/src/usr.sbin/pkg_install/add/main.c#2 (text+ko) ====

@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.sbin/pkg_install/add/main.c,v 1.70 2006/09/29 17:17:53 ru Exp $");
+__FBSDID("$FreeBSD: src/usr.sbin/pkg_install/add/main.c,v 1.72 2007/02/01 15:52:47 pav Exp $");
 
 #include <err.h>
 #include <sys/param.h>
@@ -47,9 +47,7 @@
 char	FirstPen[FILENAME_MAX];
 add_mode_t AddMode	= NORMAL;
 
-#define MAX_PKGS	200
-char	pkgnames[MAX_PKGS][MAXPATHLEN];
-char	*pkgs[MAX_PKGS];
+char	**pkgs;
 
 struct {
 	int lowver;	/* Lowest version number to match */
@@ -179,15 +177,13 @@
     argc -= optind;
     argv += optind;
 
-    if (argc > MAX_PKGS) {
-	errx(1, "too many packages (max %d)", MAX_PKGS);
-    }
-
     if (AddMode != SLAVE) {
-	for (ch = 0; ch < MAX_PKGS; pkgs[ch++] = NULL) ;
+	pkgs = (char **)malloc((argc+1) * sizeof(char *));
+	for (ch = 0; ch <= argc; pkgs[ch++] = NULL) ;
 
 	/* Get all the remaining package names, if any */
 	for (ch = 0; *argv; ch++, argv++) {
+	    char temp[MAXPATHLEN];
     	    if (Remote) {
 		if ((packagesite = getpackagesite()) == NULL)
 		    errx(1, "package name too long");
@@ -213,31 +209,27 @@
 	    if (!strcmp(*argv, "-"))	/* stdin? */
 		pkgs[ch] = (char *)"-";
 	    else if (isURL(*argv)) {  	/* preserve URLs */
-		if (strlcpy(pkgnames[ch], *argv, sizeof(pkgnames[ch]))
-		    >= sizeof(pkgnames[ch]))
+		if (strlcpy(temp, *argv, sizeof(temp)) >= sizeof(temp))
 		    errx(1, "package name too long");
-		pkgs[ch] = pkgnames[ch];
+		pkgs[ch] = strdup(temp);
 	    }
 	    else if ((Remote) && isURL(remotepkg)) {
-	    	if (strlcpy(pkgnames[ch], remotepkg, sizeof(pkgnames[ch]))
-		    >= sizeof(pkgnames[ch]))
+	    	if (strlcpy(temp, remotepkg, sizeof(temp)) >= sizeof(temp))
 		    errx(1, "package name too long");
-		pkgs[ch] = pkgnames[ch];
+		pkgs[ch] = strdup(temp);
 	    } else {			/* expand all pathnames to fullnames */
 		if (fexists(*argv)) /* refers to a file directly */
-		    pkgs[ch] = realpath(*argv, pkgnames[ch]);
+		    pkgs[ch] = strdup(realpath(*argv, temp));
 		else {		/* look for the file in the expected places */
 		    if (!(cp = fileFindByPath(NULL, *argv))) {
 			/* let pkg_do() fail later, so that error is reported */
-			if (strlcpy(pkgnames[ch], *argv, sizeof(pkgnames[ch]))
-			    >= sizeof(pkgnames[ch]))
+			if (strlcpy(temp, *argv, sizeof(temp)) >= sizeof(temp))
 			    errx(1, "package name too long");
-			pkgs[ch] = pkgnames[ch];
+			pkgs[ch] = strdup(temp);
 		    } else {
-			if (strlcpy(pkgnames[ch], cp, sizeof(pkgnames[ch]))
-			    >= sizeof(pkgnames[ch]))
+			if (strlcpy(temp, cp, sizeof(temp)) >= sizeof(temp))
 			    errx(1, "package name too long");
-			pkgs[ch] = pkgnames[ch];
+			pkgs[ch] = strdup(temp);
 		    }
 		}
 	    }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702020907.l1297NhS070608>