diff -r 333964c621f1 -r cb59d6afeb61 openpkg/rpm.patch.bugfix --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openpkg/rpm.patch.bugfix Tue Jan 06 23:40:39 2009 +0100 @@ -0,0 +1,369 @@ +## +## rpm.patch.bugfix -- Annotated OpenPKG RPM Patch file +## Copyright (c) 2000-2007 OpenPKG Foundation e.V. +## Copyright (c) 2000-2007 Ralf S. Engelschall +## +## This file assembles changes to existing RPM source files between +## the original RedHat RPM and the OpenPKG RPM variant. It can be +## automatically applied to a vanilla RedHat RPM source tree with the +## 'patch' tool to upgrade those files. Each patch snippet is annotated +## with a short description. +## +## Created on: 13-Sep-2006 +## +## ATTENTION: THIS PATCH FILE WAS AUTO-GENERATED FROM AN OPENPKG +## RPM CVS REPOSITORY, HENCE DO NOT EDIT THIS FILE. +## + ++--------------------------------------------------------------------------- +| %setup and %patch macros are treated very special internally, but +| make sure they at least optically can be used like any other macro +| and especially can have leading whitespaces. ++--------------------------------------------------------------------------- +Index: build/parsePrep.c +--- build/parsePrep.c 7 Aug 2002 14:20:45 -0000 1.1.1.10 ++++ build/parsePrep.c 6 Jun 2005 15:53:04 -0000 1.4 +@@ -584,12 +635,15 @@ + saveLines = splitString(getStringBuf(sb), strlen(getStringBuf(sb)), '\n'); + /*@-usereleased@*/ + for (lines = saveLines; *lines; lines++) { ++ char *cp; ++ for (cp = *lines; *cp == ' ' || *cp == '\t'; cp++) ++ ; + res = 0; + /*@-boundsread@*/ +- if (! strncmp(*lines, "%setup", sizeof("%setup")-1)) { +- res = doSetupMacro(spec, *lines); +- } else if (! strncmp(*lines, "%patch", sizeof("%patch")-1)) { +- res = doPatchMacro(spec, *lines); ++ if (! strncmp(cp, "%setup", sizeof("%setup")-1)) { ++ res = doSetupMacro(spec, cp); ++ } else if (! strncmp(cp, "%patch", sizeof("%patch")-1)) { ++ res = doPatchMacro(spec, cp); + } else { + appendLineStringBuf(spec->prep, *lines); + } + ++--------------------------------------------------------------------------- +| Do not pick of the vendor BeeCrypt package on RedHat Linux. ++--------------------------------------------------------------------------- +Index: configure.ac +--- configure.ac 2 Jul 2003 19:20:52 -0000 1.1.1.4 ++++ configure.ac 13 Sep 2006 13:38:23 -0000 +@@ -416,7 +417,7 @@ + AC_CHECK_HEADER([beecrypt/beecrypt.h], [ + AC_CHECK_LIB(beecrypt, mpfprintln, [ + AC_DEFINE(HAVE_LIBBEECRYPT, 1, [Define to 1 if you have the `beecrypt' library (-lbeecrypt).]) +- WITH_BEECRYPT_INCLUDE="-I/usr/include/beecrypt" ++ WITH_BEECRYPT_INCLUDE="" + WITH_BEECRYPT_LIB="-lbeecrypt" + ]) + ], [ + ++--------------------------------------------------------------------------- +| Remove access to not-existing beecrypt/ subdirectory +| to avoid the configure script to break building. ++--------------------------------------------------------------------------- +Index: configure.ac +--- configure.ac 2 Jul 2003 19:20:52 -0000 1.1.1.4 ++++ configure.ac 13 Sep 2006 13:38:26 -0000 +@@ -1274,7 +1305,6 @@ + python/rpmdb/Makefile + python/test/Makefile + ], [ echo timestamp > popt/stamp-h.in +- echo timestamp > beecrypt/stamp-h.in + echo timestamp > stamp-h.in + ] + ) + ++--------------------------------------------------------------------------- +| Fix filedescriptor leakage. ++--------------------------------------------------------------------------- +Index: lib/psm.c +--- lib/psm.c 5 Jun 2003 12:43:18 -0000 1.1.1.6 ++++ lib/psm.c 13 Sep 2006 13:38:27 -0000 +@@ -940,6 +960,8 @@ + if (sfdno > STDERR_FILENO) { + xx = Fclose (scriptFd); + } ++ } else { ++ xx = Fclose(out); + } + + { const char *ipath = rpmExpand("PATH=%{_install_script_path}", NULL); + ++--------------------------------------------------------------------------- +| Fix trigger argument passing. For more details see RPM BugDB under: +| http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=100509 ++--------------------------------------------------------------------------- +Index: lib/psm.c +--- lib/psm.c 5 Jun 2003 12:43:18 -0000 1.1.1.6 ++++ lib/psm.c 13 Sep 2006 13:38:29 -0000 +@@ -1106,11 +1128,13 @@ + const char ** triggerProgs; + int_32 * triggerIndices; + const char * sourceName; ++ const char * triggerName; + rpmRC rc = RPMRC_OK; + int xx; + int i; + + xx = headerNVR(sourceH, &sourceName, NULL, NULL); ++ xx = headerNVR(triggeredH, &triggerName, NULL, NULL); + + trigger = rpmdsInit(rpmdsNew(triggeredH, RPMTAG_TRIGGERNAME, scareMem)); + if (trigger == NULL) +@@ -1149,7 +1173,7 @@ + { int arg1; + int index; + +- arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), Name); ++ arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName); + if (arg1 < 0) { + /* XXX W2DO? fails as "execution of script failed" */ + rc = RPMRC_FAIL; + ++--------------------------------------------------------------------------- +| Make sure RPM does not try to set file owner/group on files during +| installation of _source_ RPMs. Instead, let it use the current +| run-time owner/group, because most of the time the owner/group in +| the source RPM (which is the owner/group of the files as staying on +| the package author system) is not existing on the target system, of +| course. ++--------------------------------------------------------------------------- +Index: lib/psm.c +--- lib/psm.c 5 Jun 2003 12:43:18 -0000 1.1.1.6 ++++ lib/psm.c 13 Sep 2006 13:38:32 -0000 +@@ -1710,6 +1734,7 @@ + + uid = fi->uid; + gid = fi->gid; ++ if (!headerIsEntry(fi->h, RPMTAG_SOURCEPACKAGE)) { + if (fi->fuser && unameToUid(fi->fuser[i], &uid)) { + rpmMessage(RPMMESS_WARNING, + _("user %s does not exist - using root\n"), +@@ -1727,6 +1752,7 @@ + /* XXX this diddles header memory. */ + fi->fmodes[i] &= ~S_ISGID; /* turn off the sgid bit */ + } ++ } + if (fi->fuids) fi->fuids[i] = uid; + if (fi->fgids) fi->fgids[i] = gid; + } + ++--------------------------------------------------------------------------- +| Fix --justdb operation by consistently use the same rootDir checks +| RPM uses everywhere else, too. ++--------------------------------------------------------------------------- +Index: lib/psm.c +--- lib/psm.c 5 Jun 2003 12:43:18 -0000 1.1.1.6 ++++ lib/psm.c 13 Sep 2006 13:38:33 -0000 +@@ -2027,7 +2053,8 @@ + case PSM_CHROOT_IN: + { const char * rootDir = rpmtsRootDir(ts); + /* Change root directory if requested and not already done. */ +- if (rootDir != NULL && !rpmtsChrootDone(ts) && !psm->chrootDone) { ++ if (rootDir != NULL && !(rootDir[0] == '/' && rootDir[1] == '\0') ++ && !rpmtsChrootDone(ts) && !psm->chrootDone) { + static int _loaded = 0; + + /* + ++--------------------------------------------------------------------------- +| First, remove incorrectly introduced buffer assignment. Second, fix +| second and subsequent "%{foo -x}" constructs for non-Linux systems +| (without resetting the option index only the first construct would +| work). Third, bugfix the handling of macros inside macro arguments +| as in "%{foo bar%{quux}baz}": RPM correctly determined the pointer +| to the terminating second closing brace, but instead of passing +| this pointer to the subroutine which handles the macro argument +| construction, it passed the underlying character. This in turn +| obviously leaded to an incorrect determination of the argument end +| (it then though the first closing brace is the end). We fix this by +| passing the pointer and not the underlying character. ++--------------------------------------------------------------------------- +Index: rpmio/macro.c +--- rpmio/macro.c 15 May 2003 13:42:01 -0000 1.1.1.7 ++++ rpmio/macro.c 22 Jan 2004 21:42:32 -0000 1.2 +@@ -879,7 +882,7 @@ + */ + /*@-bounds@*/ + /*@dependent@*/ static const char * +-grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se, char lastc) ++grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se, char *lastc) + /*@globals rpmGlobalMacroContext @*/ + /*@modifies mb, rpmGlobalMacroContext @*/ + { +@@ -900,7 +903,7 @@ + + /* Copy args into buf until lastc */ + *be++ = ' '; +- while ((c = *se++) != '\0' && c != lastc) { ++ while ((c = *se++) != '\0' && (se-1) != lastc) { + /*@-globs@*/ + if (!isblank(c)) { + *be++ = c; +@@ -968,6 +971,8 @@ + /*@-mods@*/ + optind = 0; /* XXX but posix != glibc */ + /*@=mods@*/ ++#else ++ optind = 1; + #endif + + opts = me->opts; +@@ -1168,7 +1175,7 @@ + int c; + int rc = 0; + int negate; +- char grab; ++ char *grab; + int chkexist; + + if (++mb->depth > max_macro_depth) { +@@ -1202,7 +1209,7 @@ + if (mb->depth > 1) /* XXX full expansion for outermost level */ + t = mb->t; /* save expansion pointer for printExpand */ + negate = 0; +- grab = '\0'; ++ grab = NULL; + chkexist = 0; + switch ((c = *s)) { + default: /* %name substitution */ +@@ -1237,7 +1244,8 @@ + /* For "%name " macros ... */ + /*@-globs@*/ + if ((c = *fe) && isblank(c)) +- grab = '\n'; ++ if ((grab = strchr(fe,'\n')) == NULL) ++ grab = strchr(fe, '\0'); + /*@=globs@*/ + /*@switchbreak@*/ break; + case '(': /* %(...) shell escape */ +@@ -1284,7 +1292,7 @@ + ge = se - 1; + /*@innerbreak@*/ break; + case ' ': +- grab = se[-1]; ++ grab = se-1; + /*@innerbreak@*/ break; + default: + /*@innerbreak@*/ break; +@@ -1438,7 +1446,7 @@ + + /* Setup args for "%name " macros with opts */ + if (me && me->opts != NULL) { +- if (grab != '\0') { ++ if (grab != NULL) { + se = grabArgs(mb, me, fe, grab); + } else { + addMacro(mb->mc, "**", NULL, "", mb->depth); + ++--------------------------------------------------------------------------- +| Backported RPM vendor patch: +| "fix: packages w/o file colors segfault" +| (cvs diff -r2.41.2.6 -r2.41.2.7 lib/rpmfi.c) ++--------------------------------------------------------------------------- +Index: lib/rpmfi.c +--- lib/rpmfi.c 17 Jul 2003 22:44:28 -0000 1.1.1.3 ++++ lib/rpmfi.c 22 Jan 2004 21:42:24 -0000 1.2 +@@ -866,6 +866,7 @@ + *fn = '\0'; + fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn; + ++if (fColors != NULL) + dColors[dirIndexes[i]] |= fColors[i]; + /* + * See if this file path needs relocating. + ++--------------------------------------------------------------------------- +| The "%_excludedocs" macro is intended to set the _default_ if +| both --excludedocs and --includedocs are not specified and it is +| evaluated already before. So, do not override it here again, because +| it would not allow us to make "%_excludedocs 1" the default. ++--------------------------------------------------------------------------- +Index: lib/transaction.c +--- lib/transaction.c 15 Jul 2003 15:15:47 -0000 1.1.1.15 ++++ lib/transaction.c 22 Jan 2004 21:42:26 -0000 1.2 +@@ -702,8 +702,10 @@ + int dc; + int i, j; + ++#if 0 + if (!noDocs) + noDocs = rpmExpandNumeric("%{_excludedocs}"); ++#endif + + { const char *tmpPath = rpmExpand("%{_netsharedpath}", NULL); + /*@-branchstate@*/ + ++--------------------------------------------------------------------------- +| Bugfix: POSIX/SUSv3 clearly expresses that fcntl(2) returns "value +| other than -1" on success, so check for equality to -1 instead of +| non-equality to 0. In practice this does not harm on most platforms, +| because they fortunately (by conincidence and common practice) +| return 0. +| Additionally, at least Solaris may reject (see fcntl(2) manpage) the +| (partial) locking, because DB mmap(2)'ed the file (or vice versa). +| The workaround is to lock the entire(!) file. ++--------------------------------------------------------------------------- +Index: db/mutex/mut_fcntl.c +--- db/mutex/mut_fcntl.c 18 Jan 2003 14:05:03 -0000 1.1.1.5 ++++ db/mutex/mut_fcntl.c 22 Jan 2004 21:42:18 -0000 1.2 +@@ -84,8 +84,13 @@ + + /* Initialize the lock. */ + k_lock.l_whence = SEEK_SET; ++#if 0 + k_lock.l_start = mutexp->off; + k_lock.l_len = 1; ++#else ++ k_lock.l_start = 0; ++ k_lock.l_len = 0; ++#endif + + for (locked = waited = 0;;) { + /* +@@ -101,7 +106,7 @@ + + /* Acquire an exclusive kernel lock. */ + k_lock.l_type = F_WRLCK; +- if (fcntl(dbenv->lockfhp->fd, F_SETLKW, &k_lock)) ++ if (fcntl(dbenv->lockfhp->fd, F_SETLKW, &k_lock) == -1) + return (__os_get_errno()); + + /* If the resource is still available, it's ours. */ +@@ -112,7 +117,7 @@ + + /* Release the kernel lock. */ + k_lock.l_type = F_UNLCK; +- if (fcntl(dbenv->lockfhp->fd, F_SETLK, &k_lock)) ++ if (fcntl(dbenv->lockfhp->fd, F_SETLK, &k_lock) == -1) + return (__os_get_errno()); + + /* + ++--------------------------------------------------------------------------- +| The O_DIRECT feature is fully broken under at least Linux 2.2 and +| 2.4. It is sometimes accepted by open(2) without error and later +| causes a write(2) to fail with EINVAL -- all depending on the +| underlying filesystem (usually works on tmpfs and fails on ext3). +| Sometimes it also causes open(2) to fail with EINVAL. In general, +| it does especially no "graceful degradation" and so is useless for +| use mostly all platforms except for those where we know it works +| (currently FreeBSD only). Interestingly, RPM works on RedHat, just +| because RedHat's "kernel" package contains a patch which masks out +| O_DIRECT usage... ;-) ++--------------------------------------------------------------------------- +Index: db/os/os_open.c +--- db/os/os_open.c 18 Jan 2003 14:05:03 -0000 1.1.1.5 ++++ db/os/os_open.c 22 Jan 2004 21:42:19 -0000 1.2 +@@ -93,7 +93,7 @@ + if (LF_ISSET(DB_OSO_TRUNC)) + oflags |= O_TRUNC; + +-#ifdef HAVE_O_DIRECT ++#if defined(HAVE_O_DIRECT) && defined(__FreeBSD__) + if (LF_ISSET(DB_OSO_DIRECT)) + oflags |= O_DIRECT; + #endif