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
This commit is contained in:
Simon J. Gerraty 2020-08-29 21:05:43 +00:00
parent 5d4bf0578f
commit ed19b7c525
7 changed files with 96 additions and 45 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -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

79
stand/libsa/hexdump.c Normal file
View File

@ -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
}

View File

@ -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"

View File

@ -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 */

View File

@ -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