Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Feb 2002 13:39:33 +0200
From:      Peter Pentchev <roam@ringlet.net>
To:        Maxim Sobolev <sobomax@FreeBSD.org>
Cc:        audit@FreeBSD.org
Subject:   [CFR] pkg_install/pkg_create fixes
Message-ID:  <20020220133933.D334@straylight.oblivion.bg>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Hi,

Today, while debugging a ftp/curl port install problem, I got the crazy
idea of trying a 'make -dl' to see exactly what and why was executed.
Of course, this was stupid, since make -dl outputs all the debug info
on stdout, which kind of messes up the output of the package-depends
and similar targets :)  However, in the meantime, this uncovered two
minor problems with pkg_create(1).

The first one was a skipped pointer initialization, possibly resulting
later in an uninitialized pointer dereference.  When the depedencies' list
is built, empty strings are skipped - but space for them is still allocated,
and the corresponding pointers are not changed at all.  This leads straight
into a segfault when sortdeps() tries to 'sort' those uninitialized strings.

The second one is a minor sortdeps() problem - an off-by-one in looping over
the dependencies' list.  Fortunately, the resulting null pointer dereference
is done in chkifdepends()'s snprintf(), which does not blow up, but simply
produces a nonexistent package dir name, so the situation here is somewhat
mitigated.  Still, I don't think it would hurt to fix the off-by-one :)

How to repeat?  Simple: cd /usr/ports/ftp/curl && make -dl clean all install
You will easily notice the first problem, when sortdeps() hits the uninit'd
pointer resulting from `make -dl package-depends` containing two spaces
in a row.  The second problem was the result of my misplacing the fault
for the first one.

Thanks for reading this far :)

G'luck,
Peter

-- 
Peter Pentchev	roam@ringlet.net	roam@FreeBSD.org
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
This inert sentence is my body, but my soul is alive, dancing in the sparks of your brain.

Index: src/usr.sbin/pkg_install/create/perform.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/perform.c,v
retrieving revision 1.62
diff -u -r1.62 perform.c
--- src/usr.sbin/pkg_install/create/perform.c	17 Jan 2002 10:51:39 -0000	1.62
+++ src/usr.sbin/pkg_install/create/perform.c	20 Feb 2002 11:31:58 -0000
@@ -130,7 +130,10 @@
 		cp = strsep(&Pkgdeps, " \t\n");
 		if (*cp)
 		    deps[i] = cp;
+		else
+		    i--;
 	    }
+	    ndeps = i;
 	    deps[ndeps] = NULL;
 
 	    sortdeps(deps);
Index: src/usr.sbin/pkg_install/lib/deps.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/deps.c,v
retrieving revision 1.5
diff -u -r1.5 deps.c
--- src/usr.sbin/pkg_install/lib/deps.c	10 Oct 2001 06:58:42 -0000	1.5
+++ src/usr.sbin/pkg_install/lib/deps.c	20 Feb 2002 11:16:15 -0000
@@ -41,7 +41,10 @@
     int i, j, loop_cnt;
     int err_cnt = 0;
 
-    for (i = 0; pkgs[i]; i++) {
+    if (pkgs[0] == NULL)
+	    return (0);
+
+    for (i = 0; pkgs[i + 1] != NULL; i++) {
 	/*
 	 * Check to see if any other package in pkgs[i+1:] depends
 	 * on pkgs[i] and swap those two packages if so.

[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (FreeBSD)
Comment: For info see http://www.gnupg.org

iEYEARECAAYFAjxzivUACgkQ7Ri2jRYZRVOlWwCeLLMMO6aoFlAyuou7uxxrOBr7
7QQAnRqsFi10uAPBRG3VZdryJ5f+Qrgm
=eWi7
-----END PGP SIGNATURE-----

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