openpkg/rpm.patch.bugfix

changeset 13
cb59d6afeb61
child 333
4ecfc2416fd8
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/openpkg/rpm.patch.bugfix	Tue Jan 06 23:40:39 2009 +0100
     1.3 @@ -0,0 +1,369 @@
     1.4 +##
     1.5 +##  rpm.patch.bugfix -- Annotated OpenPKG RPM Patch file
     1.6 +##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     1.7 +##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     1.8 +##
     1.9 +##  This file assembles changes to existing RPM source files between
    1.10 +##  the original RedHat RPM and the OpenPKG RPM variant. It can be
    1.11 +##  automatically applied to a vanilla RedHat RPM source tree with the
    1.12 +##  'patch' tool to upgrade those files. Each patch snippet is annotated
    1.13 +##  with a short description.
    1.14 +##
    1.15 +##  Created on: 13-Sep-2006
    1.16 +##
    1.17 +##  ATTENTION: THIS PATCH FILE WAS AUTO-GENERATED FROM AN OPENPKG
    1.18 +##             RPM CVS REPOSITORY, HENCE DO NOT EDIT THIS FILE.
    1.19 +##
    1.20 +
    1.21 ++---------------------------------------------------------------------------
    1.22 +| %setup and %patch macros are treated very special internally, but
    1.23 +| make sure they at least optically can be used like any other macro
    1.24 +| and especially can have leading whitespaces.
    1.25 ++---------------------------------------------------------------------------
    1.26 +Index: build/parsePrep.c
    1.27 +--- build/parsePrep.c	7 Aug 2002 14:20:45 -0000	1.1.1.10
    1.28 ++++ build/parsePrep.c	6 Jun 2005 15:53:04 -0000	1.4
    1.29 +@@ -584,12 +635,15 @@
    1.30 +     saveLines = splitString(getStringBuf(sb), strlen(getStringBuf(sb)), '\n');
    1.31 +     /*@-usereleased@*/
    1.32 +     for (lines = saveLines; *lines; lines++) {
    1.33 ++        char *cp;
    1.34 ++        for (cp = *lines; *cp == ' ' || *cp == '\t'; cp++)
    1.35 ++            ;
    1.36 + 	res = 0;
    1.37 + /*@-boundsread@*/
    1.38 +-	if (! strncmp(*lines, "%setup", sizeof("%setup")-1)) {
    1.39 +-	    res = doSetupMacro(spec, *lines);
    1.40 +-	} else if (! strncmp(*lines, "%patch", sizeof("%patch")-1)) {
    1.41 +-	    res = doPatchMacro(spec, *lines);
    1.42 ++	if (! strncmp(cp, "%setup", sizeof("%setup")-1)) {
    1.43 ++	    res = doSetupMacro(spec, cp);
    1.44 ++	} else if (! strncmp(cp, "%patch", sizeof("%patch")-1)) {
    1.45 ++	    res = doPatchMacro(spec, cp);
    1.46 + 	} else {
    1.47 + 	    appendLineStringBuf(spec->prep, *lines);
    1.48 + 	}
    1.49 +
    1.50 ++---------------------------------------------------------------------------
    1.51 +| Do not pick of the vendor BeeCrypt package on RedHat Linux.
    1.52 ++---------------------------------------------------------------------------
    1.53 +Index: configure.ac
    1.54 +--- configure.ac	2 Jul 2003 19:20:52 -0000	1.1.1.4
    1.55 ++++ configure.ac	13 Sep 2006 13:38:23 -0000
    1.56 +@@ -416,7 +417,7 @@
    1.57 + AC_CHECK_HEADER([beecrypt/beecrypt.h], [
    1.58 + 	AC_CHECK_LIB(beecrypt, mpfprintln, [
    1.59 + 	    AC_DEFINE(HAVE_LIBBEECRYPT, 1, [Define to 1 if you have the `beecrypt' library (-lbeecrypt).])
    1.60 +-	    WITH_BEECRYPT_INCLUDE="-I/usr/include/beecrypt"
    1.61 ++	    WITH_BEECRYPT_INCLUDE=""
    1.62 + 	    WITH_BEECRYPT_LIB="-lbeecrypt"
    1.63 + 	])
    1.64 +     ], [
    1.65 +
    1.66 ++---------------------------------------------------------------------------
    1.67 +| Remove access to not-existing beecrypt/ subdirectory
    1.68 +| to avoid the configure script to break building.
    1.69 ++---------------------------------------------------------------------------
    1.70 +Index: configure.ac
    1.71 +--- configure.ac	2 Jul 2003 19:20:52 -0000	1.1.1.4
    1.72 ++++ configure.ac	13 Sep 2006 13:38:26 -0000
    1.73 +@@ -1274,7 +1305,6 @@
    1.74 + 	python/rpmdb/Makefile
    1.75 + 	python/test/Makefile
    1.76 +   ], [	echo timestamp > popt/stamp-h.in
    1.77 +-	echo timestamp > beecrypt/stamp-h.in
    1.78 + 	echo timestamp > stamp-h.in
    1.79 +   ]
    1.80 + )
    1.81 +
    1.82 ++---------------------------------------------------------------------------
    1.83 +| Fix filedescriptor leakage.
    1.84 ++---------------------------------------------------------------------------
    1.85 +Index: lib/psm.c
    1.86 +--- lib/psm.c	5 Jun 2003 12:43:18 -0000	1.1.1.6
    1.87 ++++ lib/psm.c	13 Sep 2006 13:38:27 -0000
    1.88 +@@ -940,6 +960,8 @@
    1.89 + 	    if (sfdno > STDERR_FILENO) {
    1.90 + 		xx = Fclose (scriptFd);
    1.91 + 	    }
    1.92 ++	} else {
    1.93 ++	    xx = Fclose(out);
    1.94 + 	}
    1.95 + 
    1.96 + 	{   const char *ipath = rpmExpand("PATH=%{_install_script_path}", NULL);
    1.97 +
    1.98 ++---------------------------------------------------------------------------
    1.99 +| Fix trigger argument passing. For more details see RPM BugDB under:
   1.100 +| http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=100509
   1.101 ++---------------------------------------------------------------------------
   1.102 +Index: lib/psm.c
   1.103 +--- lib/psm.c	5 Jun 2003 12:43:18 -0000	1.1.1.6
   1.104 ++++ lib/psm.c	13 Sep 2006 13:38:29 -0000
   1.105 +@@ -1106,11 +1128,13 @@
   1.106 +     const char ** triggerProgs;
   1.107 +     int_32 * triggerIndices;
   1.108 +     const char * sourceName;
   1.109 ++    const char * triggerName;
   1.110 +     rpmRC rc = RPMRC_OK;
   1.111 +     int xx;
   1.112 +     int i;
   1.113 + 
   1.114 +     xx = headerNVR(sourceH, &sourceName, NULL, NULL);
   1.115 ++    xx = headerNVR(triggeredH, &triggerName, NULL, NULL);
   1.116 + 
   1.117 +     trigger = rpmdsInit(rpmdsNew(triggeredH, RPMTAG_TRIGGERNAME, scareMem));
   1.118 +     if (trigger == NULL)
   1.119 +@@ -1149,7 +1173,7 @@
   1.120 + 	{   int arg1;
   1.121 + 	    int index;
   1.122 + 
   1.123 +-	    arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), Name);
   1.124 ++	    arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName);
   1.125 + 	    if (arg1 < 0) {
   1.126 + 		/* XXX W2DO? fails as "execution of script failed" */
   1.127 + 		rc = RPMRC_FAIL;
   1.128 +
   1.129 ++---------------------------------------------------------------------------
   1.130 +| Make sure RPM does not try to set file owner/group on files during
   1.131 +| installation of _source_ RPMs. Instead, let it use the current
   1.132 +| run-time owner/group, because most of the time the owner/group in
   1.133 +| the source RPM (which is the owner/group of the files as staying on
   1.134 +| the package author system) is not existing on the target system, of
   1.135 +| course.
   1.136 ++---------------------------------------------------------------------------
   1.137 +Index: lib/psm.c
   1.138 +--- lib/psm.c	5 Jun 2003 12:43:18 -0000	1.1.1.6
   1.139 ++++ lib/psm.c	13 Sep 2006 13:38:32 -0000
   1.140 +@@ -1710,6 +1734,7 @@
   1.141 + 
   1.142 + 		uid = fi->uid;
   1.143 + 		gid = fi->gid;
   1.144 ++		if (!headerIsEntry(fi->h, RPMTAG_SOURCEPACKAGE)) {
   1.145 + 		if (fi->fuser && unameToUid(fi->fuser[i], &uid)) {
   1.146 + 		    rpmMessage(RPMMESS_WARNING,
   1.147 + 			_("user %s does not exist - using root\n"),
   1.148 +@@ -1727,6 +1752,7 @@
   1.149 + 		    /* XXX this diddles header memory. */
   1.150 + 		    fi->fmodes[i] &= ~S_ISGID;	/* turn off the sgid bit */
   1.151 + 		}
   1.152 ++		}
   1.153 + 		if (fi->fuids) fi->fuids[i] = uid;
   1.154 + 		if (fi->fgids) fi->fgids[i] = gid;
   1.155 + 	    }
   1.156 +
   1.157 ++---------------------------------------------------------------------------
   1.158 +| Fix --justdb operation by consistently use the same rootDir checks
   1.159 +| RPM uses everywhere else, too.
   1.160 ++---------------------------------------------------------------------------
   1.161 +Index: lib/psm.c
   1.162 +--- lib/psm.c	5 Jun 2003 12:43:18 -0000	1.1.1.6
   1.163 ++++ lib/psm.c	13 Sep 2006 13:38:33 -0000
   1.164 +@@ -2027,7 +2053,8 @@
   1.165 +     case PSM_CHROOT_IN:
   1.166 +     {	const char * rootDir = rpmtsRootDir(ts);
   1.167 + 	/* Change root directory if requested and not already done. */
   1.168 +-	if (rootDir != NULL && !rpmtsChrootDone(ts) && !psm->chrootDone) {
   1.169 ++	if (rootDir != NULL && !(rootDir[0] == '/' && rootDir[1] == '\0')
   1.170 ++        && !rpmtsChrootDone(ts) && !psm->chrootDone) {
   1.171 + 	    static int _loaded = 0;
   1.172 + 
   1.173 + 	    /*
   1.174 +
   1.175 ++---------------------------------------------------------------------------
   1.176 +| First, remove incorrectly introduced buffer assignment. Second, fix
   1.177 +| second and subsequent "%{foo -x}" constructs for non-Linux systems
   1.178 +| (without resetting the option index only the first construct would
   1.179 +| work). Third, bugfix the handling of macros inside macro arguments
   1.180 +| as in "%{foo bar%{quux}baz}": RPM correctly determined the pointer
   1.181 +| to the terminating second closing brace, but instead of passing
   1.182 +| this pointer to the subroutine which handles the macro argument
   1.183 +| construction, it passed the underlying character. This in turn
   1.184 +| obviously leaded to an incorrect determination of the argument end
   1.185 +| (it then though the first closing brace is the end). We fix this by
   1.186 +| passing the pointer and not the underlying character.
   1.187 ++---------------------------------------------------------------------------
   1.188 +Index: rpmio/macro.c
   1.189 +--- rpmio/macro.c	15 May 2003 13:42:01 -0000	1.1.1.7
   1.190 ++++ rpmio/macro.c	22 Jan 2004 21:42:32 -0000	1.2
   1.191 +@@ -879,7 +882,7 @@
   1.192 +  */
   1.193 + /*@-bounds@*/
   1.194 + /*@dependent@*/ static const char *
   1.195 +-grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se, char lastc)
   1.196 ++grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se, char *lastc)
   1.197 + 	/*@globals rpmGlobalMacroContext @*/
   1.198 + 	/*@modifies mb, rpmGlobalMacroContext @*/
   1.199 + {
   1.200 +@@ -900,7 +903,7 @@
   1.201 + 
   1.202 +     /* Copy args into buf until lastc */
   1.203 +     *be++ = ' ';
   1.204 +-    while ((c = *se++) != '\0' && c != lastc) {
   1.205 ++    while ((c = *se++) != '\0' && (se-1) != lastc) {
   1.206 + /*@-globs@*/
   1.207 + 	if (!isblank(c)) {
   1.208 + 	    *be++ = c;
   1.209 +@@ -968,6 +971,8 @@
   1.210 +     /*@-mods@*/
   1.211 +     optind = 0;		/* XXX but posix != glibc */
   1.212 +     /*@=mods@*/
   1.213 ++#else
   1.214 ++    optind = 1;
   1.215 + #endif
   1.216 + 
   1.217 +     opts = me->opts;
   1.218 +@@ -1168,7 +1175,7 @@
   1.219 +     int c;
   1.220 +     int rc = 0;
   1.221 +     int negate;
   1.222 +-    char grab;
   1.223 ++    char *grab;
   1.224 +     int chkexist;
   1.225 + 
   1.226 +     if (++mb->depth > max_macro_depth) {
   1.227 +@@ -1202,7 +1209,7 @@
   1.228 + 	if (mb->depth > 1)	/* XXX full expansion for outermost level */
   1.229 + 		t = mb->t;	/* save expansion pointer for printExpand */
   1.230 + 	negate = 0;
   1.231 +-	grab = '\0';
   1.232 ++	grab = NULL;
   1.233 + 	chkexist = 0;
   1.234 + 	switch ((c = *s)) {
   1.235 + 	default:		/* %name substitution */
   1.236 +@@ -1237,7 +1244,8 @@
   1.237 + 		/* For "%name " macros ... */
   1.238 + /*@-globs@*/
   1.239 + 		if ((c = *fe) && isblank(c))
   1.240 +-			grab = '\n';
   1.241 ++			if ((grab = strchr(fe,'\n')) == NULL)
   1.242 ++                grab = strchr(fe, '\0');
   1.243 + /*@=globs@*/
   1.244 + 		/*@switchbreak@*/ break;
   1.245 + 	case '(':		/* %(...) shell escape */
   1.246 +@@ -1284,7 +1292,7 @@
   1.247 + 			ge = se - 1;
   1.248 + 			/*@innerbreak@*/ break;
   1.249 + 		case ' ':
   1.250 +-			grab = se[-1];
   1.251 ++			grab = se-1;
   1.252 + 			/*@innerbreak@*/ break;
   1.253 + 		default:
   1.254 + 			/*@innerbreak@*/ break;
   1.255 +@@ -1438,7 +1446,7 @@
   1.256 + 
   1.257 + 	/* Setup args for "%name " macros with opts */
   1.258 + 	if (me && me->opts != NULL) {
   1.259 +-		if (grab != '\0') {
   1.260 ++		if (grab != NULL) {
   1.261 + 			se = grabArgs(mb, me, fe, grab);
   1.262 + 		} else {
   1.263 + 			addMacro(mb->mc, "**", NULL, "", mb->depth);
   1.264 +
   1.265 ++---------------------------------------------------------------------------
   1.266 +| Backported RPM vendor patch:
   1.267 +| "fix: packages w/o file colors segfault"
   1.268 +| (cvs diff -r2.41.2.6 -r2.41.2.7 lib/rpmfi.c)
   1.269 ++---------------------------------------------------------------------------
   1.270 +Index: lib/rpmfi.c
   1.271 +--- lib/rpmfi.c	17 Jul 2003 22:44:28 -0000	1.1.1.3
   1.272 ++++ lib/rpmfi.c	22 Jan 2004 21:42:24 -0000	1.2
   1.273 +@@ -866,6 +866,7 @@
   1.274 + 	*fn = '\0';
   1.275 + 	fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn;
   1.276 + 
   1.277 ++if (fColors != NULL)
   1.278 + dColors[dirIndexes[i]] |= fColors[i];
   1.279 + 	/*
   1.280 + 	 * See if this file path needs relocating.
   1.281 +
   1.282 ++---------------------------------------------------------------------------
   1.283 +| The "%_excludedocs" macro is intended to set the _default_ if
   1.284 +| both --excludedocs and --includedocs are not specified and it is
   1.285 +| evaluated already before. So, do not override it here again, because
   1.286 +| it would not allow us to make "%_excludedocs 1" the default.
   1.287 ++---------------------------------------------------------------------------
   1.288 +Index: lib/transaction.c
   1.289 +--- lib/transaction.c	15 Jul 2003 15:15:47 -0000	1.1.1.15
   1.290 ++++ lib/transaction.c	22 Jan 2004 21:42:26 -0000	1.2
   1.291 +@@ -702,8 +702,10 @@
   1.292 +     int dc;
   1.293 +     int i, j;
   1.294 + 
   1.295 ++#if 0
   1.296 +     if (!noDocs)
   1.297 + 	noDocs = rpmExpandNumeric("%{_excludedocs}");
   1.298 ++#endif
   1.299 + 
   1.300 +     {	const char *tmpPath = rpmExpand("%{_netsharedpath}", NULL);
   1.301 + 	/*@-branchstate@*/
   1.302 +
   1.303 ++---------------------------------------------------------------------------
   1.304 +| Bugfix: POSIX/SUSv3 clearly expresses that fcntl(2) returns "value
   1.305 +| other than -1" on success, so check for equality to -1 instead of
   1.306 +| non-equality to 0. In practice this does not harm on most platforms,
   1.307 +| because they fortunately (by conincidence and common practice)
   1.308 +| return 0.
   1.309 +| Additionally, at least Solaris may reject (see fcntl(2) manpage) the
   1.310 +| (partial) locking, because DB mmap(2)'ed the file (or vice versa).
   1.311 +| The workaround is to lock the entire(!) file.
   1.312 ++---------------------------------------------------------------------------
   1.313 +Index: db/mutex/mut_fcntl.c
   1.314 +--- db/mutex/mut_fcntl.c	18 Jan 2003 14:05:03 -0000	1.1.1.5
   1.315 ++++ db/mutex/mut_fcntl.c	22 Jan 2004 21:42:18 -0000	1.2
   1.316 +@@ -84,8 +84,13 @@
   1.317 + 
   1.318 + 	/* Initialize the lock. */
   1.319 + 	k_lock.l_whence = SEEK_SET;
   1.320 ++#if 0
   1.321 + 	k_lock.l_start = mutexp->off;
   1.322 + 	k_lock.l_len = 1;
   1.323 ++#else
   1.324 ++	k_lock.l_start = 0;
   1.325 ++	k_lock.l_len = 0;
   1.326 ++#endif
   1.327 + 
   1.328 + 	for (locked = waited = 0;;) {
   1.329 + 		/*
   1.330 +@@ -101,7 +106,7 @@
   1.331 + 
   1.332 + 		/* Acquire an exclusive kernel lock. */
   1.333 + 		k_lock.l_type = F_WRLCK;
   1.334 +-		if (fcntl(dbenv->lockfhp->fd, F_SETLKW, &k_lock))
   1.335 ++		if (fcntl(dbenv->lockfhp->fd, F_SETLKW, &k_lock) == -1)
   1.336 + 			return (__os_get_errno());
   1.337 + 
   1.338 + 		/* If the resource is still available, it's ours. */
   1.339 +@@ -112,7 +117,7 @@
   1.340 + 
   1.341 + 		/* Release the kernel lock. */
   1.342 + 		k_lock.l_type = F_UNLCK;
   1.343 +-		if (fcntl(dbenv->lockfhp->fd, F_SETLK, &k_lock))
   1.344 ++		if (fcntl(dbenv->lockfhp->fd, F_SETLK, &k_lock) == -1)
   1.345 + 			return (__os_get_errno());
   1.346 + 
   1.347 + 		/*
   1.348 +
   1.349 ++---------------------------------------------------------------------------
   1.350 +| The O_DIRECT feature is fully broken under at least Linux 2.2 and
   1.351 +| 2.4. It is sometimes accepted by open(2) without error and later
   1.352 +| causes a write(2) to fail with EINVAL -- all depending on the
   1.353 +| underlying filesystem (usually works on tmpfs and fails on ext3).
   1.354 +| Sometimes it also causes open(2) to fail with EINVAL. In general,
   1.355 +| it does especially no "graceful degradation" and so is useless for
   1.356 +| use mostly all platforms except for those where we know it works
   1.357 +| (currently FreeBSD only). Interestingly, RPM works on RedHat, just
   1.358 +| because RedHat's "kernel" package contains a patch which masks out
   1.359 +| O_DIRECT usage... ;-)
   1.360 ++---------------------------------------------------------------------------
   1.361 +Index: db/os/os_open.c
   1.362 +--- db/os/os_open.c	18 Jan 2003 14:05:03 -0000	1.1.1.5
   1.363 ++++ db/os/os_open.c	22 Jan 2004 21:42:19 -0000	1.2
   1.364 +@@ -93,7 +93,7 @@
   1.365 + 	if (LF_ISSET(DB_OSO_TRUNC))
   1.366 + 		oflags |= O_TRUNC;
   1.367 + 
   1.368 +-#ifdef HAVE_O_DIRECT
   1.369 ++#if defined(HAVE_O_DIRECT) && defined(__FreeBSD__)
   1.370 + 	if (LF_ISSET(DB_OSO_DIRECT))
   1.371 + 		oflags |= O_DIRECT;
   1.372 + #endif

mercurial