--- /dev/null
+Avoid SIGFPE on semi-ELF files, like guile cache (*.go).
+--- rpm-5.4.17/rpmdb/legacy.c.orig 2019-02-14 18:13:07.961620012 +0100
++++ rpm-5.4.17/rpmdb/legacy.c 2019-02-14 19:54:24.235368679 +0100
+@@ -116,7 +116,7 @@
+ if (shdr.sh_type != SHT_DYNAMIC)
+ continue;
+ while (!bingo && (data = elf_getdata (scn, data)) != NULL) {
+- unsigned maxndx = (unsigned) (data->d_size / shdr.sh_entsize);
++ unsigned maxndx = (shdr.sh_entsize == 0) ? 0 : (unsigned) (data->d_size / shdr.sh_entsize);
+ unsigned ndx;
+
+ for (ndx = 0; ndx < maxndx; ++ndx) {
+--- rpm-5.4.17/lib/rpmds.c.orig 2019-02-14 21:51:17.514041154 +0100
++++ rpm-5.4.17/lib/rpmds.c 2019-02-14 21:51:20.570691261 +0100
+@@ -2933,6 +2933,11 @@
+ * @param isX32 is this an X32 symbol?
+ */
+ #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__)
++static int getShdrEntries(GElf_Shdr *shdr)
++{
++ return shdr->sh_entsize == 0 ? 0 : ((int)(shdr->sh_size / shdr->sh_entsize));
++}
++
+ static char * sonameDep(/*@returned@*/ char * t, const char * s, int isElf64, int isX32)
+ /*@modifies t @*/
+ {
+@@ -3195,7 +3200,7 @@
+ case SHT_DYNAMIC:
+ data = NULL;
+ while ((data = elf_getdata (scn, data)) != NULL) {
+- for (cnt = 0; cnt < (int)(shdr->sh_size / shdr->sh_entsize); ++cnt) {
++ for (cnt = 0; cnt < getShdrEntries(shdr); ++cnt) {
+ dyn = gelf_getdyn (data, cnt, &dyn_mem);
+ if (dyn == NULL)
+ /*@innerbreak@*/ break;
+@@ -3436,7 +3441,7 @@
+ case SHT_DYNAMIC:
+ data = NULL;
+ while ((data = elf_getdata (scn, data)) != NULL) {
+- for (cnt = 0; cnt < (int)(shdr->sh_size / shdr->sh_entsize); ++cnt) {
++ for (cnt = 0; cnt < getShdrEntries(shdr); ++cnt) {
+ dyn = gelf_getdyn (data, cnt, &dyn_mem);
+ if (dyn == NULL)
+ /*@innerbreak@*/ break;
Summary(uk.UTF-8): Менеджер пакетів від RPM
Name: rpm
Version: 5.4.17
-Release: 0.14
+Release: 0.15
License: LGPL v2.1
Group: Base
# http://rpm5.org/files/rpm/rpm-5.4/rpm-5.4.17-0.20160512.src.rpm
Patch77: %{name}-lua-expat.patch
Patch78: %{name}-double_check_unpackaged_subdirs.patch
Patch79: %{name}-rpmspec.patch
-
+Patch80: %{name}-elf-entsize.patch
Patch81: %{name}-perl-magic.patch
Patch82: %{name}-5.4.15-use-DSA-sig.patch
Patch83: %{name}-ignore-missing-macro-files.patch
%patch77 -p1
%patch78 -p1
%patch79 -p1
-
%patch81 -p0
%patch82 -p1
%patch84 -p1
%patch89 -p1
%patch90 -p1
%patch91 -p1
+%patch80 -p1
%patch1000 -p1
%patch1001 -p1
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <db.h>
enum { NOTSET, FILEID_RESET, LSN_RESET, STANDARD_LOAD } mode;
extern char *optarg;
extern int optind;
- DBTYPE dbtype;
DB_ENV *dbenv;
LDG ldg;
- u_int ldf;
int ch, exitval, ret;
if ((exitval = version_check()) != 0)
ldg.passwd = NULL;
mode = NOTSET;
- ldf = 0;
exitval = 0;
- dbtype = DB_UNKNOWN;
/*
* There are two modes for db_load: -r and everything else. The -r
case LSN_RESET:
exitval = dbenv->lsn_reset(dbenv, argv[0], 0);
break;
- case NOTSET:
+ default:
break;
}