Check file sizes only for regular files. The current code breaks savecore
authortobias <tobias@openbsd.org>
Fri, 16 Oct 2015 16:54:38 +0000 (16:54 +0000)
committertobias <tobias@openbsd.org>
Fri, 16 Oct 2015 16:54:38 +0000 (16:54 +0000)
due to its kvm handling.

ok deraadt

distrib/common/elfrd_size.c
lib/libc/gen/nlist.c
usr.sbin/installboot/i386_nlist.c

index 5845801..01ce5dc 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <nlist.h>
 
@@ -192,7 +193,7 @@ ELFNAME(nlist)(int fd, struct nlist *list)
 
        /* Make sure it's not too big to mmap */
        if (SIZE_MAX - ehdr.e_shoff < shdr_size ||
-           ehdr.e_shoff + shdr_size > st.st_size) {
+           S_ISREG(st.st_mode) && ehdr.e_shoff + shdr_size > st.st_size) {
                errno = EFBIG;
                return (-1);
        }
@@ -262,7 +263,7 @@ ELFNAME(nlist)(int fd, struct nlist *list)
 
        /* Check for files too large to mmap. */
        if (SIZE_MAX - symstrsize < symstroff ||
-           symstrsize + symstroff > st.st_size) {
+           S_ISREG(st.st_mode) && symstrsize + symstroff > st.st_size) {
                errno = EFBIG;
                return (-1);
        }
index 4376407..f76543b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: nlist.c,v 1.64 2015/10/16 13:54:45 tobias Exp $ */
+/*     $OpenBSD: nlist.c,v 1.65 2015/10/16 16:54:38 tobias Exp $ */
 /*
  * Copyright (c) 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -107,7 +107,7 @@ __fdnlist(int fd, struct nlist *list)
 
        /* Make sure it's not too big to mmap */
        if (SIZE_MAX - ehdr.e_shoff < shdr_size ||
-           ehdr.e_shoff + shdr_size > st.st_size) {
+           (S_ISREG(st.st_mode) && ehdr.e_shoff + shdr_size > st.st_size)) {
                errno = EFBIG;
                return (-1);
        }
@@ -177,7 +177,7 @@ __fdnlist(int fd, struct nlist *list)
 
        /* Check for files too large to mmap. */
        if (SIZE_MAX - symstrsize < symstroff ||
-           symstrsize + symstroff > st.st_size) {
+           (S_ISREG(st.st_mode) && symstrsize + symstroff > st.st_size)) {
                errno = EFBIG;
                return (-1);
        }
index 9d5950d..c5a3205 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: i386_nlist.c,v 1.3 2015/10/16 13:54:45 tobias Exp $   */
+/*     $OpenBSD: i386_nlist.c,v 1.4 2015/10/16 16:54:38 tobias Exp $   */
 /*
  * Copyright (c) 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -117,7 +117,7 @@ __elf_fdnlist(int fd, struct nlist *list)
 
        /* Make sure it's not too big to mmap */
        if (SIZE_MAX - ehdr.e_shoff < shdr_size ||
-           ehdr.e_shoff + shdr_size > st.st_size) {
+           S_ISREG(st.st_mode) && ehdr.e_shoff + shdr_size > st.st_size) {
                errno = EFBIG;
                return (-1);
        }
@@ -187,7 +187,7 @@ __elf_fdnlist(int fd, struct nlist *list)
 
        /* Check for files too large to mmap. */
        if (SIZE_MAX - symstrsize < symstroff ||
-           symstrsize + symstroff > st.st_size) {
+           S_ISREG(st.st_mode) && symstrsize + symstroff > st.st_size) {
                errno = EFBIG;
                return (-1);
        }