[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