summaryrefslogtreecommitdiff
path: root/stand
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2020-08-29 21:05:43 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2020-08-29 21:05:43 +0000
commited19b7c5259d293e42ca4fc7c9eaa29cfcdcfbf3 (patch)
treeb2e53a71fbad08b676a1f568e6f1ae263c16854e /stand
parent5d4bf0578f0c665f2f28f8ca0970a3368fad6e7b (diff)
downloadsrc-test-ed19b7c5259d293e42ca4fc7c9eaa29cfcdcfbf3.tar.gz
src-test-ed19b7c5259d293e42ca4fc7c9eaa29cfcdcfbf3.zip
zalloc_malloc:Free hexdump preceeding buffer when we detect overflow
Move hexdump from stand/common/misc.c to stand/libsa/hexdump.c (svn cp) Disable use of pager - causes linking issue for boot1 can be re-enabled by defining HEXDUMP_PAGER. Reviewed by: stevek, imp MFC after: 1 week Sponsored by: Juniper Networks Differential Revision: https://reviews.freebsd.org/D26235
Notes
Notes: svn path=/head/; revision=364965
Diffstat (limited to 'stand')
-rw-r--r--stand/common/bootstrap.h1
-rw-r--r--stand/common/misc.c40
-rw-r--r--stand/libsa/Makefile5
-rw-r--r--stand/libsa/hexdump.c79
-rw-r--r--stand/libsa/pkgfs.c2
-rw-r--r--stand/libsa/stand.h3
-rw-r--r--stand/libsa/zalloc_malloc.c11
7 files changed, 96 insertions, 45 deletions
diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h
index 809859c276b97..9637faa825dde 100644
--- a/stand/common/bootstrap.h
+++ b/stand/common/bootstrap.h
@@ -68,7 +68,6 @@ int getrootmount(char *rootdev);
/* misc.c */
char *unargv(int argc, char *argv[]);
-void hexdump(caddr_t region, size_t len);
size_t strlenout(vm_offset_t str);
char *strdupout(vm_offset_t str);
void kern_bzero(vm_offset_t dest, size_t len);
diff --git a/stand/common/misc.c b/stand/common/misc.c
index d85597522f8ac..9e6bea1e244cc 100644
--- a/stand/common/misc.c
+++ b/stand/common/misc.c
@@ -169,46 +169,6 @@ alloc_pread(readin_handle_t fd, off_t off, size_t len)
return (buf);
}
-/*
- * Display a region in traditional hexdump format.
- */
-void
-hexdump(caddr_t region, size_t len)
-{
- caddr_t line;
- int x, c;
- char lbuf[80];
-#define emit(fmt, args...) {sprintf(lbuf, fmt , ## args); pager_output(lbuf);}
-
- pager_open();
- for (line = region; line < (region + len); line += 16) {
- emit("%08lx ", (long) line);
-
- for (x = 0; x < 16; x++) {
- if ((line + x) < (region + len)) {
- emit("%02x ", *(uint8_t *)(line + x));
- } else {
- emit("-- ");
- }
- if (x == 7)
- emit(" ");
- }
- emit(" |");
- for (x = 0; x < 16; x++) {
- if ((line + x) < (region + len)) {
- c = *(uint8_t *)(line + x);
- if ((c < ' ') || (c > '~')) /* !isprint(c) */
- c = '.';
- emit("%c", c);
- } else {
- emit(" ");
- }
- }
- emit("|\n");
- }
- pager_close();
-}
-
void
dev_cleanup(void)
{
diff --git a/stand/libsa/Makefile b/stand/libsa/Makefile
index d016a07ff0e62..effece9e01b2a 100644
--- a/stand/libsa/Makefile
+++ b/stand/libsa/Makefile
@@ -13,8 +13,9 @@ LIBSA_CPUARCH?=${MACHINE_CPUARCH}
LIB?= sa
# standalone components and stuff we have modified locally
-SRCS+= gzguts.h zutil.h __main.c abort.c assert.c bcd.c environment.c getopt.c gets.c \
- globals.c pager.c panic.c printf.c strdup.c strerror.c \
+SRCS+= gzguts.h zutil.h __main.c abort.c assert.c bcd.c environment.c \
+ getopt.c gets.c globals.c \
+ hexdump.c pager.c panic.c printf.c strdup.c strerror.c \
random.c sbrk.c twiddle.c zalloc.c zalloc_malloc.c
# private (pruned) versions of libc string functions
diff --git a/stand/libsa/hexdump.c b/stand/libsa/hexdump.c
new file mode 100644
index 0000000000000..50cce47b8f303
--- /dev/null
+++ b/stand/libsa/hexdump.c
@@ -0,0 +1,79 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <string.h>
+#include <stand.h>
+
+/*
+ * Display a region in traditional hexdump format.
+ */
+void
+hexdump(caddr_t region, size_t len)
+{
+ caddr_t line;
+ int x, c;
+#ifdef HEXDUMP_PAGER
+ /* pager causes linking issues for some apps */
+#define emit(fmt, args...) {sprintf(lbuf, fmt , ## args); pager_output(lbuf);}
+ char lbuf[80];
+
+ pager_open();
+#else
+#define emit(fmt, args...) printf(fmt, ## args)
+#endif
+
+ for (line = region; line < (region + len); line += 16) {
+ emit("%08lx ", (long) line);
+
+ for (x = 0; x < 16; x++) {
+ if ((line + x) < (region + len)) {
+ emit("%02x ", *(uint8_t *)(line + x));
+ } else {
+ emit("-- ");
+ }
+ if (x == 7)
+ emit(" ");
+ }
+ emit(" |");
+ for (x = 0; x < 16; x++) {
+ if ((line + x) < (region + len)) {
+ c = *(uint8_t *)(line + x);
+ if ((c < ' ') || (c > '~')) /* !isprint(c) */
+ c = '.';
+ emit("%c", c);
+ } else {
+ emit(" ");
+ }
+ }
+ emit("|\n");
+ }
+#ifdef HEXDUMP_PAGER
+ pager_close();
+#endif
+}
diff --git a/stand/libsa/pkgfs.c b/stand/libsa/pkgfs.c
index 4f52b6bb6b9b5..8018edd60d579 100644
--- a/stand/libsa/pkgfs.c
+++ b/stand/libsa/pkgfs.c
@@ -60,7 +60,7 @@ struct fs_ops pkgfs_fsops = {
};
#define PKG_BUFSIZE 512
-#define PKG_MAXCACHESZ (16384 * 3)
+#define PKG_MAXCACHESZ (512 * 1024)
#define PKG_FILEEXT ".tgz"
diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h
index 09dfe842cf4e9..6da4966738b43 100644
--- a/stand/libsa/stand.h
+++ b/stand/libsa/stand.h
@@ -470,4 +470,7 @@ extern void *reallocf(void *, size_t);
*/
caddr_t ptov(uintptr_t);
+/* hexdump.c */
+void hexdump(caddr_t region, size_t len);
+
#endif /* STAND_H */
diff --git a/stand/libsa/zalloc_malloc.c b/stand/libsa/zalloc_malloc.c
index 98e28b8ef7f5a..215e07d34a845 100644
--- a/stand/libsa/zalloc_malloc.c
+++ b/stand/libsa/zalloc_malloc.c
@@ -52,6 +52,10 @@ void mallocstats(void);
static void *Malloc_align(size_t, size_t);
+#ifndef MIN
+# define MIN(a,b) ((a) <= (b)) ? (a) : (b)
+#endif
+
void *
Malloc(size_t bytes, const char *file __unused, int line __unused)
{
@@ -119,9 +123,14 @@ Free(void *ptr, const char *file, int line)
ptr, file, line);
return;
}
- if (res->ga_Magic != GAMAGIC)
+ if (res->ga_Magic != GAMAGIC) {
+ size_t dump_bytes;
+
+ dump_bytes = MIN((ptr - MallocPool.mp_Base), 512);
+ hexdump(ptr - dump_bytes, dump_bytes);
panic("free: guard1 fail @ %p from %s:%d",
ptr, file, line);
+ }
res->ga_Magic = GAFREE;
#endif
#ifdef USEENDGUARD