Module Name: src Committed By: mlelstv Date: Sat Mar 5 07:33:59 UTC 2016
Modified Files: src/sys/arch/evbarm/evbarm: autoconf.c Log Message: Don't modify command line buffer but create a copy of the root argument. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/evbarm/evbarm/autoconf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbarm/evbarm/autoconf.c diff -u src/sys/arch/evbarm/evbarm/autoconf.c:1.18 src/sys/arch/evbarm/evbarm/autoconf.c:1.19 --- src/sys/arch/evbarm/evbarm/autoconf.c:1.18 Sat Nov 22 11:10:22 2014 +++ src/sys/arch/evbarm/evbarm/autoconf.c Sat Mar 5 07:33:58 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.18 2014/11/22 11:10:22 mlelstv Exp $ */ +/* $NetBSD: autoconf.c,v 1.19 2016/03/05 07:33:58 mlelstv Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.18 2014/11/22 11:10:22 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.19 2016/03/05 07:33:58 mlelstv Exp $"); #include "opt_md.h" @@ -41,7 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v #include <sys/device.h> #include <sys/conf.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <machine/autoconf.h> #include <machine/intr.h> @@ -95,10 +95,14 @@ get_device(char *name, device_t *dvp, in /* Set the rootdev variable from the root specifier in the boot args */ +static char *bootspec_buf = NULL; +static size_t bootspec_buflen = 0; + static void set_root_device(void) { - char *ptr, *end; + char *ptr, *end, *buf; + size_t len; if (boot_args == NULL) return; @@ -112,12 +116,26 @@ set_root_device(void) /* NUL-terminate string, get_bootconf_option doesn't */ for (end=ptr; *end != '\0'; ++end) { if (*end == ' ' || *end == '\t') { - *end = '\0'; break; } } - bootspec = ptr; + if (end == ptr) + return; + + len = end - ptr; + + buf = kmem_alloc(len + 1, KM_SLEEP); + memcpy(buf, ptr, len); + buf[len] = '\0'; + + if (bootspec_buf != NULL) + kmem_free(bootspec_buf, bootspec_buflen + 1); + + bootspec_buf = buf; + bootspec_buflen = len; + + bootspec = bootspec_buf; } #endif