Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/savecore Avoid overflows when reading strings.
details: https://anonhg.NetBSD.org/src/rev/9ac986ac2efb
branches: trunk
changeset: 970763:9ac986ac2efb
user: maxv <maxv%NetBSD.org@localhost>
date: Fri Apr 03 19:09:43 2020 +0000
description:
Avoid overflows when reading strings.
diffstat:
sbin/savecore/savecore.c | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diffs (61 lines):
diff -r bcd5e6d4e01c -r 9ac986ac2efb sbin/savecore/savecore.c
--- a/sbin/savecore/savecore.c Fri Apr 03 18:44:50 2020 +0000
+++ b/sbin/savecore/savecore.c Fri Apr 03 19:09:43 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: savecore.c,v 1.89 2019/11/06 07:29:08 mrg Exp $ */
+/* $NetBSD: savecore.c,v 1.90 2020/04/03 19:09:43 maxv Exp $ */
/*-
* Copyright (c) 1986, 1992, 1993
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)savecore.c 8.5 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: savecore.c,v 1.89 2019/11/06 07:29:08 mrg Exp $");
+__RCSID("$NetBSD: savecore.c,v 1.90 2020/04/03 19:09:43 maxv Exp $");
#endif
#endif /* not lint */
@@ -275,6 +275,20 @@
}
static void
+read_string(kvm_t *kd, u_long kva, char *buf, size_t size)
+{
+ size_t i;
+
+ for (i = 0; i < size - 1; i++) {
+ (void)kvm_read(kd, kva + i, buf + i, 1);
+ if (buf[i] == '\0')
+ return;
+ }
+
+ buf[size - 1] = '\0';
+}
+
+static void
kmem_setup(int verbose)
{
long l_dumplo;
@@ -331,9 +345,8 @@
(long long)dumplo, (long)(dumplo / DEV_BSIZE), (long)DEV_BSIZE);
KREAD_LOGWARN(kd_kern, current_nl[X_DUMPMAG].n_value, dumpmag, exit(1));
- (void)kvm_read(kd_kern, current_nl[X_VERSION].n_value, vers,
+ read_string(kd_kern, current_nl[X_VERSION].n_value, vers,
sizeof(vers));
- vers[sizeof(vers) - 1] = '\0';
if (current_nl[X_DUMPCDEV].n_value != 0) {
KREAD_LOGWARN(kd_kern, current_nl[X_DUMPCDEV].n_value, dumpcdev,
@@ -395,9 +408,8 @@
long panicloc, panicstart, panicend;
char core_vers[1024];
- (void)kvm_read(kd_dump, dump_nl[X_VERSION].n_value, core_vers,
+ read_string(kd_dump, dump_nl[X_VERSION].n_value, core_vers,
sizeof(core_vers));
- core_vers[sizeof(core_vers) - 1] = '\0';
if (strcmp(vers, core_vers) != 0)
syslog(LOG_WARNING,
Home |
Main Index |
Thread Index |
Old Index