mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-01 08:27:59 +00:00
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:
parent
5d4bf0578f
commit
ed19b7c525
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=364965
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
79
stand/libsa/hexdump.c
Normal 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
|
||||
}
|
@ -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"
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user