Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rpm for openSUSE:Factory checked in 
at 2021-04-19 21:05:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rpm (Old)
 and      /work/SRC/openSUSE:Factory/.rpm.new.12324 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rpm"

Mon Apr 19 21:05:35 2021 rev:288 rq:884038 version:4.16.1.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/rpm/python-rpm.changes   2021-01-10 
19:38:09.297426493 +0100
+++ /work/SRC/openSUSE:Factory/.rpm.new.12324/python-rpm.changes        
2021-04-19 21:05:36.315993923 +0200
@@ -1,0 +2,5 @@
+Tue Mar 30 11:15:44 CEST 2021 - [email protected]
+
+- update to rpm-4.16.1.3
+
+-------------------------------------------------------------------
--- /work/SRC/openSUSE:Factory/rpm/rpm.changes  2021-03-11 20:06:55.868142478 
+0100
+++ /work/SRC/openSUSE:Factory/.rpm.new.12324/rpm.changes       2021-04-19 
21:05:36.599994349 +0200
@@ -1,0 +2,28 @@
+Fri Apr  9 13:34:24 CEST 2021 - [email protected]
+
+- change dump_posttrans mechanism to imply --noposttrans so that
+  libzypp can be compatible with older rpm versions
+  changed patch: posttrans.diff
+
+-------------------------------------------------------------------
+Tue Apr  6 08:42:29 UTC 2021 - Andreas Schwab <[email protected]>
+
+- auto-config-update-aarch64-ppc64le.diff: Use timestamp in file instead
+  of searching for arch name, which cannot handle all cases
+
+-------------------------------------------------------------------
+Tue Mar 30 11:15:44 CEST 2021 - [email protected]
+
+- update to rpm-4.16.1.3
+  * security fixes for CVE-2021-3421, CVE-2021-20271, CVE-2021-20266
+  * fix bdb_ro failing to open database with missing secondary indexes
+  * dropped: finddebuginfo-check-res-file.patch
+  * dropped: empty_dbbackend.diff
+- require the exact version of librpmbuild in the rpm-build
+  package [bnc#1180965]
+- reformat dwarf5.diff
+- add dump_posttrans and --runposttrans options to make it possible
+  for libzypp to implement file triggers
+  new patch: posttrans.diff
+
+-------------------------------------------------------------------

Old:
----
  empty_dbbackend.diff
  finddebuginfo-check-res-file.patch
  rpm-4.16.0.tar.bz2

New:
----
  posttrans.diff
  rpm-4.16.1.3.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-rpm.spec ++++++
--- /var/tmp/diff_new_pack.33BS9o/_old  2021-04-19 21:05:38.663997444 +0200
+++ /var/tmp/diff_new_pack.33BS9o/_new  2021-04-19 21:05:38.667997449 +0200
@@ -21,7 +21,7 @@
 %global with_python 1
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-rpm
-Version:        4.16.0
+Version:        4.16.1.3
 Release:        0
 Summary:        Python Bindings for Manipulating RPM Packages
 License:        GPL-2.0-or-later

++++++ rpm.spec ++++++
--- /var/tmp/diff_new_pack.33BS9o/_old  2021-04-19 21:05:38.699997498 +0200
+++ /var/tmp/diff_new_pack.33BS9o/_new  2021-04-19 21:05:38.703997503 +0200
@@ -59,7 +59,7 @@
 Summary:        The RPM Package Manager
 License:        GPL-2.0-or-later
 Group:          System/Packages
-Version:        4.16.0
+Version:        4.16.1.3
 Release:        0
 URL:            https://rpm.org/
 #Git-Clone:     https://github.com/rpm-software-management/rpm
@@ -125,10 +125,9 @@
 Patch117:       findsupplements.diff
 Patch122:       db_conversion.diff
 Patch123:       nextiteratorheaderblob.diff
-Patch127:       finddebuginfo-check-res-file.patch
-Patch128:       empty_dbbackend.diff
 Patch129:       ndbglue.diff
 Patch130:       dwarf5.diff
+Patch131:       posttrans.diff
 Patch6464:      auto-config-update-aarch64-ppc64le.diff
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 #
@@ -171,6 +170,7 @@
 %package build
 Summary:        Tools and Scripts to create rpm packages
 Group:          System/Packages
+Requires:       librpmbuild%{librpmsover} = %{version}
 Requires:       rpm = %{version}
 Provides:       rpm:%_bindir/rpmbuild
 Provides:       rpmbuild
@@ -255,8 +255,7 @@
 %patch                   -P 93 -P 94                         -P 99
 %patch -P 100        -P 102 -P 103
 %patch -P 109                                           -P 117
-%patch -P 122 -P 123 -P 127 -P 128 -P 129
-%patch130 -p1
+%patch -P 122 -P 123 -P 129 -P 130 -P 131
 
 %ifarch aarch64 ppc64le riscv64
 %patch6464

++++++ auto-config-update-aarch64-ppc64le.diff ++++++
--- /var/tmp/diff_new_pack.33BS9o/_old  2021-04-19 21:05:38.743997563 +0200
+++ /var/tmp/diff_new_pack.33BS9o/_new  2021-04-19 21:05:38.743997563 +0200
@@ -1,6 +1,8 @@
---- ./build/parseSpec.c.orig   2019-10-02 12:38:51.836127743 +0000
-+++ ./build/parseSpec.c        2019-10-02 12:52:33.818447657 +0000
-@@ -926,7 +926,22 @@ static rpmSpec parseSpec(const char *spe
+Index: build/parseSpec.c
+===================================================================
+--- build/parseSpec.c.orig
++++ build/parseSpec.c
+@@ -942,7 +942,30 @@ static rpmSpec parseSpec(const char *spe
                                          &(spec->buildrequires));
            break;
        case PART_BUILD:
@@ -12,11 +14,19 @@
 +          }
 +          spec->build = newStringBuf();
 +          appendLineStringBuf(spec->build,
-+              "ref=/usr/lib/rpm; testarch=$(uname -m)\n"
++              "ref=/usr/lib/rpm\n"
++              "mints=0\n"
++              "case $(uname -m) in\n"
++              "    aarch64) mints=20120610;;\n"
++              "    ppc64le) mints=20130610;;\n"
++              "    riscv64) mints=20160911;;\n"
++              "esac\n"
 +              "for s in guess sub; do\n"
 +              "    for c in $(find -maxdepth 8 -name \"config.$s\"); do\n"
 +              "         grep -q config-patches@ $c || continue\n"
-+              "         grep -q \"$testarch[-: ]\" $c || install -m 755 
$ref/config.$s $c\n"
++              "         timestamp=$(sed -n 
\"/^timestamp=/{s///;s/[-'\\\"]//g;p;q;}\" $c)\n"
++              "         test -n \"$timestamp\" || continue\n"
++              "         test $timestamp -ge $mints || install -m 755 
$ref/config.$s $c\n"
 +              "     done\n"
 +              "done\n"
 +          );

++++++ dwarf5.diff ++++++
--- /var/tmp/diff_new_pack.33BS9o/_old  2021-04-19 21:05:38.791997635 +0200
+++ /var/tmp/diff_new_pack.33BS9o/_new  2021-04-19 21:05:38.795997642 +0200
@@ -5,11 +5,9 @@
 86408cd826c32229817071bd008d9856cda4aca5
 0d1003bc723ba30bfe325bb51aeafe7dbfed6a5c
 
-diff --git a/tools/debugedit.c b/tools/debugedit.c
-index 6bea88551..b0849efd8 100644
---- a/tools/debugedit.c
-+++ b/tools/debugedit.c
-@@ -103,6 +103,8 @@ static bool need_string_replacement = false;
+--- ./tools/debugedit.c.orig   2021-03-30 09:34:25.206392109 +0000
++++ ./tools/debugedit.c        2021-03-30 09:34:40.186365656 +0000
+@@ -103,6 +103,8 @@ static bool need_string_replacement = fa
  /* Whether we need to do any updates of the string indexes (DW_FORM_strp)
     in debug_info for string indexes. */
  static bool need_strp_update = false;
@@ -106,7 +104,7 @@
      { NULL, NULL, NULL, 0, 0, 0 }
    };
  
-@@ -542,10 +555,11 @@ setup_relbuf (DSO *dso, debug_section *sec, int *reltype)
+@@ -542,10 +555,11 @@ setup_relbuf (DSO *dso, debug_section *s
        /* Relocations against section symbols are uninteresting in REL.  */
        if (dso->shdr[i].sh_type == SHT_REL && sym.st_value == 0)
        continue;
@@ -152,7 +150,7 @@
  
          t->attr[t->nattr].attr = attr;
          t->attr[t->nattr++].form = form;
-@@ -1022,17 +1053,20 @@ string_find_entry (struct strings *strings, size_t 
old_idx)
+@@ -1022,17 +1053,20 @@ string_find_entry (struct strings *strin
     a replacement file string has been recorded for it, otherwise
     returns false.  */
  static bool
@@ -177,7 +175,7 @@
        const char *file = skip_dir_prefix (old_str, base_dir);
        if (file == NULL)
        {
-@@ -1076,15 +1110,18 @@ record_file_string_entry_idx (struct strings *strings, 
size_t old_idx)
+@@ -1076,15 +1110,18 @@ record_file_string_entry_idx (struct str
     base_dir with dest_dir, just records the existing string associated
     with the index. */
  static void
@@ -200,7 +198,7 @@
        Strent *strent = strtab_add_len (strings->str_tab,
                                       str, strlen (str) + 1);
        if (strent == NULL)
-@@ -1217,13 +1254,28 @@ get_line_table (DSO *dso, size_t off, struct 
line_table **table)
+@@ -1217,13 +1254,28 @@ get_line_table (DSO *dso, size_t off, st
  
    /* version */
    t->version = read_16 (ptr);
@@ -434,7 +432,7 @@
  
    /* dir table: */
    value = 1;
-@@ -1622,6 +1787,296 @@ read_dwarf2_line (DSO *dso, uint32_t off, char 
*comp_dir)
+@@ -1622,6 +1787,296 @@ read_dwarf2_line (DSO *dso, uint32_t off
        read_uleb128 (ptr);
      }
  
@@ -731,7 +729,7 @@
    dso->lines.debug_lines_len += 4 + table->unit_length + table->size_diff;
    return table->replace_dirs || table->replace_files;
  }
-@@ -1639,6 +2094,40 @@ find_new_list_offs (struct debug_lines *lines, size_t 
idx)
+@@ -1639,6 +2094,40 @@ find_new_list_offs (struct debug_lines *
    return table->new_idx;
  }
  
@@ -772,7 +770,7 @@
  /* This scans the attributes of one DIE described by the given abbrev_tag.
     PTR points to the data in the debug_info. It will be advanced till all
     abbrev data is consumed. In phase zero data is collected, in phase one
-@@ -1657,7 +2146,6 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct 
abbrev_tag *t, int phase)
+@@ -1657,7 +2146,6 @@ edit_attributes (DSO *dso, unsigned char
    for (i = 0; i < t->nattr; ++i)
      {
        uint32_t form = t->attr[i].form;
@@ -780,7 +778,7 @@
        while (1)
        {
          /* Whether we already handled a string as file for this
-@@ -1743,38 +2231,24 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct 
abbrev_tag *t, int phase)
+@@ -1743,38 +2231,24 @@ edit_attributes (DSO *dso, unsigned char
                        }
                    }
                }
@@ -833,7 +831,7 @@
              /* DW_AT_name is the primary file for this compile
                 unit. If starting with / it is a full path name.
                 Note that we don't handle DW_FORM_string in this
-@@ -1784,11 +2258,14 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct 
abbrev_tag *t, int phase)
+@@ -1784,11 +2258,14 @@ edit_attributes (DSO *dso, unsigned char
              /* In phase zero we will look for a comp_dir to use.  */
              if (phase == 0)
                {
@@ -852,7 +850,7 @@
                  if (*name == '/' && comp_dir == NULL)
                    {
                      char *enddir = strrchr (name, '/');
-@@ -1809,107 +2286,37 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct 
abbrev_tag *t, int phase)
+@@ -1809,107 +2286,37 @@ edit_attributes (DSO *dso, unsigned char
                 pass (1) stores it (the new index). */
              if (dest_dir && phase == 0)
                {
@@ -931,13 +929,10 @@
 -                do_write_32_relocated (ptr, new_idx);
 -              }
 -            ptr += 4;
-+            edit_strp (dso, false /* line_strp */, ptr, phase, handled_strp);
-             break;
+-            break;
 -          case DW_FORM_string:
 -            ptr = (unsigned char *) strchr ((char *)ptr, '\0') + 1;
-+          case DW_FORM_line_strp:
-+            edit_strp (dso, true /* line_strp */, ptr, phase, handled_strp);
-             break;
+-            break;
 -          case DW_FORM_indirect:
 -            form = read_uleb128 (ptr);
 -            continue;
@@ -947,11 +942,14 @@
 -          case DW_FORM_block2:
 -            len = read_16 (ptr);
 -            form = DW_FORM_block1;
--            break;
++            edit_strp (dso, false /* line_strp */, ptr, phase, handled_strp);
+             break;
 -          case DW_FORM_block4:
 -            len = read_32 (ptr);
 -            form = DW_FORM_block1;
--            break;
++          case DW_FORM_line_strp:
++            edit_strp (dso, true /* line_strp */, ptr, phase, handled_strp);
+             break;
 -          case DW_FORM_block:
 -          case DW_FORM_exprloc:
 -            len = read_uleb128 (ptr);
@@ -978,11 +976,10 @@
          break;
        }
      }
-@@ -1964,6 +2371,163 @@ line_rel_cmp (const void *a, const void *b)
-   return 0;
+@@ -1965,6 +2372,163 @@ line_rel_cmp (const void *a, const void
  }
  
-+static int
+ static int
 +edit_info (DSO *dso, int phase, struct debug_section *sec)
 +{
 +  unsigned char *ptr, *endcu, *endsec;
@@ -1139,9 +1136,10 @@
 +  strings->str_buf = strdata->d_buf;
 +}
 +
- static int
++static int
  edit_dwarf2 (DSO *dso)
  {
+   Elf_Data *data;
 @@ -1995,7 +2559,7 @@ edit_dwarf2 (DSO *dso)
                  struct debug_section *debug_sec = &debug_sections[j];
                  if (debug_sections[j].data)
@@ -1221,7 +1219,18 @@
      }
  
 -  if (debug_sections[DEBUG_INFO].data != NULL)
--    {
++  if (debug_sections[DEBUG_INFO].data == NULL)
++    return 0;
++
++  unsigned char *ptr, *endsec;
++  int phase;
++  bool info_rel_updated = false;
++  bool types_rel_updated = false;
++  bool macro_rel_updated = false;
++  bool line_rel_updated = false;
++
++  for (phase = 0; phase < 2; phase++)
+     {
 -      unsigned char *ptr, *endcu, *endsec;
 -      uint32_t value;
 -      htab_t abbrev;
@@ -1229,8 +1238,13 @@
 -      int phase;
 -      bool info_rel_updated = false;
 -      bool macro_rel_updated = false;
-+  if (debug_sections[DEBUG_INFO].data == NULL)
-+    return 0;
++      /* If we don't need to update anyhing, skip phase 1. */
++      if (phase == 1
++        && !need_strp_update
++        && !need_line_strp_update
++        && !need_string_replacement
++        && !need_stmt_update)
++      break;
  
 -      for (phase = 0; phase < 2; phase++)
 -      {
@@ -1240,12 +1254,9 @@
 -            && !need_string_replacement
 -            && !need_stmt_update)
 -          break;
-+  unsigned char *ptr, *endsec;
-+  int phase;
-+  bool info_rel_updated = false;
-+  bool types_rel_updated = false;
-+  bool macro_rel_updated = false;
-+  bool line_rel_updated = false;
++      rel_updated = false;
++      if (edit_info (dso, phase, &debug_sections[DEBUG_INFO]))
++      return 1;
  
 -        ptr = debug_sections[DEBUG_INFO].data;
 -        setup_relbuf(dso, &debug_sections[DEBUG_INFO], &reltype);
@@ -1259,15 +1270,9 @@
 -                       dso->filename);
 -                return 1;
 -              }
-+  for (phase = 0; phase < 2; phase++)
-+    {
-+      /* If we don't need to update anyhing, skip phase 1. */
-+      if (phase == 1
-+        && !need_strp_update
-+        && !need_line_strp_update
-+        && !need_string_replacement
-+        && !need_stmt_update)
-+      break;
++      /* Remember whether any .debug_info relocations might need
++       to be updated. */
++      info_rel_updated = rel_updated;
  
 -            endcu = ptr + 4;
 -            endcu += read_32 (ptr);
@@ -1277,17 +1282,22 @@
 -                return 1;
 -              }
 +      rel_updated = false;
-+      if (edit_info (dso, phase, &debug_sections[DEBUG_INFO]))
-+      return 1;
++      struct debug_section *types_sec = &debug_sections[DEBUG_TYPES];
++      while (types_sec != NULL)
++      {
++        if (edit_info (dso, phase, types_sec))
++          return 1;
++        types_sec = types_sec->next;
++      }
  
 -            if (endcu > endsec)
 -              {
 -                error (0, 0, "%s: .debug_info too small", dso->filename);
 -                return 1;
 -              }
-+      /* Remember whether any .debug_info relocations might need
++      /* Remember whether any .debug_types relocations might need
 +       to be updated. */
-+      info_rel_updated = rel_updated;
++      types_rel_updated = rel_updated;
  
 -            cu_version = read_16 (ptr);
 -            if (cu_version != 2 && cu_version != 3 && cu_version != 4)
@@ -1296,14 +1306,15 @@
 -                       cu_version);
 -                return 1;
 -              }
-+      rel_updated = false;
-+      struct debug_section *types_sec = &debug_sections[DEBUG_TYPES];
-+      while (types_sec != NULL)
++      /* We might have to recalculate/rewrite the debug_line
++       section.  We need to do that before going into phase one
++       so we have all new offsets.  We do this separately from
++       scanning the dirs/file names because the DW_AT_stmt_lists
++       might not be in order or skip some padding we might have
++       to (re)move. */
++      if (phase == 0 && need_stmt_update)
 +      {
-+        if (edit_info (dso, phase, types_sec))
-+          return 1;
-+        types_sec = types_sec->next;
-+      }
++        edit_dwarf2_line (dso);
  
 -            value = read_32_relocated (ptr);
 -            if (value >= debug_sections[DEBUG_ABBREV].size)
@@ -1315,21 +1326,6 @@
 -                         dso->filename);
 -                return 1;
 -              }
-+      /* Remember whether any .debug_types relocations might need
-+       to be updated. */
-+      types_rel_updated = rel_updated;
-+
-+      /* We might have to recalculate/rewrite the debug_line
-+       section.  We need to do that before going into phase one
-+       so we have all new offsets.  We do this separately from
-+       scanning the dirs/file names because the DW_AT_stmt_lists
-+       might not be in order or skip some padding we might have
-+       to (re)move. */
-+      if (phase == 0 && need_stmt_update)
-+      {
-+        edit_dwarf2_line (dso);
- 
--            if (ptr_size == 0)
 +        /* The line table programs will be moved
 +           forward/backwards a bit in the new data. Update the
 +           debug_line relocations to the new offsets. */
@@ -1345,7 +1341,8 @@
 +            if (rbuf == NULL)
 +              error (1, errno, "%s: Could not allocate line relocations",
 +                     dso->filename);
-+
+ 
+-            if (ptr_size == 0)
 +            /* Sort them by offset into section. */
 +            for (size_t i = 0; i < rels; i++)
                {
@@ -1437,14 +1434,13 @@
 -                if (rbuf == NULL)
 -                  error (1, errno, "%s: Could not allocate line relocations",
 -                         dso->filename);
--
--                /* Sort them by offset into section. */
--                for (size_t i = 0; i < rels; i++)
 +                /* These relocations only happen in ET_REL files
 +                   and are section offsets. */
 +                GElf_Addr r_offset;
 +                size_t ndx = rbuf[i].ndx;
-+
+ 
+-                /* Sort them by offset into section. */
+-                for (size_t i = 0; i < rels; i++)
 +                GElf_Rel rel;
 +                GElf_Rela rela;
 +                if (rtype == SHT_RELA)
@@ -1627,12 +1623,22 @@
 -
 -                        offset_len = (macro_flags & 0x01) ? 8 : 4;
 -                        line_offset = (macro_flags & 0x02) ? 1 : 0;
--
++                    macro_version = read_16 (ptr);
++                    macro_flags = read_8 (ptr);
++                    if (macro_version < 4 || macro_version > 5)
++                      error (1, 0, "unhandled .debug_macro version: %d",
++                             macro_version);
++                    if ((macro_flags & ~2) != 0)
++                      error (1, 0, "unhandled .debug_macro flags: 0x%x",
++                             macro_flags);
+ 
 -                        if (offset_len != 4)
 -                          error (0, 1,
 -                                 "Cannot handle 8 byte macro offsets: %s",
 -                                 dso->filename);
--
++                    offset_len = (macro_flags & 0x01) ? 8 : 4;
++                    line_offset = (macro_flags & 0x02) ? 1 : 0;
+ 
 -                        /* Update the line_offset if it is there.  */
 -                        if (line_offset)
 -                          {
@@ -1648,18 +1654,6 @@
 -                              }
 -                          }
 -                      }
-+                    macro_version = read_16 (ptr);
-+                    macro_flags = read_8 (ptr);
-+                    if (macro_version < 4 || macro_version > 5)
-+                      error (1, 0, "unhandled .debug_macro version: %d",
-+                             macro_version);
-+                    if ((macro_flags & ~2) != 0)
-+                      error (1, 0, "unhandled .debug_macro flags: 0x%x",
-+                             macro_flags);
-+
-+                    offset_len = (macro_flags & 0x01) ? 8 : 4;
-+                    line_offset = (macro_flags & 0x02) ? 1 : 0;
-+
 +                    if (offset_len != 4)
 +                      error (0, 1,
 +                             "Cannot handle 8 byte macro offsets: %s",
@@ -1772,43 +1766,29 @@
 -            Elf_Data *strdata = debug_sections[DEBUG_STR].elf_data;
 -            int strndx = debug_sections[DEBUG_STR].sec;
 -            Elf_Scn *strscn = dso->scn[strndx];
--
++            if (rel_updated)
++              macro_rel_updated = true;
++            macro_sec = macro_sec->next;
++          }
++      }
+ 
 -            /* Out with the old. */
 -            strdata->d_size = 0;
 -            /* In with the new. */
 -            strdata = elf_newdata (strscn);
--
+ 
 -            /* We really should check whether we had enough memory,
 -               but the old ebl version will just abort on out of
 -               memory... */
 -            strtab_finalize (strtab, strdata);
 -            debug_sections[DEBUG_STR].size = strdata->d_size;
 -            dso->strings.str_buf = strdata->d_buf;
-+            if (rel_updated)
-+              macro_rel_updated = true;
-+            macro_sec = macro_sec->next;
-           }
--
-       }
- 
--      /* After phase 1 we might have rewritten the debug_info with
--       new strp, strings and/or linep offsets.  */
--      if (need_strp_update || need_string_replacement || need_stmt_update)
--      dirty_section (DEBUG_INFO);
--      if (need_strp_update || need_stmt_update)
--      dirty_section (DEBUG_MACRO);
--      if (need_stmt_update)
--      dirty_section (DEBUG_LINE);
- 
--      /* Update any relocations addends we might have touched. */
--      if (info_rel_updated)
--      update_rela_data (dso, &debug_sections[DEBUG_INFO]);
+-          }
 +      /* Now handle all the DWARF5 line tables, they contain strp
 +       and/or line_strp entries that need to be registered/rewritten.  */
 +      setup_relbuf(dso, &debug_sections[DEBUG_LINE], &reltype);
 +      rel_updated = false;
  
--      if (macro_rel_updated)
 +      /* edit_dwarf2_line will have set this up, unless there are no
 +       moved/resized (DWARF4) lines. In which case we can just use
 +       the original section data. new_idx will have been setup
@@ -1817,20 +1797,22 @@
 +      if (line_buf == NULL)
 +      line_buf = debug_sections[DEBUG_LINE].data;
 +      for (int ldx = 0; ldx < dso->lines.used; ldx++)
-       {
--        struct debug_section *macro_sec = &debug_sections[DEBUG_MACRO];
--        while (macro_sec != NULL)
--          {
--            update_rela_data (dso, macro_sec);
--            macro_sec = macro_sec->next;
--          }
++      {
 +        struct line_table *t = &dso->lines.table[ldx];
 +        if (t->version >= 5)
 +          read_dwarf5_line (dso, line_buf + t->new_idx, t, phase);
        }
 +      if (rel_updated)
 +      line_rel_updated = true;
-+
+ 
+-      /* After phase 1 we might have rewritten the debug_info with
+-       new strp, strings and/or linep offsets.  */
+-      if (need_strp_update || need_string_replacement || need_stmt_update)
+-      dirty_section (DEBUG_INFO);
+-      if (need_strp_update || need_stmt_update)
+-      dirty_section (DEBUG_MACRO);
+-      if (need_stmt_update)
+-      dirty_section (DEBUG_LINE);
 +      /* Same for the debug_str and debug_line_str sections.
 +       Make sure everything is in place for phase 1 updating of debug_info
 +       references. */
@@ -1840,8 +1822,11 @@
 +      if (phase == 0 && need_line_strp_update)
 +      edit_dwarf2_any_str (dso, &dso->debug_line_str,
 +                           &debug_sections[DEBUG_LINE_STR]);
-     }
++    }
  
+-      /* Update any relocations addends we might have touched. */
+-      if (info_rel_updated)
+-      update_rela_data (dso, &debug_sections[DEBUG_INFO]);
 +  /* After phase 1 we might have rewritten the debug_info with
 +     new strp, strings and/or linep offsets.  */
 +  if (need_strp_update || need_line_strp_update
@@ -1854,7 +1839,8 @@
 +    dirty_section (DEBUG_MACRO);
 +  if (need_stmt_update || need_line_strp_update)
 +    dirty_section (DEBUG_LINE);
-+
+ 
+-      if (macro_rel_updated)
 +  /* Update any relocations addends we might have touched. */
 +  if (info_rel_updated)
 +    update_rela_data (dso, &debug_sections[DEBUG_INFO]);
@@ -1862,12 +1848,18 @@
 +    {
 +      struct debug_section *types_sec = &debug_sections[DEBUG_TYPES];
 +      while (types_sec != NULL)
-+      {
+       {
+-        struct debug_section *macro_sec = &debug_sections[DEBUG_MACRO];
+-        while (macro_sec != NULL)
+-          {
+-            update_rela_data (dso, macro_sec);
+-            macro_sec = macro_sec->next;
+-          }
 +        update_rela_data (dso, types_sec);
 +        types_sec = types_sec->next;
-+      }
-+    }
-+
+       }
+     }
+ 
 +  if (macro_rel_updated)
 +    {
 +      struct debug_section *macro_sec = &debug_sections[DEBUG_MACRO];
@@ -1904,7 +1896,7 @@
        destroy_lines (&dso->lines);
        free (dso);
      }
-@@ -2863,7 +3378,9 @@ main (int argc, char *argv[])
+@@ -2862,7 +3377,9 @@ main (int argc, char *argv[])
       in elfutils before 0.169 we will have to update and write out all
       section data if any data has changed (when ELF_F_LAYOUT was
       set). https://sourceware.org/bugzilla/show_bug.cgi?id=21199 */
@@ -1915,7 +1907,7 @@
  
  #if !_ELFUTILS_PREREQ (0, 169)
    /* string replacements or build_id updates don't change section size. */
-@@ -2935,10 +3452,12 @@ main (int argc, char *argv[])
+@@ -2934,10 +3451,12 @@ main (int argc, char *argv[])
              GElf_Xword sec_size = shdr->sh_size;
  
              /* We might have changed the size (and content) of the
@@ -1929,7 +1921,7 @@
              if (secnum == debug_sections[DEBUG_LINE].sec)
                sec_size = debug_sections[DEBUG_LINE].size;
  
-@@ -3008,7 +3527,8 @@ main (int argc, char *argv[])
+@@ -3007,7 +3526,8 @@ main (int argc, char *argv[])
    chmod (file, stat_buf.st_mode);
  
    free ((char *) dso->filename);
@@ -1939,7 +1931,7 @@
    destroy_lines (&dso->lines);
    free (dso);
  
-@@ -3023,6 +3543,17 @@ main (int argc, char *argv[])
+@@ -3022,6 +3542,17 @@ main (int argc, char *argv[])
        macro_sec = next;
      }
  

++++++ posttrans.diff ++++++
--- ./lib/poptI.c.orig  2021-04-09 11:28:12.359647290 +0000
+++ ./lib/poptI.c       2021-04-09 11:28:15.523640983 +0000
@@ -265,6 +265,10 @@ struct poptOption rpmInstallPoptTable[]
        &rpmIArgs.installInterfaceFlags, (INSTALL_REINSTALL|INSTALL_INSTALL),
        N_("reinstall package(s)"),
        N_("<packagefile>+") },
+ { "runposttrans", '\0', POPT_BIT_SET,
+       &rpmIArgs.installInterfaceFlags, INSTALL_RUNPOSTTRANS,
+       N_("run posttrans scriptlet"),
+       N_("<posttransmanifest>") },
 
    POPT_TABLEEND
 };
--- ./lib/psm.c.orig    2021-04-09 11:28:12.359647290 +0000
+++ ./lib/psm.c 2021-04-09 11:28:15.527640975 +0000
@@ -810,7 +810,7 @@ static rpmRC rpmPackageErase(rpmts ts, r
        }
        if (rc) break;
 
-       if (!(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
+       if (ts->dump_posttrans || !(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
            /* Prepare post transaction uninstall triggers */
            rpmtriggersPrepPostUnTransFileTrigs(psm->ts, psm->te);
        }
--- ./lib/rpmcli.h.orig 2021-04-09 11:28:12.359647290 +0000
+++ ./lib/rpmcli.h      2021-04-09 11:28:15.527640975 +0000
@@ -304,6 +304,7 @@ enum rpmInstallFlags_e {
     INSTALL_ERASE      = (1 << 8),     /*!< from --erase */
     INSTALL_ALLMATCHES = (1 << 9),     /*!< from --allmatches */
     INSTALL_REINSTALL  = (1 << 10),    /*!< from --reinstall */
+    INSTALL_RUNPOSTTRANS = (1 << 11),  /*!< from --runposttrans */
 };
 
 typedef rpmFlags rpmInstallFlags;
@@ -385,6 +386,15 @@ int rpmInstall(rpmts ts, struct rpmInsta
 int rpmErase(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t argv);
 
 /** \ingroup rpmcli
+ * Run posttrans scriptlets
+ * @param ts           transaction set
+ * @param ia           control args/bits
+ * @param argv         array of trigger manifest file names (NULL terminated)
+ * @return             0 on success
+ */
+int rpmRunPostTrans(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t 
argv);
+
+/** \ingroup rpmcli
  */
 extern struct rpmInstallArguments_s rpmIArgs;
 
--- ./lib/rpminstall.c.orig     2021-04-09 11:28:12.363647282 +0000
+++ ./lib/rpminstall.c  2021-04-09 11:28:15.527640975 +0000
@@ -4,6 +4,8 @@
 
 #include "system.h"
 
+#include <errno.h>
+
 #include <rpm/rpmcli.h>
 #include <rpm/rpmtag.h>
 #include <rpm/rpmlib.h>                /* rpmReadPackageFile, vercmp etc */
@@ -772,3 +774,32 @@ int rpmInstallSource(rpmts ts, const cha
     return rc;
 }
 
+int rpmRunPostTrans(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t 
fileArgv)
+{
+    ARGV_t manifest = NULL;
+    FILE *f;
+    char line[BUFSIZ], *s, *p;
+    int rc = 1;
+
+    if (fileArgv == NULL) return 0;
+    if (!fileArgv[0] || fileArgv[1] != NULL) {
+       rpmlog(RPMLOG_ERR, _("runposttrans needs exactly one manifest file\n"));
+       goto exit;
+    }
+    if (!(f = fopen(fileArgv[0], "r"))) {
+       rpmlog(RPMLOG_ERR, _("cannot open %s: %s\n"), fileArgv[0], 
strerror(errno));
+       goto exit;
+    }
+    while ((s = fgets(line, sizeof(line) - 1, f)) != 0) {
+       if (p = strrchr(s, '\n'))
+           *p = 0;
+       argvAdd(&manifest, s);
+    }
+    fclose(f);
+    rpmlog(RPMLOG_DEBUG, "running posttrans scriptlets\n");
+    rpmtsClean(ts);
+    rc = rpmtsRunPostTrans(ts, manifest);
+exit:
+    argvFree(manifest);
+    return rc;
+}
--- ./lib/rpmtriggers.c.orig    2021-04-09 11:28:12.363647282 +0000
+++ ./lib/rpmtriggers.c 2021-04-09 11:31:46.999219563 +0000
@@ -1,5 +1,6 @@
 #include "system.h"
 
+#include <rpm/rpmlog.h>
 #include <rpm/rpmts.h>
 #include <rpm/rpmdb.h>
 #include <rpm/rpmds.h>
@@ -34,7 +35,7 @@ rpmtriggers rpmtriggersFree(rpmtriggers
     return NULL;
 }
 
-static void rpmtriggersAdd(rpmtriggers trigs, unsigned int hdrNum,
+void rpmtriggersAdd(rpmtriggers trigs, unsigned int hdrNum,
                            unsigned int tix, unsigned int priority)
 {
     if (trigs->count == trigs->alloced) {
@@ -177,6 +178,14 @@ int runPostUnTransFileTrigs(rpmts ts)
        if (trigH == NULL)
            continue;
 
+       if (ts->dump_posttrans) {
+           char *trigNEVRA = headerGetAsString(trigH, RPMTAG_NEVRA);
+           rpmlog(RPMLOG_NOTICE, "dump_posttrans: transfiletriggerpostun %u %u 
%s\n", trigs->triggerInfo[i].tix, trigs->triggerInfo[i].hdrNum, trigNEVRA);
+           free(trigNEVRA);
+           headerFree(trigH);
+           continue;
+       }
+
        /* Prepare and run script */
        script = rpmScriptFromTriggerTag(trigH,
                triggertag(RPMSENSE_TRIGGERPOSTUN),
@@ -583,6 +592,16 @@ rpmRC runImmedFileTriggers(rpmts ts, rpm
     rpmTagVal priorityTag;
     rpmtriggers triggers;
 
+    if (sense == RPMSENSE_TRIGGERIN && tm == RPMSCRIPT_TRANSFILETRIGGER && 
ts->dump_posttrans) {
+       unsigned int hdrNum = headerGetInstance(trigH);
+       if (hdrNum) {
+           char *trigNEVRA = headerGetAsString(trigH, RPMTAG_NEVRA);
+           rpmlog(RPMLOG_NOTICE, "dump_posttrans: install %u %s\n", hdrNum, 
trigNEVRA);
+           free(trigNEVRA);
+       }
+       headerFree(trigH);
+       return RPMRC_OK;
+    }
     if (tm == RPMSCRIPT_FILETRIGGER) {
        priorityTag = RPMTAG_FILETRIGGERPRIORITIES;
     } else {
--- ./lib/rpmtriggers.h.orig    2021-04-09 11:28:12.363647282 +0000
+++ ./lib/rpmtriggers.h 2021-04-09 11:28:15.527640975 +0000
@@ -27,6 +27,10 @@ rpmtriggers rpmtriggersCreate(unsigned i
 RPM_GNUC_INTERNAL
 rpmtriggers rpmtriggersFree(rpmtriggers triggers);
 
+RPM_GNUC_INTERNAL
+void rpmtriggersAdd(rpmtriggers trigs, unsigned int hdrNum,
+                       unsigned int tix, unsigned int priority);
+
 /*
  * Prepare post trans uninstall file triggers. After transcation uninstalled
  * files are not saved anywhere. So we need during uninstalation of every
--- ./lib/rpmts.h.orig  2021-04-09 11:28:12.363647282 +0000
+++ ./lib/rpmts.h       2021-04-09 11:28:15.527640975 +0000
@@ -229,6 +229,15 @@ int rpmtsOrder(rpmts ts);
 int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet);
 
 /** \ingroup rpmts
+ * Run all posttrans scriptlets described in the manifest data.
+ *       
+ * @param ts           transaction set
+ * @param manifest     the manifest data
+ * @return             0 on success, -1 on error
+ */
+int rpmtsRunPostTrans(rpmts ts, ARGV_const_t manifest);
+
+/** \ingroup rpmts
  * Reference a transaction set instance.
  * @param ts           transaction set
  * @return             new transaction set reference
--- ./lib/rpmts_internal.h.orig 2021-04-09 11:28:12.363647282 +0000
+++ ./lib/rpmts_internal.h      2021-04-09 11:28:15.527640975 +0000
@@ -87,6 +87,7 @@ struct rpmts_s {
     rpmtriggers trigs2run;   /*!< Transaction file triggers */
 
     int min_writes;             /*!< macro minimize_writes used */
+    int dump_posttrans;                /*!< macro dump_posttrans used */
 };
 
 #ifdef __cplusplus
--- ./lib/transaction.c.orig    2021-04-09 11:28:12.363647282 +0000
+++ ./lib/transaction.c 2021-04-09 11:33:22.247029757 +0000
@@ -1468,6 +1468,8 @@ static int rpmtsSetup(rpmts ts, rpmprobF
     /* Get available space on mounted file systems. */
     (void) rpmtsInitDSI(ts);
 
+    /* Initialize the dump_posttrans flag */
+    ts->dump_posttrans = (rpmExpandNumeric("%{?_dump_posttrans}") > 0);
     return 0;
 }
 
@@ -1846,22 +1848,26 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rp
     /* Actually install and remove packages */
     nfailed = rpmtsProcess(ts);
 
+    if (ts->dump_posttrans) {
+       rpmlog(RPMLOG_NOTICE, "dump_posttrans: enabled\n");
+    }
+
     /* Run %posttrans scripts unless disabled */
-    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS))) {
+    if (!ts->dump_posttrans && !(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS))) {
        rpmlog(RPMLOG_DEBUG, "running post-transaction scripts\n");
        runTransScripts(ts, PKG_POSTTRANS);
     }
 
     /* Run %transfiletriggerpostun scripts unless disabled */
-    if (!(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
+    if (!ts->dump_posttrans && !(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
        runFileTriggers(ts, NULL, RPMSENSE_TRIGGERIN, 
RPMSCRIPT_TRANSFILETRIGGER, 0);
     }
-    if (!(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
+    if (ts->dump_posttrans || !(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
        runPostUnTransFileTrigs(ts);
     }
 
     /* Run %transfiletriggerin scripts unless disabled */
-    if (!(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
+    if (ts->dump_posttrans || !(rpmtsFlags(ts) & 
(RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
        runTransScripts(ts, PKG_TRANSFILETRIGGERIN);
     }
     /* Final exit code */
@@ -1884,3 +1890,110 @@ exit:
     rpmsqSetAction(SIGPIPE, oact);
     return rc;
 }
+
+static unsigned int runPostTransFindPkgNum(const char **lpp)
+{
+    const char *lp = *lpp;
+    unsigned int num = strtoul(lp, 0, 10);
+    while (*lp >= '0' && *lp <= '9')
+       lp++;
+    while (*lp == ' ')
+       lp++;
+    *lpp = lp;
+    return num;
+}
+
+static Header runPostTransFindPkg(rpmts ts, const char *lp)
+{
+    rpmdbMatchIterator mi;
+    Header h = NULL;
+    unsigned int hdrnum = runPostTransFindPkgNum(&lp);
+    if (!*lp)
+       return NULL;
+    if (hdrnum) {
+       mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &hdrnum, sizeof(hdrnum));
+       h = headerLink(rpmdbNextIterator(mi));
+       rpmdbFreeIterator(mi);
+    }
+    if (h) {
+       char *NEVRA = headerGetAsString(h, RPMTAG_NEVRA);
+       if (!NEVRA || strcmp(NEVRA, lp) != 0)
+           h = headerFree(h);
+       _free(NEVRA);
+    }
+    if (!h) {
+       mi = rpmtsInitIterator(ts, RPMDBI_LABEL, lp, strlen(lp));
+       h = headerLink(rpmdbNextIterator(mi));
+       rpmdbFreeIterator(mi);
+    }
+    if (!h)
+       rpmlog(RPMLOG_WARNING, "package %s is not installed\n", lp);
+    return h;
+}
+
+int rpmtsRunPostTrans(rpmts ts, ARGV_const_t manifest)
+{
+    int rc = -1; /* assume failure */
+    /* setup */
+    tsMembers tsmem = rpmtsMembers(ts);
+    rpmtxn txn = NULL;
+    /* Ignore SIGPIPE for the duration of transaction */
+    rpmsqAction_t oact = rpmsqSetAction(SIGPIPE, RPMSQ_IGN);
+    /* Force default 022 umask during transaction for consistent results */
+    mode_t oldmask = umask(022);
+    
+    if (tsmem->orderCount)
+       goto exit;
+    char *line;
+    while ((line = *manifest++) != 0) {
+       if (!strncmp(line, "dump_posttrans: install ", 24)) {
+           const char *lp = line + 24;
+           Header h = runPostTransFindPkg(ts, lp);
+           if (!h)
+               continue;
+           rpmte p = rpmteNew(ts, h, TR_ADDED, line + 45, NULL, RPMTE_INSTALL);
+           if (tsmem->orderCount >= tsmem->orderAlloced) {
+               tsmem->orderAlloced += (tsmem->orderCount - 
tsmem->orderAlloced) + tsmem->delta;
+               tsmem->order = xrealloc(tsmem->order, tsmem->orderAlloced * 
sizeof(*tsmem->order));
+           }
+           tsmem->order[tsmem->orderCount++] = p; 
+
+           if (tsmem->addedPackages == NULL)
+               tsmem->addedPackages = rpmalCreate(ts, 5);
+           rpmalAdd(tsmem->addedPackages, p);
+           packageHashAddEntry(tsmem->installedPackages, headerGetInstance(h), 
p);
+       } else if (!strncmp(line, "dump_posttrans: transfiletriggerpostun ", 
39)) {
+           const char *lp = line + 39;
+           unsigned int tix = runPostTransFindPkgNum(&lp);
+           Header h = runPostTransFindPkg(ts, lp);
+           struct rpmtd_s priorities;
+           if (!h)
+               continue;
+           headerGet(h, RPMTAG_TRANSFILETRIGGERPRIORITIES, &priorities, 
HEADERGET_MINMEM);
+           if (rpmtdSetIndex(&priorities, tix) >= 0)
+               rpmtriggersAdd(ts->trigs2run, headerGetInstance(h), tix, 
*rpmtdGetUint32(&priorities));
+           headerFree(h);
+       }
+    }
+
+    if (!(txn = rpmtxnBegin(ts, RPMTXN_WRITE)))
+       goto exit;
+
+    /* run posttrans scripts */
+    rpmlog(RPMLOG_DEBUG, "running post-transaction scripts\n");
+    runTransScripts(ts, PKG_POSTTRANS);
+    /* run %transfiletriggerin scripts */
+    runFileTriggers(ts, NULL, RPMSENSE_TRIGGERIN, RPMSCRIPT_TRANSFILETRIGGER, 
0);
+    /* run %transfiletriggerpostun scrips */
+    runPostUnTransFileTrigs(ts);
+    /* Run immed %transfiletriggerin scripts */
+    runTransScripts(ts, PKG_TRANSFILETRIGGERIN);
+    rc = 0;
+
+exit:
+    (void) umask(oldmask);
+    rpmtxnEnd(txn);
+    rpmsqSetAction(SIGPIPE, oact);
+    rpmtsEmpty(ts);
+    return rc;
+}
--- ./rpm.c.orig        2021-04-09 11:28:12.363647282 +0000
+++ ./rpm.c     2021-04-09 11:28:15.527640975 +0000
@@ -19,6 +19,7 @@ enum modes {
     MODE_INSTALL       = (1 <<  1),
     MODE_ERASE         = (1 <<  2),
 #define        MODES_IE (MODE_INSTALL | MODE_ERASE)
+    MODE_RUNPOSTTRANS  = (1 <<  4),
 
     MODE_UNKNOWN       = 0
 };
@@ -114,6 +115,11 @@ int main(int argc, char *argv[])
                         INSTALL_INSTALL|INSTALL_REINSTALL));
        int eflags = (ia->installInterfaceFlags & INSTALL_ERASE);
 
+       if (ia->installInterfaceFlags & INSTALL_RUNPOSTTRANS) {
+           if (iflags || eflags)
+               argerror(_("only one major mode may be specified"));
+           bigMode = MODE_RUNPOSTTRANS;
+       }
        if (iflags & eflags)
            argerror(_("only one major mode may be specified"));
        else if (iflags)
@@ -286,6 +292,14 @@ int main(int argc, char *argv[])
        ec = rpmcliVerify(ts, qva, (ARGV_const_t) poptGetArgs(optCon));
     }  break;
 
+    case MODE_RUNPOSTTRANS:
+       if (!poptPeekArg(optCon)) {
+           argerror(_("need posttrans manifest for --runposttrans"));
+       } else {
+           ec += rpmRunPostTrans(ts, ia, (ARGV_const_t) poptGetArgs(optCon));
+       }
+       break;
+
     case MODE_UNKNOWN:
        if (poptPeekArg(optCon) != NULL || argc <= 1) {
            printUsage(optCon, stderr, 0);
++++++ rpm-4.16.0.tar.bz2 -> rpm-4.16.1.3.tar.bz2 ++++++
++++ 54576 lines of diff (skipped)

Reply via email to