RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   12-Apr-2011 00:59:02
  Branch: rpm-5_4                          Handle: 2011041122590001

  Modified files:           (Branch: rpm-5_4)
    rpm                     CHANGES
    rpm/rpmdb               hdrfmt.c

  Log:
    - mongo: wire-up a per-spewage macro expansion, more todo++.
    - mongo: fix: iconv_open("UTF-8", "UTF-8//IGNORE") zero tolerance
        transform for encoding randomness, particularly in ancient %changelog's.
    - mongo: fix: JSON has no escaped single quote or vertical tab.

  Summary:
    Revision    Changes     Path
    1.3501.2.113+4  -0      rpm/CHANGES
    1.151.2.4   +62 -43     rpm/rpmdb/hdrfmt.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3501.2.112 -r1.3501.2.113 CHANGES
  --- rpm/CHANGES       11 Apr 2011 14:33:22 -0000      1.3501.2.112
  +++ rpm/CHANGES       11 Apr 2011 22:59:00 -0000      1.3501.2.113
  @@ -1,4 +1,8 @@
   5.4.0 -> 5.4.1:
  +    - jbj: mongo: wire-up a per-spewage macro expansion, more todo++.
  +    - jbj: mongo: fix: iconv_open("UTF-8", "UTF-8//IGNORE") zero tolerance
  +     transform for encoding randomness, particularly in ancient %changelog's.
  +    - jbj: mongo: fix: JSON has no escaped single quote or vertical tab.
       - devzero2000: add more gpg keys to thkp.c test program
       - jbj: move multiarch* to mandriva.in.
       - jbj: put "devel(libfoo)" deps under RPM_VENDOR_MANDRIVA.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.151.2.3 -r1.151.2.4 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c        7 Apr 2011 22:02:36 -0000       1.151.2.3
  +++ rpm/rpmdb/hdrfmt.c        11 Apr 2011 22:59:01 -0000      1.151.2.4
  @@ -482,12 +482,12 @@
        case '\b':
        case '\t':
        case '\n':
  -     case '\v':
        case '\f':
        case '\r':
  -     case '\"':
  -     case '\'':      len += 1;                       /*@fallthrough@*/
  +     case '"':
  +     case '\\':      len += 1;                       /*@fallthrough@*/
        default:        len += 1;                       /*@switchbreak@*/ break;
  +     /* XXX todo: emit \u1234 here somehow */
        }
       }
       return len;
  @@ -512,12 +512,12 @@
        case '\b':      *te++ = '\\'; *te++ = 'b';      /*@switchbreak@*/ break;
        case '\t':      *te++ = '\\'; *te++ = 't';      /*@switchbreak@*/ break;
        case '\n':      *te++ = '\\'; *te++ = 'n';      /*@switchbreak@*/ break;
  -     case '\v':      *te++ = '\\'; *te++ = 'v';      /*@switchbreak@*/ break;
        case '\f':      *te++ = '\\'; *te++ = 'f';      /*@switchbreak@*/ break;
        case '\r':      *te++ = '\\'; *te++ = 'r';      /*@switchbreak@*/ break;
  -     case '\"':      *te++ = '\\'; *te++ = '"';      /*@switchbreak@*/ break;
  -     case '\'':      *te++ = '\\'; *te++ = '\'';     /*@switchbreak@*/ break;
  +     case '"':       *te++ = '\\'; *te++ = '"';      /*@switchbreak@*/ break;
  +     case '\\':      *te++ = '\\'; *te++ = '\\';     /*@switchbreak@*/ break;
        default:        *te++ = (char) c;               /*@switchbreak@*/ break;
  +     /* XXX todo: emit \u1234 here somehow */
        }
       }
       *te = '\0';
  @@ -858,21 +858,36 @@
   
   /*====================================================================*/
   
  +#if defined(__GLIBC__)       /* XXX todo: find where iconv(3) was 
implemented. */
  +/* XXX using "//TRANSLIT" instead assumes known fromcode? */
  +/*@unchecked@*/
  +static const char * _iconv_tocode = "UTF-8//IGNORE";
  +/*@unchecked@*/
  +static const char * _iconv_fromcode = "UTF-8";
  +#else
  +/*@unchecked@*/
  +static const char * _iconv_tocode = "UTF-8";
  +/*@unchecked@*/
  +static const char * _iconv_fromcode = NULL;
  +#endif
  +
   static /*@only@*/ /*@null@*/ char *
   strdup_locale_convert (/*@null@*/ const char * buffer,
                /*@null@*/ const char * tocode)
        /*@*/
   {
  -    char *dest_str;
  +    char *dest_str = NULL;
   #if defined(HAVE_ICONV)
  -    char *fromcode = NULL;
  +    char *fromcode = _iconv_fromcode;
       iconv_t fd;
  +    int is_error = 0;
  +    int done = 0;
   
       if (buffer == NULL)
  -     return NULL;
  +     goto exit;
   
       if (tocode == NULL)
  -     tocode = "UTF-8";
  +     tocode = _iconv_tocode;
   
   #ifdef HAVE_LANGINFO_H
       fromcode = nl_langinfo (CODESET);
  @@ -884,8 +899,6 @@
        const char *pin = buffer;
        char *pout = NULL;
        size_t ib, ob, dest_size;
  -     int done;
  -     int is_error;
        size_t err;
        const char *shift_pin = NULL;
        int xx;
  @@ -895,7 +908,6 @@
        dest_str = pout = malloc((dest_size + 1) * sizeof(*dest_str));
        if (dest_str)
            *dest_str = '\0';
  -     done = is_error = 0;
        if (pout != NULL)
        while (done == 0 && is_error == 0) {
            err = iconv(fd, (char **)&pin, &ib, &pout, &ob);
  @@ -944,6 +956,7 @@
        dest_str = xstrdup((buffer ? buffer : ""));
       }
   
  +exit:
       return dest_str;
   }
   
  @@ -1031,20 +1044,12 @@
   assert(he->t == RPM_STRING_TYPE || he->t == RPM_UINT64_TYPE || he->t == 
RPM_BIN_TYPE);
       switch (he->t) {
       case RPM_STRING_ARRAY_TYPE:      /* XXX currently never happens */
  -     s = he->p.argv[ix];
  -     xtag = "string";
  -     /* XXX Force utf8 strings. */
  -     s = xstrdup(s);
  -     s = xstrtolocale(s);
  -     freeit = 1;
  -     break;
       case RPM_I18NSTRING_TYPE:        /* XXX currently never happens */
  +assert(0);
       case RPM_STRING_TYPE:
  -     s = he->p.str;
        xtag = "string";
        /* XXX Force utf8 strings. */
  -     s = xstrdup(s);
  -     s = xstrtolocale(s);
  +     s = strdup_locale_convert(he->p.str, (av ? av[0] : NULL));
        freeit = 1;
        break;
       case RPM_BIN_TYPE:
  @@ -1191,8 +1196,7 @@
        }
   
        /* XXX Force utf8 strings. */
  -     s = xstrdup(he->p.str);
  -     s = xstrtolocale(s);
  +     s = strdup_locale_convert(he->p.str, (av ? av[0] : NULL));
        freeit = 1;
        break;
       case RPM_BIN_TYPE:
  @@ -1301,11 +1305,10 @@
       switch (he->t) {
       case RPM_STRING_ARRAY_TYPE:      /* XXX currently never happens */
       case RPM_I18NSTRING_TYPE:        /* XXX currently never happens */
  +assert(0);
       case RPM_STRING_TYPE:
  -     s = (he->t == RPM_STRING_ARRAY_TYPE ? he->p.argv[ix] : he->p.str);
        /* XXX Force utf8 strings. */
  -     s = xstrdup(he->p.str);
  -     s = xstrtolocale(s);
  +     s = strdup_locale_convert(he->p.str, (av ? av[0] : NULL));
        freeit = 1;
        break;
       case RPM_BIN_TYPE:
  @@ -1346,7 +1349,7 @@
        s = t;
        c = '\0';
       } else
  -     c = '\'';
  +     c = '"';
   
       nb = spew->spew_strlen(s, lvl);
       if (c != '\0')
  @@ -3518,6 +3521,7 @@
        /*@globals internalState @*/
        /*@modifies he, internalState @*/
   {
  +    static char q = '"';
       rpmTag tag = he->tag;
       rpmTagData N = { .ptr = NULL };
       rpmTagData EVR = { .ptr = NULL };
  @@ -3603,9 +3607,8 @@
   /*@=nullstate@*/
        he->p.argv[ac++] = te;
        te = stpcpy(te, instance);
  -     te = stpcpy(te, ", '");
  -     te = stpcpy(te, N.argv[i]);
  -     te = stpcpy(te, "'");
  +     *te++ = ',';    *te++ = ' ';
  +     *te++ = q;      te = stpcpy(te, N.argv[i]);     *te++ = q;
   /*@-readonlytrans@*/
        if (EVR.argv != NULL && EVR.argv[i] != NULL && *EVR.argv[i] != '\0') {
            static const char *Fstr[] = { 
"?0","LT","GT","?3","EQ","LE","GE","?7" };
  @@ -3619,16 +3622,28 @@
            const char * D = Revr->F[RPMEVR_D];
   #endif
            xx = xx;
  -         te = stpcpy( stpcpy( stpcpy(te, ", '"), Fstr[Fx]), "'");
  -         te = stpcpy( stpcpy( stpcpy(te, ", '"), E), "'");
  -         te = stpcpy( stpcpy( stpcpy(te, ", '"), V), "'");
  -         te = stpcpy( stpcpy( stpcpy(te, ", '"), R), "'");
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;  te = stpcpy(te, Fstr[Fx]);      *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;  te = stpcpy(te, E);     *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;  te = stpcpy(te, V);     *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;  te = stpcpy(te, R);     *te++ = q;
   #ifdef       NOTYET  /* XXX turning this on breaks rpmrepo */
  -         te = stpcpy( stpcpy( stpcpy(te, ", '"), D), "'");
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;  te = stpcpy(te, D);     *te++ = q;
   #endif
            Revr = rpmEVRfree(Revr);
        } else {
  -         te = stpcpy(te, ", '', '', '', ''");
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;          *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;          *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;          *te++ = q;
  +         *te++ = ',';        *te++ = ' ';
  +         *te++ = q;          *te++ = q;
        }
   /*@=readonlytrans@*/
   #ifdef       NOTNOW
  @@ -6657,7 +6672,7 @@
       sprintfToken nextfmt;
       sprintfTag tag;
       char * t, * te;
  -    int need;
  +    size_t need;
   spew_t spew = NULL;
   
   /*@-modfilesys@*/
  @@ -6709,10 +6724,12 @@
        spew = &_json_spew;
   
       if (spew && spew->spew_init && spew->spew_init[0]) {
  -     need = strlen(spew->spew_init);
  +     char * spew_init = rpmExpand(spew->spew_init, NULL);
  +     need = strlen(spew_init);
        t = hsaReserve(hsa, need);
  -     te = stpcpy(t, spew->spew_init);
  +     te = stpcpy(t, spew_init);
        hsa->vallen += (te - t);
  +     spew_init = _free(spew_init);
       }
   
       hsa = hsaInit(hsa);
  @@ -6728,10 +6745,12 @@
       hsa = hsaFini(hsa);
   
       if (spew && spew->spew_fini && spew->spew_fini[0]) {
  -     need = strlen(spew->spew_fini);
  +     char * spew_fini = rpmExpand(spew->spew_fini, NULL);
  +     need = strlen(spew_fini);
        t = hsaReserve(hsa, need);
  -     te = stpcpy(t, spew->spew_fini);
  +     te = stpcpy(t, spew_fini);
        hsa->vallen += (te - t);
  +     spew_fini = _free(spew_fini);
       }
   
       if (hsa->val != NULL && hsa->vallen < hsa->alloced)
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to