uevent: improve error checking and handling
Subsystems (8)
PATCH 1/2 uevent: improve error checking and handling
Subject: uevent: improve error checking and handling
From: Eric Rannaud <[email protected]>
add_uevent_var() is used w/o checking for its return value, even though it is possible for those calls to return -ENOMEM.
Signed-off-by Eric Rannaud <[email protected]>
---
drivers/base/core.c | 93 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 59 insertions(+), 34 deletions(-)
drivers/base/core.c +59 -34
@@ -162,18 +162,25 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp,/* add the major/minor if present */ if (MAJOR (dev->devt)) { -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"MAJOR=%u" ,MAJOR (dev->devt)); -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"MINOR=%u" ,MINOR (dev->devt)); + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"MAJOR=%u" ,MAJOR (dev->devt)); +if (retval) +return retval; + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"MINOR=%u" ,MINOR (dev->devt)); +if (retval) +return retval; } -if (dev->driver) -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"DRIVER=%s" , dev->driver->name); +if (dev->driver) { + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"DRIVER=%s" , dev->driver->name); +if (retval) +return retval; + }#ifdef CONFIG_SYSFS_DEPRECATED if (dev->class) {
@@ -186,29 +193,41 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp,const char *path; path =kobject_get_path (&parent->kobj,GFP_KERNEL ); -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"PHYSDEVPATH=%s" , path); + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVPATH=%s" , path);kfree (path); - -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"PHYSDEVBUS=%s" , parent->bus->name); - -if (parent->driver) -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVDRIVER=%s", parent->driver->name); +if (retval) +return retval; + + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVBUS=%s" , parent->bus->name); +if (retval) +return retval; + +if (parent->driver) { + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVDRIVER=%s" , parent->driver->name); +if (retval) +return retval; + } } }else if (dev->bus) { -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"PHYSDEVBUS=%s" , dev->bus->name); - -if (dev->driver) -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"PHYSDEVDRIVER=%s" , dev->driver->name); + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVBUS=%s" , dev->bus->name); +if (retval) +return retval; + +if (dev->driver) { + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVDRIVER=%s" , dev->driver->name); +if (retval) +return retval; + } }#endif
@@ -222,27 +241,33 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp,if (dev->bus && dev->bus->uevent) {/* have the bus specific function add its stuff */ retval = dev->bus->uevent (dev, envp, num_envp, buffer, buffer_size); -if (retval) +if (retval) {pr_debug ("%s: bus uevent() returned %d\n" , __FUNCTION__, retval); + goto out; + } }if (dev->class && dev->class->dev_uevent) {/* have the class specific function add its stuff */ retval = dev->class->dev_uevent (dev, envp, num_envp, buffer, buffer_size); -if (retval) +if (retval) {pr_debug ("%s: class uevent() returned %d\n" , __FUNCTION__, retval); + goto out; + } }if (dev->type && dev->type->uevent) {/* have the device type specific fuction add its stuff */ retval = dev->type->uevent (dev, envp, num_envp, buffer, buffer_size); -if (retval) +if (retval) {pr_debug ("%s: dev_type uevent() returned %d\n" , __FUNCTION__, retval); + goto out; + } } - +out:return retval; }
PATCH 2/2 uevent: use add_uevent_var() instead of open coding it
Subject: uevent: use add_uevent_var() instead of open coding it
From: Eric Rannaud <[email protected]>
Make use of add_uevent_var() instead of (often incorrectly) open coding it.
Signed-off-by Eric Rannaud <[email protected]>
---
drivers/amba/bus.c | 13 +++--- drivers/ieee1394/nodemgr.c | 14 +++---- drivers/mmc/mmc_sysfs.c | 27 +++++------- drivers/s390/crypto/ap_bus.c | 28 ++++++------- net/core/net-sysfs.c | 17 ++----- sound/aoa/soundbus/core.c | 79 ++++++++++++++--------------------- 6 files changed, 59 insertions(+), 106 deletions(-)
drivers/amba/bus.c +6 -7
@@ -47,14 +47,13 @@ static int amba_match(struct device *dev, struct device_driver *drv)static int amba_uevent (struct device *dev,char **envp,int nr_env,char *buf,int bufsz) {struct amba_device *pcdev =to_amba_device (dev); +int retval =0 , i =0 , len =0 ; -if (nr_env <2 ) -return -ENOMEM ; - -snprintf (buf, bufsz,"AMBA_ID=%08x" , pcdev->periphid); - *envp++ = buf; - *envp++ =NULL ; -return 0 ; + retval =add_uevent_var (envp, nr_env, &i, + buf, bufsize, &len, +"AMBA_ID=%08x" , pcdev->periphid); + envp[i] =NULL ; +return retval; }#else #define amba_uevent NULL
drivers/ieee1394/nodemgr.c +6 -8
@@ -1163,6 +1163,7 @@ static int nodemgr_uevent(struct class_device *cdev, char **envp, int num_envp,struct unit_directory *ud;int i =0 ;int length =0 ; +int retval =0 ;/* ieee1394:venNmoNspNverN */ char buf[8 +1 +3 +8 +2 +8 +2 +8 +3 +8 +1 ];
@@ -1176,14 +1177,11 @@ static int nodemgr_uevent(struct class_device *cdev, char **envp, int num_envp,#define PUT_ENVP (fmt,val) \ do { \ - int printed; \ - envp[i++] = buffer; \ - printed = snprintf(buffer, buffer_size - length, \ - fmt, val); \ - if ((buffer_size - (length+printed) <= 0) || (i >= num_envp)) \ - return -ENOMEM; \ - length += printed+1; \ - buffer += printed+1; \ + retval = add_uevent_var(envp, num_envp, &i, \ + buffer, buffer_size, &length, \ + fmt, val); \ + if (retval) \ + return retval; \ } while (0)PUT_ENVP ("VENDOR_ID=%06x" , ud->vendor_id);
drivers/mmc/mmc_sysfs.c +11 -16
@@ -86,31 +86,26 @@ mmc_bus_uevent(struct device *dev, char **envp, int num_envp, char *buf, {struct mmc_card *card =dev_to_mmc_card (dev);char ccc[13 ]; -int i =0 ; - -#define add_env (fmt,val) \ - ({ \ - int len, ret = -ENOMEM; \ - if (i < num_envp) { \ - envp[i++] = buf; \ - len = snprintf(buf, buf_size, fmt, val) + 1; \ - buf_size -= len; \ - buf += len; \ - if (buf_size >= 0) \ - ret = 0; \ - } \ - ret; \ - }) +int retval =0 , i =0 , length =0 ; + +#define add_env (fmt,val) do { \ + retval = add_uevent_var(envp, num_envp, &i, \ + buf, buf_size, &length, \ + fmt, val); \ + if (retval) \ + return retval; \ +} while (0);for (i =0 ; i <12 ; i++) ccc[i] = card->csd.cmdclass & (1 << i) ?'1' :'0' ; ccc[12 ] ='\0' ; - i =0 ;add_env ("MMC_CCC=%s" , ccc);add_env ("MMC_MANFID=%06x" , card->cid.manfid);add_env ("MMC_NAME=%s" ,mmc_card_name (card));add_env ("MMC_OEMID=%04x" , card->cid.oemid); +#undef add_env + envp[i] =NULL ;return 0 ; }
drivers/s390/crypto/ap_bus.c +13 -15
@@ -421,27 +421,25 @@ static int ap_uevent (struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size) {struct ap_device *ap_dev =to_ap_dev (dev); -int length; +int retval =0 , length =0 , i =0 ;if (!ap_dev)return -ENODEV ;/* Set up DEV_TYPE environment variable. */ - envp[0 ] = buffer; - length =scnprintf (buffer, buffer_size,"DEV_TYPE=%04X" , - ap_dev->device_type); -if (buffer_size - length <=0 ) -return -ENOMEM ; - buffer += length; - buffer_size -= length; + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"DEV_TYPE=%04X" , ap_dev->device_type); +if (retval) +return retval; +/* Add MODALIAS= */ - envp[1 ] = buffer; - length =scnprintf (buffer, buffer_size,"MODALIAS=ap:t%02X" , - ap_dev->device_type); -if (buffer_size - length <=0 ) -return -ENOMEM ; - envp[2 ] =NULL ; -return 0 ; + retval =add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"MODALIAS=ap:t%02X" , ap_dev->device_type); + + envp[i] =NULL ; +return retval; }static struct bus_type ap_bus_type = {
net/core/net-sysfs.c +5 -12
@@ -412,20 +412,13 @@ static int netdev_uevent(struct device *d, char **envp, int num_envp, char *buf, int size) { struct net_device *dev = to_net_dev(d); -int i =0 ; -int n; - -/* pass interface to uevent. */ - envp[i++] = buf; - n =snprintf (buf, size,"INTERFACE=%s" , dev->name) +1 ; - buf += n; - size -= n; - -if ((size <=0 ) || (i >= num_envp)) -return -ENOMEM ; +int retval =0 , len =0 , i =0 ; + retval =add_uevent_var (envp, num_envp, &i, + buf, size, &len, +"INTERFACE=%s" , dev->name); envp[i] =NULL ; -return 0 ; +return retval; }#endif
sound/aoa/soundbus/core.c +31 -48
103 lines not on this page · raw message