Module Name:    src
Committed By:   mbalmer
Date:           Mon Nov 14 07:45:55 UTC 2011

Modified Files:
        src/sys/dev/gpio: gpio.c

Log Message:
Initialize ga.ga_dvname in gpio_search to prevent a stack fault in config_match


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/gpio/gpio.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/dev/gpio/gpio.c
diff -u src/sys/dev/gpio/gpio.c:1.48 src/sys/dev/gpio/gpio.c:1.49
--- src/sys/dev/gpio/gpio.c:1.48	Sun Nov 13 14:02:01 2011
+++ src/sys/dev/gpio/gpio.c	Mon Nov 14 07:45:54 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: gpio.c,v 1.48 2011/11/13 14:02:01 mbalmer Exp $ */
+/* $NetBSD: gpio.c,v 1.49 2011/11/14 07:45:54 mbalmer Exp $ */
 /*	$OpenBSD: gpio.c,v 1.6 2006/01/14 12:33:49 grange Exp $	*/
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.48 2011/11/13 14:02:01 mbalmer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.49 2011/11/14 07:45:54 mbalmer Exp $");
 
 /*
  * General Purpose Input/Output framework.
@@ -243,15 +243,21 @@ static int
 gpio_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
 {
 	struct gpio_attach_args ga;
+	size_t namlen;
 
 	ga.ga_gpio = aux;
 	ga.ga_offset = cf->cf_loc[GPIOCF_OFFSET];
 	ga.ga_mask = cf->cf_loc[GPIOCF_MASK];
 	ga.ga_flags = cf->cf_loc[GPIOCF_FLAG];
+	namlen = strlen(cf->cf_name) + 1;
+	ga.ga_dvname = kmem_alloc(namlen, KM_NOSLEEP);
+	if (ga.ga_dvname == NULL)
+		return 0;
+	strcpy(ga.ga_dvname, cf->cf_name);
 
 	if (config_match(parent, cf, &ga) > 0)
 		config_attach(parent, cf, &ga, gpio_print);
-
+	kmem_free(ga.ga_dvname, namlen);
 	return 0;
 }
 

Reply via email to