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,