Module Name:    src
Committed By:   mbalmer
Date:           Sun Aug 23 12:08:57 UTC 2009

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

Log Message:
Prevent the creation of duplicate pin names in GPIOPINSET.
Problem noticed by rmind a while ago.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 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.27 src/sys/dev/gpio/gpio.c:1.28
--- src/sys/dev/gpio/gpio.c:1.27	Fri Aug 21 12:53:42 2009
+++ src/sys/dev/gpio/gpio.c	Sun Aug 23 12:08:56 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: gpio.c,v 1.27 2009/08/21 12:53:42 mbalmer Exp $ */
+/* $NetBSD: gpio.c,v 1.28 2009/08/23 12:08:56 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.27 2009/08/21 12:53:42 mbalmer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.28 2009/08/23 12:08:56 mbalmer Exp $");
 
 /*
  * General Purpose Input/Output framework.
@@ -390,7 +390,7 @@
 	cfdata_t cf;
 	kauth_cred_t cred;
 	int locs[GPIOCF_NLOCS];
-	int pin, value, flags, npins, found;
+	int pin, value, flags, npins;
 
 	sc = device_lookup_private(&gpio_cd, minor(dev));
 	gc = sc->sc_gc;
@@ -591,17 +591,21 @@
 		}
 
 		/* rename pin or new pin? */
-		/* XXX avoid the creation of duplicates */
 		if (set->gp_name2[0] != '\0') {
-			found = 0;
-			LIST_FOREACH(nm, &sc->sc_names, gp_next)
-				if (nm->gp_pin == pin) {
-					strlcpy(nm->gp_name, set->gp_name2,
-					    sizeof(nm->gp_name));
-					found = 1;
-					break;
-				}
-			if (!found) {
+			struct gpio_name *gnm;
+
+			gnm = NULL;
+			LIST_FOREACH(nm, &sc->sc_names, gp_next) {
+				if (!strcmp(nm->gp_name, set->gp_name2) &&
+				    nm->gp_pin != pin)
+					return EINVAL;	/* duplicate name */
+				if (nm->gp_pin == pin)
+					gnm = nm;
+			}
+			if (gnm != NULL)
+				strlcpy(gnm->gp_name, set->gp_name2,
+				    sizeof(gnm->gp_name));
+			else  {
 				nm = kmem_alloc(sizeof(struct gpio_name),
 				    KM_SLEEP);
 				strlcpy(nm->gp_name, set->gp_name2,

Reply via email to