[uClibc-cvs] uClibc/ldso/ldso readelflib1.c,1.50,1.51
Erik Andersen
andersen at uclibc.org
Wed Dec 3 21:35:06 UTC 2003
Update of /var/cvs/uClibc/ldso/ldso
In directory winder:/tmp/cvs-serv28084/ldso/ldso
Modified Files:
readelflib1.c
Log Message:
Eliminate some static buffers based on a patch from Tobias Anderberg
Index: readelflib1.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/readelflib1.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- readelflib1.c 5 Nov 2003 02:45:34 -0000 1.50
+++ readelflib1.c 3 Dec 2003 21:35:01 -0000 1.51
@@ -62,7 +62,7 @@
_dl_cache_size = st.st_size;
_dl_cache_addr = (caddr_t) _dl_mmap(0, _dl_cache_size, PROT_READ, MAP_SHARED, fd, 0);
_dl_close(fd);
- if (_dl_cache_addr == (caddr_t) - 1) {
+ if (_dl_mmap_check_error(_dl_cache_addr)) {
_dl_dprintf(2, "%s: can't map cache '%s'\n",
_dl_progname, LDSO_CACHE);
return -1;
@@ -399,8 +399,7 @@
Elf32_Dyn *dpnt;
struct elf_resolve *tpnt;
ElfW(Phdr) *ppnt;
- char *status;
- char header[4096];
+ char *status, *header;
unsigned long dynamic_info[24];
unsigned long *lpnt;
unsigned long libaddr;
@@ -450,7 +449,16 @@
return NULL;
}
- _dl_read(infile, header, sizeof(header));
+ header = _dl_mmap((void *) 0, 4096, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+ if (_dl_mmap_check_error(header)) {
+ _dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
+ _dl_internal_error_number = LD_ERROR_MMAP_FAILED;
+ _dl_close(infile);
+ return NULL;
+ };
+
+ _dl_read(infile, header, 4096);
epnt = (ElfW(Ehdr) *) (intptr_t) header;
if (epnt->e_ident[0] != 0x7f ||
epnt->e_ident[1] != 'E' ||
@@ -461,6 +469,7 @@
libname);
_dl_internal_error_number = LD_ERROR_NOTELF;
_dl_close(infile);
+ _dl_munmap(header, 4096);
return NULL;
};
@@ -475,6 +484,7 @@
_dl_dprintf(2, "%s: '%s' is not an ELF executable for " ELF_TARGET
"\n", _dl_progname, libname);
_dl_close(infile);
+ _dl_munmap(header, 4096);
return NULL;
};
@@ -520,6 +530,7 @@
_dl_dprintf(2, "%s: can't map %s\n", _dl_progname, libname);
_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
_dl_close(infile);
+ _dl_munmap(header, 4096);
return NULL;
};
libaddr = (unsigned long) status;
@@ -554,6 +565,7 @@
_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
_dl_munmap((char *) libaddr, maxvma - minvma);
_dl_close(infile);
+ _dl_munmap(header, 4096);
return NULL;
};
@@ -570,6 +582,7 @@
* that are not mapped as part of the file */
map_size = (ppnt->p_vaddr + ppnt->p_filesz + ADDR_ALIGN) & PAGE_ALIGN;
+
if (map_size < ppnt->p_vaddr + ppnt->p_memsz)
status = (char *) _dl_mmap((char *) map_size +
(piclib ? libaddr : 0),
@@ -585,6 +598,7 @@
_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
_dl_munmap((char *) libaddr, maxvma - minvma);
_dl_close(infile);
+ _dl_munmap(header, 4096);
return NULL;
};
@@ -613,6 +627,7 @@
_dl_internal_error_number = LD_ERROR_NODYNAMIC;
_dl_dprintf(2, "%s: '%s' is missing a dynamic section\n",
_dl_progname, libname);
+ _dl_munmap(header, 4096);
return NULL;
}
@@ -715,6 +730,8 @@
}
#endif
+ _dl_munmap(header, 4096);
+
return tpnt;
}
@@ -765,7 +782,14 @@
int num;
va_list args;
char *start, *ptr, *string;
- char buf[2048];
+ static char *buf;
+
+ buf = _dl_mmap((void *) 0, 4096, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+ if (_dl_mmap_check_error(buf)) {
+ _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
+ _dl_exit(20);
+ }
start = ptr = buf;
@@ -828,6 +852,7 @@
start = NULL;
}
}
+ _dl_munmap(buf, 4096);
return;
}
@@ -878,4 +903,3 @@
return retval;
}
-
More information about the uClibc-cvs
mailing list