#define ph_offset (fm->cls == ELFCLASS32 \
? getu32(fm, ph32.p_offset) \
: getu64(fm, ph64.p_offset))
+#define ph_align (fm->cls == ELFCLASS32 \
+ ? getu32(fm, ph32.p_align) \
+ : getu64(fm, ph64.p_align))
#define nh_size (fm->cls == ELFCLASS32 \
? sizeof *nh32 \
: sizeof *nh64)
char nbuf[BUFSIZ];
int bufsize;
size_t offset, nameoffset;
+ off_t savedoffset;
if (lseek(fm->fd, off, SEEK_SET) == -1) {
error(EXIT_FAILURE, 0, "lseek failed (%s).\n", strerror(errno));
error(EXIT_FAILURE, 0, "read failed (%s).\n", strerror(errno));
/*@notreached@*/
}
+ if ((savedoffset = lseek(fm->fd, 0, SEEK_CUR)) == -1) {
+ error(EXIT_FAILURE, 0, "lseek failed (%s).\n", strerror(errno));
+ /*@notreached@*/
+ }
switch (ph_type) {
case PT_DYNAMIC:
error(EXIT_FAILURE, 0, "lseek failed (%s).\n", strerror(errno));
/*@notreached@*/
}
- bufsize = read(fm->fd, nbuf, BUFSIZ);
+ bufsize = read(fm->fd, nbuf, sizeof(nbuf));
if (bufsize == -1) {
error(EXIT_FAILURE, 0, ": " "read failed (%s).\n",
strerror(errno));
nameoffset = offset;
offset += nh_namesz;
- offset = ((offset + 3)/4)*4;
+ offset = ((offset+ph_align-1)/ph_align)*ph_align;
+
+ if ((nh_namesz == 0) && (nh_descsz == 0)) {
+ /*
+ * We're out of note headers.
+ */
+ break;
+ }
if (offset + nh_descsz >= bufsize)
/*@innerbreak@*/ break;
/* Content of note is always 0 */
}
}
+ if ((lseek(fm->fd, savedoffset + offset, SEEK_SET)) == -1) {
+ error(EXIT_FAILURE, 0, "lseek failed (%s).\n", strerror(errno));
+ /*@notreached@*/
+ }
/*@switchbreak@*/ break;
}
}
%define version @VERSION@
Version: %{version}
%{expand: %%define rpm_version %{version}}
-Release: 0.52
+Release: 0.53
Group: System Environment/Base
Source: ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.0.x/rpm-%{rpm_version}.tar.gz
Copyright: GPL
%{__prefix}/include/popt.h
%changelog
+* Tue Jan 7 2003 Jeff Johnson <jbj@redhat.com> 4.2-0.53
+- file: read elf64 notes correctly.
+
* Mon Jan 6 2003 Jeff Johnson <jbj@redhat.com> 4.2-0.52
- portabilitly: solaris fixes.
- for DSO's, provide the file basename if DT_SONAME not found.