Poifect! ;-)
(hysterical aside)
The design flaw is with
expandMacros(spec, spec->macros, spec->lbuf, spec->lbuf_len))
which use the 3rd argument for both input and output.
There are like 3 (checking, yes 3) places that expandMacros() is still
used, all within rpmbuild code paths. Replacing with rpmExpand()
fixes almost all the problems.
And the hysterical design reason for using a static buffer argument
as both
input and output was that libc5 (in like RHL 4.2 circa 1997) was
"buggy".
If you don't see the humor in the above, go read lib/rpmal.c code,
which has exactly the same hysterical raison d'etre.
Sad that OSS code can never be rewritten and improved without
political consensus. Old code has a painful lingering twilight
existence before dying ...
73 de Jeff
On Dec 27, 2007, at 9:16 AM, Ralf S. Engelschall wrote:
> RPM Package Manager, CVS Repository
> http://rpm5.org/cvs/
>
> ______________________________________________________________________
> ______
>
> Server: rpm5.org Name: Ralf S. Engelschall
> Root: /v/rpm/cvs Email: rse@rpm5.org
> Module: rpm Date: 27-Dec-2007
> 15:16:12
> Branch: HEAD Handle: 2007122714161100
>
> Modified files:
> rpm CHANGES macros.in
> rpm/build parseSpec.c rpmspec.h spec.c
>
> Log:
> make size of line buffer for .spec file parsing run-time
> configurable
> via macro _spec_line_buffer_size
>
> Summary:
> Revision Changes Path
> 1.2022 +1 -0 rpm/CHANGES
> 2.130 +1 -1 rpm/build/parseSpec.c
> 2.70 +2 -1 rpm/build/rpmspec.h
> 2.174 +4 -1 rpm/build/spec.c
> 1.221 +5 -1 rpm/macros.in
>
> ______________________________________________________________________
> ______
>
> patch -p0 <<'@@ .'
> Index: rpm/CHANGES
>
> ======================================================================
> ======
> $ cvs diff -u -r1.2021 -r1.2022 CHANGES
> --- rpm/CHANGES 27 Dec 2007 09:19:57 -0000 1.2021
> +++ rpm/CHANGES 27 Dec 2007 14:16:11 -0000 1.2022
> @@ -1,4 +1,5 @@
> 5.0b3 -> 5.0b4:
> + - rse: make size of line buffer for .spec file parsing run-
> time configurable via macro _spec_line_buffer_size
> - rse: improve %patch macro implementation: less expansion
> redundancy and macro namespace collision avoidance
> - rse: fix %{uncompress:<file>.lzo} by passing the required
> "-dc" options to LZOP's lzop(1)
> - rse: fix %{uncompress:<file>.lzma} by passing the required
> "-dc" options to LZMA Utils' lzma(1)
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/build/parseSpec.c
>
> ======================================================================
> ======
> $ cvs diff -u -r2.129 -r2.130 parseSpec.c
> --- rpm/build/parseSpec.c 20 Dec 2007 23:35:28 -0000 2.129
> +++ rpm/build/parseSpec.c 27 Dec 2007 14:16:11 -0000 2.130
> @@ -231,7 +231,7 @@
>
> /* Don't expand macros (eg. %define) in false branch of %if
> clause */
> if (spec->readStack->reading &&
> - expandMacros(spec, spec->macros, spec->lbuf, sizeof(spec-
> >lbuf))) {
> + expandMacros(spec, spec->macros, spec->lbuf, spec-
> >lbuf_len)) {
> rpmlog(RPMLOG_ERR, _("line %d: %s\n"),
> spec->lineNum, spec->lbuf);
> return RPMRC_FAIL;
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/build/rpmspec.h
>
> ======================================================================
> ======
> $ cvs diff -u -r2.69 -r2.70 rpmspec.h
> --- rpm/build/rpmspec.h 18 Dec 2007 19:40:52 -0000 2.69
> +++ rpm/build/rpmspec.h 27 Dec 2007 14:16:11 -0000 2.70
> @@ -117,7 +117,8 @@
>
> /*@owned@*/
> struct OpenFileInfo * fileStack;
> - char lbuf[10*BUFSIZ];
> + char *lbuf;
> + size_t lbuf_len;
> /*@dependent@*/
> char *lbufPtr;
> char nextpeekc;
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/build/spec.c
>
> ======================================================================
> ======
> $ cvs diff -u -r2.173 -r2.174 spec.c
> --- rpm/build/spec.c 18 Dec 2007 19:40:52 -0000 2.173
> +++ rpm/build/spec.c 27 Dec 2007 14:16:11 -0000 2.174
> @@ -472,7 +472,8 @@
> spec->st = newSt();
>
> spec->fileStack = NULL;
> - spec->lbuf[0] = '\0';
> + spec->lbuf_len = (size_t)rpmExpandNumeric("%{?
> _spec_line_buffer_size}%{!?_spec_line_buffer_size:10000}");
> + spec->lbuf = (char *)xcalloc(1, spec->lbuf_len);
> spec->line = spec->lbuf;
> spec->nextline = NULL;
> spec->nextpeekc = '\0';
> @@ -527,6 +528,8 @@
>
> if (spec == NULL) return NULL;
>
> + spec->lbuf = _free(spec->lbuf);
> +
> spec->sl = freeSl(spec->sl);
> spec->st = freeSt(spec->st);
>
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/macros.in
>
> ======================================================================
> ======
> $ cvs diff -u -r1.220 -r1.221 macros.in
> --- rpm/macros.in 27 Dec 2007 09:19:57 -0000 1.220
> +++ rpm/macros.in 27 Dec 2007 14:16:11 -0000 1.221
> @@ -1,7 +1,7 @@
> #/*! \page config_macros Default configuration: @USRLIBRPM@/macros
> # \verbatim
> #
> -# $Id: macros.in,v 1.220 2007/12/27 09:19:57 rse Exp $
> +# $Id: macros.in,v 1.221 2007/12/27 14:16:11 rse Exp $
> #
> # This is a global RPM configuration file. All changes made here
> will
> # be lost when the rpm package is upgraded. Any per-system
> configuration
> @@ -530,6 +530,10 @@
> # Colon separated list of permitted arbitrary tag names
> %_arbitrary_tags Class:Track:Trackprog:Foo:Bar:Baz
>
> +#
> +# Byte size of line buffer for .spec file parsing
> +%_spec_line_buffer_size 10000
> +
>
> #=====================================================================
> =========
> # ---- Database configuration macros.
> # Macros used to configure Berkley db parameters.
> @@ .
> ______________________________________________________________________
> RPM Package Manager http://rpm5.org
> CVS Sources Repository rpm-cvs@rpm5.org
Received on Thu Dec 27 15:27:11 2007