changeset 4991:8312f51e0f59

6597841 gelf_getdyn() reads one too many dynamic entries
author ab196087
date Tue, 04 Sep 2007 13:24:56 -0700
parents 320a8657b24d
children 18d161314626
files usr/src/cmd/sgs/libelf/common/gelf.c usr/src/cmd/sgs/packages/Makefile.targ usr/src/cmd/sgs/packages/common/SUNWonld-README
diffstat 3 files changed, 38 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/sgs/libelf/common/gelf.c	Tue Sep 04 12:54:15 2007 -0700
+++ b/usr/src/cmd/sgs/libelf/common/gelf.c	Tue Sep 04 13:24:56 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -487,7 +487,7 @@
 
 	EDATA_READLOCKS(data);
 
-	if ((entsize * ndx) > data->d_size) {
+	if ((entsize * ndx) >= data->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -497,7 +497,7 @@
 		dst->st_value	= (Elf64_Addr)s->st_value;
 		dst->st_size	= (Elf64_Xword)s->st_size;
 		dst->st_info	= ELF64_ST_INFO(ELF32_ST_BIND(s->st_info),
-					ELF32_ST_TYPE(s->st_info));
+		    ELF32_ST_TYPE(s->st_info));
 		dst->st_other	= s->st_other;
 		dst->st_shndx	= s->st_shndx;
 	} else
@@ -529,7 +529,7 @@
 
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -542,7 +542,7 @@
 		/* LINTED */
 		d->st_size	= (Elf32_Word)src->st_size;
 		d->st_info	= ELF32_ST_INFO(ELF64_ST_BIND(src->st_info),
-					ELF64_ST_TYPE(src->st_info));
+		    ELF64_ST_TYPE(src->st_info));
 		d->st_other	= src->st_other;
 		d->st_shndx	= src->st_shndx;
 	} else
@@ -573,7 +573,7 @@
 	}
 	EDATA_READLOCKS(data);
 
-	if ((entsize * ndx) > data->d_size) {
+	if ((entsize * ndx) >= data->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -609,7 +609,7 @@
 	}
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -643,7 +643,7 @@
 	}
 	EDATA_READLOCKS(data);
 
-	if ((entsize * ndx) > data->d_size) {
+	if ((entsize * ndx) >= data->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -679,7 +679,7 @@
 	}
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -706,7 +706,7 @@
 		return (NULL);
 	if (shndxdata && xshndx) {
 		EDATA_READLOCKS(shndxdata);
-		if ((ndx * sizeof (Elf32_Word)) > shndxdata->d_size) {
+		if ((ndx * sizeof (Elf32_Word)) >= shndxdata->d_size) {
 			_elf_seterr(EREQ_RAND, 0);
 			EDATA_READUNLOCKS(shndxdata);
 			return (NULL);
@@ -727,7 +727,7 @@
 		return (0);
 	if (shndxdata) {
 		ELFWLOCK(EDATA_ELF(shndxdata));
-		if ((ndx * sizeof (Elf32_Word)) > shndxdata->d_size) {
+		if ((ndx * sizeof (Elf32_Word)) >= shndxdata->d_size) {
 			_elf_seterr(EREQ_RAND, 0);
 			ELFUNLOCK(EDATA_ELF(shndxdata));
 			return (0);
@@ -759,7 +759,7 @@
 	}
 	EDATA_READLOCKS(src);
 
-	if ((entsize * ndx) > src->d_size) {
+	if ((entsize * ndx) >= src->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -769,11 +769,11 @@
 		dst->m_repeat = (Elf64_Xword)m->m_repeat;
 		dst->m_stride = (Elf64_Half)m->m_stride;
 		dst->m_value = (Elf64_Xword)m->m_value;
-		dst->m_info = ELF64_M_INFO(
-			ELF32_M_SYM(m->m_info),
-			ELF32_M_SIZE(m->m_info));
-	} else
+		dst->m_info = ELF64_M_INFO(ELF32_M_SYM(m->m_info),
+		    ELF32_M_SIZE(m->m_info));
+	} else {
 		*dst = ((Elf64_Move *)src->d_buf)[ndx];
+	}
 
 	EDATA_READUNLOCKS(src);
 	return (dst);
@@ -799,7 +799,7 @@
 	}
 	ELFWLOCK(EDATA_ELF(dest));
 
-	if ((entsize * ndx) > dest->d_size) {
+	if ((entsize * ndx) >= dest->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -809,11 +809,11 @@
 		m->m_repeat = (Elf32_Half)src->m_repeat;
 		m->m_stride = (Elf32_Half)src->m_stride;
 		m->m_value = (Elf32_Lword)src->m_value;
-		m->m_info = (Elf32_Word)ELF32_M_INFO(
-				ELF64_M_SYM(src->m_info),
-				ELF64_M_SIZE(src->m_info));
-	} else
+		m->m_info = (Elf32_Word)ELF32_M_INFO(ELF64_M_SYM(src->m_info),
+		    ELF64_M_SIZE(src->m_info));
+	} else {
 		((Elf64_Move *)dest->d_buf)[ndx] = *(Elf64_Move *)src;
+	}
 
 	ELFUNLOCK(EDATA_ELF(dest));
 	return (rc);
@@ -840,7 +840,7 @@
 	}
 	EDATA_READLOCKS(src);
 
-	if ((entsize * ndx) > src->d_size) {
+	if ((entsize * ndx) >= src->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -885,7 +885,7 @@
 	}
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -901,11 +901,11 @@
 		 * Elf64's r_info field can have, so ignore it.
 		 */
 		/* LINTED */
-		r->r_info	= ELF32_R_INFO(
-					ELF64_R_SYM(src->r_info),
-					ELF64_R_TYPE(src->r_info));
-	} else
+		r->r_info	= ELF32_R_INFO(ELF64_R_SYM(src->r_info),
+		    ELF64_R_TYPE(src->r_info));
+	} else {
 		((Elf64_Rela *)dst->d_buf)[ndx] = *(Elf64_Rela *)src;
+	}
 
 	ELFUNLOCK(EDATA_ELF(dst));
 
@@ -933,7 +933,7 @@
 	}
 	EDATA_READLOCKS(src);
 
-	if ((entsize * ndx) > src->d_size) {
+	if ((entsize * ndx) >= src->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -947,7 +947,7 @@
 		 */
 		/* LINTED */
 		dst->r_info	= ELF64_R_INFO(ELF32_R_SYM(r->r_info),
-					ELF32_R_TYPE(r->r_info));
+		    ELF32_R_TYPE(r->r_info));
 	} else
 		*dst = ((Elf64_Rel *)src->d_buf)[ndx];
 
@@ -976,7 +976,7 @@
 	}
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
@@ -990,12 +990,12 @@
 		 * Elf64's r_info field can have, so ignore it.
 		 */
 		/* LINTED */
-		r->r_info	= ELF32_R_INFO(
-					ELF64_R_SYM(src->r_info),
-					ELF64_R_TYPE(src->r_info));
+		r->r_info	= ELF32_R_INFO(ELF64_R_SYM(src->r_info),
+		    ELF64_R_TYPE(src->r_info));
 
-	} else
+	} else {
 		((Elf64_Rel *)dst->d_buf)[ndx] = *(Elf64_Rel *)src;
+	}
 
 	ELFUNLOCK(EDATA_ELF(dst));
 	return (rc);
@@ -1036,7 +1036,7 @@
 
 	EDATA_READLOCKS(data);
 
-	if ((entsize * ndx) > data->d_size) {
+	if ((entsize * ndx) >= data->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		dst = NULL;
 	} else if (class == ELFCLASS32) {
@@ -1072,7 +1072,7 @@
 
 	ELFWLOCK(EDATA_ELF(dst));
 
-	if ((entsize * ndx) > dst->d_size) {
+	if ((entsize * ndx) >= dst->d_size) {
 		_elf_seterr(EREQ_RAND, 0);
 		rc = 0;
 	} else if (class == ELFCLASS32) {
--- a/usr/src/cmd/sgs/packages/Makefile.targ	Tue Sep 04 12:54:15 2007 -0700
+++ b/usr/src/cmd/sgs/packages/Makefile.targ	Tue Sep 04 13:24:56 2007 -0700
@@ -29,7 +29,7 @@
 
 pkg: FRC
 	@ $(RM) -r $(PACKAGE)
-	pkgmk -l 15000 -f prototype_$(MACH) -d $(PKGARCHIVE) -r $(ROOT) \
+	pkgmk -l 18000 -f prototype_$(MACH) -d $(PKGARCHIVE) -r $(ROOT) \
 		-o $(PACKAGE) 2>&1 | egrep -v "$(SRC)|parametric paths may"
 	pkgtrans -o -s $(PKGARCHIVE) $(PACKAGE).tmp $(PACKAGE)
 	$(RM) -r $(PKGARCHIVE)/$(PACKAGE)
--- a/usr/src/cmd/sgs/packages/common/SUNWonld-README	Tue Sep 04 12:54:15 2007 -0700
+++ b/usr/src/cmd/sgs/packages/common/SUNWonld-README	Tue Sep 04 13:24:56 2007 -0700
@@ -1255,3 +1255,4 @@
 6589819 ld generated reference to __tls_get_addr() fails when resolving to a
 	shared object reference
 6595139 various applications should export yy* global variables for libl
+6597841 gelf_getdyn() reads one too many dynamic entries