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,