svn commit: r364965 - in head/stand: common libsa

Simon J. Gerraty sjg at FreeBSD.org
Sat Aug 29 21:05:45 UTC 2020


Author: sjg
Date: Sat Aug 29 21:05:43 2020
New Revision: 364965
URL: https://svnweb.freebsd.org/changeset/base/364965

Log:
  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

Added:
  head/stand/libsa/hexdump.c   (contents, props changed)
     - copied, changed from r364346, head/stand/common/misc.c
Modified:
  head/stand/common/bootstrap.h
  head/stand/common/misc.c
  head/stand/libsa/Makefile
  head/stand/libsa/pkgfs.c
  head/stand/libsa/stand.h
  head/stand/libsa/zalloc_malloc.c

Modified: head/stand/common/bootstrap.h
==============================================================================
--- head/stand/common/bootstrap.h	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/common/bootstrap.h	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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);

Modified: head/stand/common/misc.c
==============================================================================
--- head/stand/common/misc.c	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/common/misc.c	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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)
 {

Modified: head/stand/libsa/Makefile
==============================================================================
--- head/stand/libsa/Makefile	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/libsa/Makefile	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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

Copied and modified: head/stand/libsa/hexdump.c (from r364346, head/stand/common/misc.c)
==============================================================================
--- head/stand/common/misc.c	Tue Aug 18 14:17:14 2020	(r364346, copy source)
+++ head/stand/libsa/hexdump.c	Sat Aug 29 21:05:43 2020	(r364965)
@@ -29,147 +29,8 @@ __FBSDID("$FreeBSD$");
 
 #include <string.h>
 #include <stand.h>
-#include <bootstrap.h>
 
 /*
- * Concatenate the (argc) elements of (argv) into a single string, and return
- * a copy of same.
- */
-char *
-unargv(int argc, char *argv[])
-{
-    size_t	hlong;
-    int		i;
-    char	*cp;
-
-    for (i = 0, hlong = 0; i < argc; i++)
-	hlong += strlen(argv[i]) + 2;
-
-    if(hlong == 0)
-	return(NULL);
-
-    cp = malloc(hlong);
-    cp[0] = 0;
-    for (i = 0; i < argc; i++) {
-	strcat(cp, argv[i]);
-	if (i < (argc - 1))
-	  strcat(cp, " ");
-    }
-	  
-    return(cp);
-}
-
-/*
- * Get the length of a string in kernel space
- */
-size_t
-strlenout(vm_offset_t src)
-{
-    char	c;
-    size_t	len;
-    
-    for (len = 0; ; len++) {
-	archsw.arch_copyout(src++, &c, 1);
-	if (c == 0)
-	    break;
-    }
-    return(len);
-}
-
-/*
- * Make a duplicate copy of a string in kernel space
- */
-char *
-strdupout(vm_offset_t str)
-{
-    char	*result, *cp;
-    
-    result = malloc(strlenout(str) + 1);
-    for (cp = result; ;cp++) {
-	archsw.arch_copyout(str++, cp, 1);
-	if (*cp == 0)
-	    break;
-    }
-    return(result);
-}
-
-/* Zero a region in kernel space. */
-void
-kern_bzero(vm_offset_t dest, size_t len)
-{
-	char buf[256];
-	size_t chunk, resid;
-
-	bzero(buf, sizeof(buf));
-	resid = len;
-	while (resid > 0) {
-		chunk = min(sizeof(buf), resid);
-		archsw.arch_copyin(buf, dest, chunk);
-		resid -= chunk;
-		dest += chunk;
-	}
-}
-
-/*
- * Read the specified part of a file to kernel space.  Unlike regular
- * pread, the file pointer is advanced to the end of the read data,
- * and it just returns 0 if successful.
- */
-int
-kern_pread(readin_handle_t fd, vm_offset_t dest, size_t len, off_t off)
-{
-
-	if (VECTX_LSEEK(fd, off, SEEK_SET) == -1) {
-#ifdef DEBUG
-		printf("\nlseek failed\n");
-#endif
-		return (-1);
-	}
-	if ((size_t)archsw.arch_readin(fd, dest, len) != len) {
-#ifdef DEBUG
-		printf("\nreadin failed\n");
-#endif
-		return (-1);
-	}
-	return (0);
-}
-
-/*
- * Read the specified part of a file to a malloced buffer.  The file
- * pointer is advanced to the end of the read data.
- */
-/* coverity[ -tainted_data_return ] */
-void *
-alloc_pread(readin_handle_t fd, off_t off, size_t len)
-{
-	void *buf;
-
-	buf = malloc(len);
-	if (buf == NULL) {
-#ifdef DEBUG
-		printf("\nmalloc(%d) failed\n", (int)len);
-#endif
-		errno = ENOMEM;
-		return (NULL);
-	}
-	if (VECTX_LSEEK(fd, off, SEEK_SET) == -1) {
-#ifdef DEBUG
-		printf("\nlseek failed\n");
-#endif
-		free(buf);
-		return (NULL);
-	}
-	if ((size_t)VECTX_READ(fd, buf, len) != len) {
-#ifdef DEBUG
-		printf("\nread failed\n");
-#endif
-		free(buf);
-		return (NULL);
-	}
-	return (buf);
-}
-
-/*
  * Display a region in traditional hexdump format.
  */
 void
@@ -177,10 +38,16 @@ hexdump(caddr_t region, size_t len)
 {
     caddr_t	line;
     int		x, c;
-    char	lbuf[80];
+#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);
 	
@@ -206,16 +73,7 @@ hexdump(caddr_t region, size_t len)
 	}
 	emit("|\n");
     }
+#ifdef HEXDUMP_PAGER
     pager_close();
-}
-
-void
-dev_cleanup(void)
-{
-    int		i;
-
-    /* Call cleanup routines */
-    for (i = 0; devsw[i] != NULL; ++i)
-	if (devsw[i]->dv_cleanup != NULL)
-	    (devsw[i]->dv_cleanup)();
+#endif
 }

Modified: head/stand/libsa/pkgfs.c
==============================================================================
--- head/stand/libsa/pkgfs.c	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/libsa/pkgfs.c	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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"
 

Modified: head/stand/libsa/stand.h
==============================================================================
--- head/stand/libsa/stand.h	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/libsa/stand.h	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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 */

Modified: head/stand/libsa/zalloc_malloc.c
==============================================================================
--- head/stand/libsa/zalloc_malloc.c	Sat Aug 29 19:26:31 2020	(r364964)
+++ head/stand/libsa/zalloc_malloc.c	Sat Aug 29 21:05:43 2020	(r364965)
@@ -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


More information about the svn-src-all mailing list