changeset 13918:4f2ce6c1a90c

3451 archive libraries with no symbols shouldn't require a string table Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Jason King <jason.brian.king@gmail.com> Approved by: Garrett D'Amore <garrett@damore.org>
author Richard Lowe <richlowe@richlowe.net>
date Fri, 04 Jan 2013 23:29:21 -0500
parents c2c5e1bf3119
children e721e2fa45d8
files usr/src/cmd/sgs/libelf/common/getarsym.c usr/src/cmd/sgs/packages/common/SUNWonld-README
diffstat 2 files changed, 21 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/sgs/libelf/common/getarsym.c	Fri Jan 04 21:21:01 2013 -0500
+++ b/usr/src/cmd/sgs/libelf/common/getarsym.c	Fri Jan 04 23:29:21 2013 -0500
@@ -105,36 +105,43 @@
 		if (is64) {
 			if (sz < 8 || (sz - 8) / 8 < (n = get8(off))) {
 				_elf_seterr(EFMT_ARSYMSZ, 0);
-				return (0);
+				return (NULL);
 			}
 		} else {
 			if (sz < 4 || (sz - 4) / 4 < (n = get4(off))) {
 				_elf_seterr(EFMT_ARSYMSZ, 0);
-				return (0);
+				return (NULL);
 			}
 		}
 		off += eltsize;
 		endoff = off + n * eltsize;
 
 		/*
-		 * string table must be present, null terminated
+		 * If there are symbols in the symbol table, a
+		 * string table must be present and NULL terminated.
+		 *
+		 * The format dictates that the string table must always be
+		 * present, however in the case of an archive containing no
+		 * symbols GNU ar will not create one.  We are permissive for
+		 * the sake of compatibility.
 		 */
-
-		if (((str = (char *)endoff) >= endstr) ||
-		    (*(endstr - 1) != '\0')) {
+		if ((n > 0) && (((str = (char *)endoff) >= endstr) ||
+		    (*(endstr - 1) != '\0'))) {
 			_elf_seterr(EFMT_ARSYM, 0);
-			return (0);
+			return (NULL);
 		}
 
 		/*
+		 * There is always at least one entry returned if a symtab
+		 * exists since the table's last entry is an artificial one
+		 * with a NULL as_name, but is included in the count.
+		 *
 		 * overflow can occur here, but not likely
 		 */
-
 		*e = n + 1;
-		n = sizeof (Elf_Arsym) * (n + 1);
-		if ((oas = malloc(n)) == 0) {
+		if ((oas = calloc(n + 1, sizeof (Elf_Arsym))) == NULL) {
 			_elf_seterr(EMEM_ARSYM, errno);
-			return (0);
+			return (NULL);
 		}
 	}
 	{
@@ -144,7 +151,7 @@
 			if (str >= endstr) {
 				_elf_seterr(EFMT_ARSYMSTR, 0);
 				free(oas);
-				return (0);
+				return (NULL);
 			}
 			if (is64)
 				as->as_off = get8(off);
@@ -158,7 +165,7 @@
 				/* LINTED */
 				;
 		}
-		as->as_name = 0;
+		as->as_name = NULL;
 		as->as_off = 0;
 		as->as_hash = ~(unsigned long)0L;
 	}
--- a/usr/src/cmd/sgs/packages/common/SUNWonld-README	Fri Jan 04 21:21:01 2013 -0500
+++ b/usr/src/cmd/sgs/packages/common/SUNWonld-README	Fri Jan 04 23:29:21 2013 -0500
@@ -1643,3 +1643,4 @@
 3453	GNU comdat redirection does exactly the wrong thing
 3439	discarded sections shouldn't end up on output lists
 3436	relocatable objects also need sloppy relocation
+3451	archive libraries with no symbols shouldn't require a string table