|
From: <sv...@va...> - 2005-06-28 19:20:51
|
Author: njn
Date: 2005-06-28 20:20:46 +0100 (Tue, 28 Jun 2005)
New Revision: 4043
Log:
Free memory in the error case. Fixes bug #103168.
Modified:
trunk/coregrind/m_ume.c
Modified: trunk/coregrind/m_ume.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_ume.c 2005-06-28 19:04:51 UTC (rev 4042)
+++ trunk/coregrind/m_ume.c 2005-06-28 19:20:46 UTC (rev 4043)
@@ -275,37 +275,37 @@
if (pread(fd, &e->e, sizeof(e->e), 0) !=3D sizeof(e->e)) {
fprintf(stderr, "valgrind: %s: can't read ELF header: %s\n",=20
filename, strerror(errno));
- return NULL;
+ goto bad;
}
=20
if (memcmp(&e->e.e_ident[0], ELFMAG, SELFMAG) !=3D 0) {
fprintf(stderr, "valgrind: %s: bad ELF magic number\n", filename);
- return NULL;
+ goto bad;
}
if (e->e.e_ident[EI_CLASS] !=3D VG_ELF_CLASS) {
fprintf(stderr,=20
"valgrind: wrong ELF executable class "
"(eg. 32-bit instead of 64-bit)\n");
- return NULL;
+ goto bad;
}
if (e->e.e_ident[EI_DATA] !=3D VG_ELF_ENDIANNESS) {
fprintf(stderr, "valgrind: executable has wrong endian-ness\n");
- return NULL;
+ goto bad;
}
if (!(e->e.e_type =3D=3D ET_EXEC || e->e.e_type =3D=3D ET_DYN)) {
fprintf(stderr, "valgrind: this is not an executable\n");
- return NULL;
+ goto bad;
}
=20
if (e->e.e_machine !=3D VG_ELF_MACHINE) {
fprintf(stderr, "valgrind: executable is not for "
"this architecture\n");
- return NULL;
+ goto bad;
}
=20
if (e->e.e_phentsize !=3D sizeof(ESZ(Phdr))) {
fprintf(stderr, "valgrind: sizeof ELF Phdr wrong\n");
- return NULL;
+ goto bad;
}
=20
phsz =3D sizeof(ESZ(Phdr)) * e->e.e_phnum;
@@ -314,10 +314,15 @@
=20
if (pread(fd, e->p, phsz, e->e.e_phoff) !=3D phsz) {
fprintf(stderr, "valgrind: can't read phdr: %s\n", strerror(errno)=
);
- return NULL;
+ free(e->p);
+ goto bad;
}
=20
return e;
+
+ bad:
+ free(e);
+ return NULL;
}
=20
/* Map an ELF file. Returns the brk address. */
|