mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-14 22:32:30 +01: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 */
|
/* misc.c */
|
||||||
char *unargv(int argc, char *argv[]);
|
char *unargv(int argc, char *argv[]);
|
||||||
void hexdump(caddr_t region, size_t len);
|
|
||||||
size_t strlenout(vm_offset_t str);
|
size_t strlenout(vm_offset_t str);
|
||||||
char *strdupout(vm_offset_t str);
|
char *strdupout(vm_offset_t str);
|
||||||
void kern_bzero(vm_offset_t dest, size_t len);
|
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);
|
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
|
void
|
||||||
dev_cleanup(void)
|
dev_cleanup(void)
|
||||||
{
|
{
|
||||||
|
@ -13,8 +13,9 @@ LIBSA_CPUARCH?=${MACHINE_CPUARCH}
|
|||||||
LIB?= sa
|
LIB?= sa
|
||||||
|
|
||||||
# standalone components and stuff we have modified locally
|
# 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 \
|
SRCS+= gzguts.h zutil.h __main.c abort.c assert.c bcd.c environment.c \
|
||||||
globals.c pager.c panic.c printf.c strdup.c strerror.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
|
random.c sbrk.c twiddle.c zalloc.c zalloc_malloc.c
|
||||||
|
|
||||||
# private (pruned) versions of libc string functions
|
# 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_BUFSIZE 512
|
||||||
#define PKG_MAXCACHESZ (16384 * 3)
|
#define PKG_MAXCACHESZ (512 * 1024)
|
||||||
|
|
||||||
#define PKG_FILEEXT ".tgz"
|
#define PKG_FILEEXT ".tgz"
|
||||||
|
|
||||||
|
@ -470,4 +470,7 @@ extern void *reallocf(void *, size_t);
|
|||||||
*/
|
*/
|
||||||
caddr_t ptov(uintptr_t);
|
caddr_t ptov(uintptr_t);
|
||||||
|
|
||||||
|
/* hexdump.c */
|
||||||
|
void hexdump(caddr_t region, size_t len);
|
||||||
|
|
||||||
#endif /* STAND_H */
|
#endif /* STAND_H */
|
||||||
|
@ -52,6 +52,10 @@ void mallocstats(void);
|
|||||||
|
|
||||||
static void *Malloc_align(size_t, size_t);
|
static void *Malloc_align(size_t, size_t);
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
# define MIN(a,b) ((a) <= (b)) ? (a) : (b)
|
||||||
|
#endif
|
||||||
|
|
||||||
void *
|
void *
|
||||||
Malloc(size_t bytes, const char *file __unused, int line __unused)
|
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);
|
ptr, file, line);
|
||||||
return;
|
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",
|
panic("free: guard1 fail @ %p from %s:%d",
|
||||||
ptr, file, line);
|
ptr, file, line);
|
||||||
|
}
|
||||||
res->ga_Magic = GAFREE;
|
res->ga_Magic = GAFREE;
|
||||||
#endif
|
#endif
|
||||||
#ifdef USEENDGUARD
|
#ifdef USEENDGUARD
|
||||||
|
Loading…
Reference in New Issue
Block a user