Module Name: src
Committed By: thorpej
Date: Sat Dec 19 07:44:27 UTC 2009
Modified Files:
src/external/bsd/libelf/dist: elf_scn.c
Log Message:
- _libelf_load_scn(): If shoff is larger than SSIZE_MAX, bail out with
a HEADER error. Pass lint.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/libelf/dist/elf_scn.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/libelf/dist/elf_scn.c
diff -u src/external/bsd/libelf/dist/elf_scn.c:1.2 src/external/bsd/libelf/dist/elf_scn.c:1.3
--- src/external/bsd/libelf/dist/elf_scn.c:1.2 Sat Dec 19 05:55:37 2009
+++ src/external/bsd/libelf/dist/elf_scn.c Sat Dec 19 07:44:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: elf_scn.c,v 1.2 2009/12/19 05:55:37 thorpej Exp $ */
+/* $NetBSD: elf_scn.c,v 1.3 2009/12/19 07:44:27 thorpej Exp $ */
/*-
* Copyright (c) 2006 Joseph Koshy
@@ -28,13 +28,15 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD: src/lib/libelf/elf_scn.c,v 1.2.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $"); */
-__RCSID("$NetBSD: elf_scn.c,v 1.2 2009/12/19 05:55:37 thorpej Exp $");
+__RCSID("$NetBSD: elf_scn.c,v 1.3 2009/12/19 07:44:27 thorpej Exp $");
#include <assert.h>
#include <errno.h>
#include <gelf.h>
#include <libelf.h>
+#include <stddef.h>
#include <stdlib.h>
+#include <limits.h>
#include "_libelf.h"
@@ -84,7 +86,11 @@
xlator = _libelf_get_translator(ELF_T_SHDR, ELF_TOMEMORY, ec);
swapbytes = e->e_byteorder != LIBELF_PRIVATE(byteorder);
- src = e->e_rawfile + shoff;
+ if (shoff > SSIZE_MAX) {
+ LIBELF_SET_ERROR(HEADER, 0);
+ return (0);
+ }
+ src = e->e_rawfile + (ssize_t)shoff;
/*
* If the file is using extended numbering then section #0
@@ -104,7 +110,7 @@
if ((scn = _libelf_allocate_scn(e, i)) == NULL)
return (0);
- (*xlator)((char *) &scn->s_shdr, src, (size_t) 1, swapbytes);
+ (*xlator)((void *) &scn->s_shdr, src, (size_t) 1, swapbytes);
if (ec == ELFCLASS32) {
scn->s_offset = scn->s_rawoff =