On Tue, 27 Mar 2012 12:48:55 +0200, Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx> wrote:
+static ssize_t functionfs_user_functions_show(struct device *_dev, + struct device_attribute *attr, + char *buf) +{ + struct android_dev *dev = _android_dev; + char *buff = buf; + int i; + + mutex_lock(&dev->mutex); + + for (i = 0; i < dev->max_func_num; i++) + buff += sprintf(buff, "%s,", dev->ffs_tab[i].name);
buff += snprintf(buff, buf + PAGE_SIZE - buff, "%s,", dev->ffs_tab[i].name);
+ + mutex_unlock(&dev->mutex); + + if (buff != buf) + *(buff - 1) = '\n'; + return buff - buf; +} + +static ssize_t functionfs_user_functions_store(struct device *_dev, + struct device_attribute *attr, + const char *buff, size_t size) +{ + struct android_dev *dev = _android_dev; + char *name, *b; + + strncpy(func_names_buf, buff, sizeof(func_names_buf));
This dose not necessarily include terminating NUL byte. You should use strlcpy().
+ b = strim(func_names_buf);
Here you are overwriting existing names with (possibly) garbage. The func_names_buf should be dynamically allocated rather then a static array used to store names.
+ + mutex_lock(&dev->mutex); + + if (dev->enabled) { + mutex_unlock(&dev->mutex); + return -EBUSY; + } + + while (b) { + name = strsep(&b, ","); + if (name) {
strsep() always returns non-NULL (if b is not NULL).
+ dev->ffs_tab[dev->max_func_num++].name = name;
kstrdup().
+ if (dev->max_func_num == GFS_MAX_DEVS) + break; + } + } + mutex_unlock(&dev->mutex); + return size;
Since this adds new functions, how about just letting user specify a single function at a time? Ie. instead of: echo foo,bar >/sys/... one would have to do: echo foo >/sys/...; echo bar >/sys/... This would make this function simpler.
+}
-- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michał “mina86” Nazarewicz (o o) ooo +----<email/xmpp: mpn@xxxxxxxxxx>--------------ooO--(_)--Ooo-- -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html