RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmio/ macro.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Sun 22 Jul 2007 - 04:23:21 CEST
Message-Id: <20070722022321.AC6FB3484F4@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   22-Jul-2007 04:23:21
  Branch: HEAD                             Handle: 2007072203232100

  Modified files:
    rpm                     CHANGES
    rpm/rpmio               macro.c

  Log:
    - reapply 2.127 with more careful rpmExpand() fix.
    - scale _macro_BUFSIZE as 2 * BUFSIZ (16384) everywhere but rpmExpand()
    - use _macro_BUFSIZ, not compiled in BUFSIZ, to size expansion targets.
    - enable %{dirname:...} macro primitive.

  Summary:
    Revision    Changes     Path
    1.1509      +4  -0      rpm/CHANGES
    2.135       +50 -35     rpm/rpmio/macro.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1508 -r1.1509 CHANGES
  --- rpm/CHANGES	22 Jul 2007 00:59:07 -0000	1.1508
  +++ rpm/CHANGES	22 Jul 2007 02:23:21 -0000	1.1509
  @@ -1,4 +1,8 @@
   4.5 -> 5.0:
  +    - jbj: reapply 2.127 with more careful rpmExpand() fix.
  +    - jbj: scale _macro_BUFSIZE as 2 * BUFSIZ (16384) everywhere but rpmExpand()
  +    - jbj: use _macro_BUFSIZ, not compiled in BUFSIZ, to size expansion targets.
  +    - jbj: enable %{dirname:...} macro primitive.
       - nanardon: add the librpmconstant library which provides RPM API constants (usually to language bindings)
       - jbj: rescuscitate rpm-perl, include <rpmio.h> explicitly.
       - jbj: perl.prov fiddles (#249135).
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/macro.c
  ============================================================================
  $ cvs diff -u -r2.134 -r2.135 macro.c
  --- rpm/rpmio/macro.c	22 Jul 2007 01:54:12 -0000	2.134
  +++ rpm/rpmio/macro.c	22 Jul 2007 02:23:21 -0000	2.135
  @@ -132,6 +132,9 @@
   
   #define	MACRO_CHUNK_SIZE	16
   
  +/* Size of expansion buffers. */
  +static size_t _macro_BUFSIZ = 2 * BUFSIZ;
  +
   /* forward ref */
   static int expandMacro(MacroBuf mb)
   	/*@globals rpmGlobalMacroContext,
  @@ -602,18 +605,19 @@
   	/*@globals rpmGlobalMacroContext, h_errno, fileSystem @*/
   	/*@modifies mb, rpmGlobalMacroContext, fileSystem @*/
   {
  -    char pcmd[BUFSIZ];
  +    size_t bufn = _macro_BUFSIZ;
  +    char * buf = alloca(bufn);
       FILE *shf;
       int rc;
       int c;
   
  -    strncpy(pcmd, cmd, clen);
  -    pcmd[clen] = '\0';
  -    rc = expandU(mb, pcmd, sizeof(pcmd));
  +    strncpy(buf, cmd, clen);
  +    buf[clen] = '\0';
  +    rc = expandU(mb, buf, bufn);
       if (rc)
   	return rc;
   
  -    if ((shf = popen(pcmd, "r")) == NULL)
  +    if ((shf = popen(buf, "r")) == NULL)
   	return 1;
       while(mb->nb > 0 && (c = fgetc(shf)) != EOF)
   	SAVECHAR(mb, c);
  @@ -642,7 +646,9 @@
   	/*@modifies mb, rpmGlobalMacroContext @*/
   {
       const char *s = se;
  -    char buf[BUFSIZ], *n = buf, *ne;
  +    size_t bufn = _macro_BUFSIZ;
  +    char *buf = alloca(bufn);
  +    char *n = buf, *ne;
       char *o = NULL, *oe;
       char *b, *be;
       int c;
  @@ -752,7 +758,7 @@
       }
   
   /*@-modfilesys@*/
  -    if (expandbody && expandU(mb, b, (&buf[sizeof(buf)] - b))) {
  +    if (expandbody && expandU(mb, b, (&buf[bufn] - b))) {
   	rpmError(RPMERR_BADSPEC, _("Macro %%%s failed to expand\n"), n);
   	return se;
       }
  @@ -779,7 +785,8 @@
   	/*@modifies mc, rpmGlobalMacroContext @*/
   {
       const char *s = se;
  -    char buf[BUFSIZ], *n = buf, *ne = n;
  +    char *buf = alloca(_macro_BUFSIZ);
  +    char *n = buf, *ne = n;
       int c;
   
       COPYNAME(ne, s, c);
  @@ -946,7 +953,9 @@
   	/*@globals rpmGlobalMacroContext @*/
   	/*@modifies mb, rpmGlobalMacroContext @*/
   {
  -    char buf[BUFSIZ], *b, *be;
  +    size_t bufn = _macro_BUFSIZ;
  +    char *buf = alloca(bufn);
  +    char *b, *be;
       char aname[16];
       const char *opts, *o;
       int argc = 0;
  @@ -996,7 +1005,7 @@
   
   #ifdef NOTYET
       /* XXX if macros can be passed as args ... */
  -    expandU(mb, buf, sizeof(buf));
  +    expandU(mb, buf, bufn);
   #endif
   
       /* Build argv array */
  @@ -1099,11 +1108,12 @@
   	/*@globals rpmGlobalMacroContext, h_errno, fileSystem @*/
   	/*@modifies mb, rpmGlobalMacroContext, fileSystem @*/
   {
  -    char buf[BUFSIZ];
  +    size_t bufn = _macro_BUFSIZ + msglen;
  +    char *buf = alloca(bufn);
   
       strncpy(buf, msg, msglen);
       buf[msglen] = '\0';
  -    (void) expandU(mb, buf, sizeof(buf));
  +    (void) expandU(mb, buf, bufn);
       if (waserror)
   	rpmError(RPMERR_BADSPEC, "%s\n", buf);
       else
  @@ -1125,18 +1135,22 @@
   	/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
   	/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    char buf[BUFSIZ], *b = NULL, *be;
  +     size_t bufn = _macro_BUFSIZ + fn + gn;
  +     char * buf = alloca(bufn);
  +     char *b = NULL, *be;
       int c;
   
       buf[0] = '\0';
       if (g != NULL) {
   	strncpy(buf, g, gn);
   	buf[gn] = '\0';
  -	(void) expandU(mb, buf, sizeof(buf));
  +	(void) expandU(mb, buf, bufn);
       }
   #ifdef	NOTYET
       if (fn > 5 && STREQ("patch", f, 5) && xisdigit(f[5])) {
  -	for ( c = 5 ; c < fn-1 && f[c] == '0' && xisdigit(f[c+1]) ; c++ ) ; /* Skip leading zeros */
  +	/* Skip leading zeros */
  +	for (c = 5; c < fn-1 && f[c] == '0' && xisdigit(f[c+1]);)
  +	    c++;
   	b = buf;
   	be = stpncpy( stpcpy(b, "%patch -P "), f+c, fn-c);
   	*be = '\0';
  @@ -1147,13 +1161,10 @@
   	    b = buf;
   	else
   	    b++;
  -#if NOTYET
  -    /* XXX watchout for conflict with %dir */
       } else if (STREQ("dirname", f, fn)) {
   	if ((b = strrchr(buf, '/')) != NULL)
   	    *b = '\0';
   	b = buf;
  -#endif
       } else if (STREQ("suffix", f, fn)) {
   	if ((b = strrchr(buf, '.')) != NULL)
   	    b++;
  @@ -1495,6 +1506,7 @@
   
   	/* XXX necessary but clunky */
   	if (STREQ("basename", f, fn) ||
  +	    STREQ("dirname", f, fn) ||
   	    STREQ("suffix", f, fn) ||
   	    STREQ("expand", f, fn) ||
   	    STREQ("verbose", f, fn) ||
  @@ -2012,7 +2024,8 @@
   rpmLoadMacroFile(MacroContext mc, const char * fn)
   {
       FD_t fd = Fopen(fn, "r.fpio");
  -    char buf[BUFSIZ];
  +    size_t bufn = _macro_BUFSIZ;
  +    char *buf = alloca(bufn);
       int rc = -1;
   
       if (fd == NULL || Ferror(fd)) {
  @@ -2022,11 +2035,11 @@
   
       /* XXX Assume new fangled macro expansion */
       /*@-mods@*/
  -    max_macro_depth = 16;
  +    max_macro_depth = _MAX_MACRO_DEPTH;
       /*@=mods@*/
   
       buf[0] = '\0';
  -    while(rdcl(buf, sizeof(buf), fd) != NULL) {
  +    while(rdcl(buf, bufn, fd) != NULL) {
   	char c, *n;
   
   	n = buf;
  @@ -2206,14 +2219,14 @@
       const char *s;
       char *t, *te;
       size_t sn, tn;
  -    size_t un = 16 * BUFSIZ;
  +    size_t bufn = 8 * _macro_BUFSIZ;
   
       va_list ap;
   
       if (arg == NULL)
   	return xstrdup("");
   
  -    t = xmalloc(strlen(arg) + un + 1);
  +    t = xmalloc(bufn + strlen(arg) + 1);
       *t = '\0';
       te = stpcpy(t, arg);
   
  @@ -2222,7 +2235,7 @@
       while ((s = va_arg(ap, const char *)) != NULL) {
   	sn = strlen(s);
   	tn = (te - t);
  -	t = xrealloc(t, tn + sn + un + 1);
  +	t = xrealloc(t, tn + sn + bufn + 1);
   	te = t + tn;
   	te = stpcpy(te, s);
       }
  @@ -2231,8 +2244,8 @@
   
       *te = '\0';
       tn = (te - t);
  -    (void) expandMacros(NULL, NULL, t, tn + un + 1);
  -    t[tn + un] = '\0';
  +    (void) expandMacros(NULL, NULL, t, tn + bufn + 1);
  +    t[tn + bufn] = '\0';
       t = xrealloc(t, strlen(t) + 1);
       
       return t;
  @@ -2360,7 +2373,8 @@
   const char *
   rpmGetPath(const char *path, ...)
   {
  -    char buf[BUFSIZ];
  +    size_t bufn = _macro_BUFSIZ;
  +    char *buf = alloca(bufn);
       const char * s;
       char * t, * te;
       va_list ap;
  @@ -2380,7 +2394,7 @@
       }
       va_end(ap);
   /*@-modfilesys@*/
  -    (void) expandMacros(NULL, NULL, buf, sizeof(buf));
  +    (void) expandMacros(NULL, NULL, buf, bufn);
   /*@=modfilesys@*/
   
       (void) rpmCleanPath(buf);
  @@ -2510,25 +2524,26 @@
   int
   main(int argc, char *argv[])
   {
  -    char buf[BUFSIZ];
  +    size_t bufn = _macro_BUFSIZ;
  +    char *buf = alloca(bufn);
       FILE *fp;
       int x;
   
       rpmInitMacros(NULL, rpmMacrofiles);
   
       if ((fp = fopen(testfile, "r")) != NULL) {
  -	while(rdcl(buf, sizeof(buf), fp)) {
  -	    x = expandMacros(NULL, NULL, buf, sizeof(buf));
  +	while(rdcl(buf, bufn, fp)) {
  +	    x = expandMacros(NULL, NULL, buf, bufn);
   	    fprintf(stderr, "%d->%s\n", x, buf);
  -	    memset(buf, 0, sizeof(buf));
  +	    memset(buf, 0, bufn);
   	}
   	fclose(fp);
       }
   
  -    while(rdcl(buf, sizeof(buf), stdin)) {
  -	x = expandMacros(NULL, NULL, buf, sizeof(buf));
  +    while(rdcl(buf, bufn, stdin)) {
  +	x = expandMacros(NULL, NULL, buf, bufn);
   	fprintf(stderr, "%d->%s\n <-\n", x, buf);
  -	memset(buf, 0, sizeof(buf));
  +	memset(buf, 0, bufn);
       }
       rpmFreeMacros(NULL);
   
  @@ .
Received on Sun Jul 22 04:23:21 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.