- fix: handle elf64 note sections correctly.

CVS patchset: 7171
CVS date: 2004/03/13 13:34:44
This commit is contained in:
jbj 2004-03-13 13:34:44 +00:00
parent dde3339464
commit d440039375
3 changed files with 38 additions and 33 deletions

View File

@ -31,7 +31,9 @@
- add sparcv8 and enable elf32/elf64 Zon sparc64 (#117302).
- fix: --querybynumber looped.
- fix: ENOTSUP filter from lsetfilecon borkage.
- fix: increase file context regex parse buffer to BUFSIZ.
- fix: handle elf64 note sections correctly.
4.2.1 -> 4.2.2:
- unify signal handling in librpmio, use condvar to deliver signal.
- make peace with libtool-1.5, autoconf-2.59, automake-1.8.

View File

@ -103,9 +103,6 @@ getu64(const fmagic fm, uint64_t value)
#define ph_align (fm->cls == ELFCLASS32 \
? (ph32.p_align ? getu32(fm, ph32.p_align) : 4) \
: (ph64.p_align ? getu64(fm, ph64.p_align) : 4))
#define nh_size (fm->cls == ELFCLASS32 \
? sizeof *nh32 \
: sizeof *nh64)
#define nh_type (fm->cls == ELFCLASS32 \
? getu32(fm, nh32->n_type) \
: getu32(fm, nh64->n_type))
@ -171,7 +168,10 @@ dophn_exec(fmagic fm, off_t off, int num, size_t size)
char *shared_libraries = "";
char nbuf[BUFSIZ];
int bufsize;
size_t offset, nameoffset;
size_t offset, end, noff, doff;
size_t align = (fm->cls == ELFCLASS32 ? 4 : 8);
#define ALIGNED_LEN(len) (((len) + align - 1) & ~(align - 1))
int printed;
if (size != ph_size) {
error(EXIT_FAILURE, 0, "corrupted program header size.\n");
@ -212,43 +212,38 @@ dophn_exec(fmagic fm, off_t off, int num, size_t size)
/*@notreached@*/
}
offset = 0;
printed = 0;
for (;;) {
if (offset >= bufsize)
end = offset + 12;
if (end >= bufsize)
/*@innerbreak@*/ break;
if (fm->cls == ELFCLASS32)
nh32 = (Elf32_Nhdr *)&nbuf[offset];
else
nh64 = (Elf64_Nhdr *)&nbuf[offset];
offset += nh_size;
if (offset + nh_namesz >= bufsize) {
/*
* We're past the end of the buffer.
*/
/*@innerbreak@*/ break;
}
nameoffset = offset;
offset += nh_namesz;
offset = ((offset+ph_align-1)/ph_align)*ph_align;
if ((nh_namesz == 0) && (nh_descsz == 0)) {
/*
* We're out of note headers.
*/
offset = end; /* skip note header. */
end = offset + ALIGNED_LEN (nh_namesz)
+ ALIGNED_LEN (nh_descsz);
if (end > bufsize)
/*@innerbreak@*/ break;
}
if (offset + nh_descsz >= bufsize)
/*@innerbreak@*/ break;
noff = offset;
doff = ALIGNED_LEN(offset + nh_namesz);
offset = end;
if (printed)
continue;
if (nh_namesz == 4 &&
strcmp(&nbuf[nameoffset], "GNU") == 0 &&
strcmp(&nbuf[noff], "GNU") == 0 &&
nh_type == NT_GNU_VERSION &&
nh_descsz == 16) {
uint32_t *desc =
(uint32_t *)&nbuf[offset];
(uint32_t *)&nbuf[doff];
if (!printed)
file_printf(fm, ", for GNU/");
switch (getu32(fm, desc[0])) {
case GNU_OS_LINUX:
@ -268,10 +263,11 @@ dophn_exec(fmagic fm, off_t off, int num, size_t size)
getu32(fm, desc[1]),
getu32(fm, desc[2]),
getu32(fm, desc[3]));
printed = 1;
}
if (nh_namesz == 7 &&
strcmp(&nbuf[nameoffset], "NetBSD") == 0 &&
strcmp(&nbuf[noff], "NetBSD") == 0 &&
nh_type == NT_NETBSD_VERSION &&
nh_descsz == 4) {
file_printf(fm, ", for NetBSD");
@ -279,14 +275,15 @@ dophn_exec(fmagic fm, off_t off, int num, size_t size)
* Version number is stuck at 199905,
* and hence is basically content-free.
*/
printed = 1;
}
if (nh_namesz == 8 &&
strcmp(&nbuf[nameoffset], "FreeBSD") == 0 &&
strcmp(&nbuf[noff], "FreeBSD") == 0 &&
nh_type == NT_FREEBSD_VERSION &&
nh_descsz == 4) {
uint32_t desc = getu32(fm,
*(uint32_t *)&nbuf[offset]);
*(uint32_t *)&nbuf[doff]);
file_printf(fm, ", for FreeBSD");
/*
* Contents is __FreeBSD_version,
@ -303,14 +300,16 @@ dophn_exec(fmagic fm, off_t off, int num, size_t size)
if (desc / 1000 % 10 > 0)
file_printf(fm, ".%d",
desc / 1000 % 10);
printed = 1;
}
if (nh_namesz == 8 &&
strcmp(&nbuf[nameoffset], "OpenBSD") == 0 &&
strcmp(&nbuf[noff], "OpenBSD") == 0 &&
nh_type == NT_OPENBSD_VERSION &&
nh_descsz == 4) {
file_printf(fm, ", for OpenBSD");
/* Content of note is always 0 */
printed = 1;
}
}
if ((lseek(fm->fd, ph_offset + offset, SEEK_SET)) == -1) {
@ -434,7 +433,7 @@ dophn_core(fmagic fm, off_t off, int num, size_t size)
nh32 = (Elf32_Nhdr *)&nbuf[offset];
else
nh64 = (Elf64_Nhdr *)&nbuf[offset];
offset += nh_size;
offset += 12;
/*
* Check whether this note has the name "CORE" or

View File

@ -20,7 +20,7 @@ Name: rpm
%define version @VERSION@
Version: %{version}
%{expand: %%define rpm_version %{version}}
Release: 0.20
Release: 0.21
Group: System Environment/Base
Source: ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.0.x/rpm-%{rpm_version}.tar.gz
License: GPL
@ -485,6 +485,10 @@ exit 0
%{__includedir}/popt.h
%changelog
* Fri Mar 12 2004 Jeff Johnson <jbj@jbj.org> 4.3-0.21
- fix: increase file context regex parse buffer to BUFSIZ.
- fix: handle elf64 note sections correctly.
* Wed Mar 10 2004 Jeff Johnson <jbj@jbj.org> 4.3-0.20
- add sparcv8 and enable elf32/elf64 Zon sparc64 (#117302).
- fix: --querybynumber looped.