From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Thu, 18 Dec 2003 02:27:50 +0000 Subject: Re: [udev] bug in udev-remove.c MIME-Version: 1 Content-Type: multipart/mixed; boundary="xHFwDpU9dbj6ez1V" Message-Id: List-Id: References: In-Reply-To: To: linux-hotplug@vger.kernel.org --xHFwDpU9dbj6ez1V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Dec 17, 2003 at 02:37:27PM -0800, Greg KH wrote: > On Wed, Dec 17, 2003 at 10:53:44PM +0100, Kay Sievers wrote: > > > > Uups, we have a bug in udev-remove.c. > > Ick, this was probably my fault from the merge with the dbus code, > sorry. Thanks for the patch, I've applied it. I've moved the malloc out of the udevdb into udev-remove to free the struct after use and not to allocate a different struct in the case the device is not in the data base. I seems a bit easier to read. thanks, Kay --xHFwDpU9dbj6ez1V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="01-free-data-in-udev-delete.diff" diff -Nru a/udev-remove.c b/udev-remove.c --- a/udev-remove.c Thu Dec 18 03:23:11 2003 +++ b/udev-remove.c Thu Dec 18 03:23:11 2003 @@ -119,18 +119,21 @@ int udev_remove_device(char *path, char *subsystem) { struct udevice *dev; - struct udevice device; char *temp; + int retval; - dev = udevdb_get_dev(path); - if (dev == NULL) { + dev = malloc(sizeof(*dev)); + if (dev == NULL) + return -ENOMEM; + memset(dev, 0, sizeof(*dev)); + + retval = udevdb_get_dev(path, dev); + if (retval) { dbg("'%s' not found in database, falling back on default name", path); temp = strrchr(path, '/'); if (temp == NULL) return -ENODEV; - memset(&device, 0, sizeof(device)); - dev = &device; - strncpy(device.name, &temp[1], sizeof(device.name)); + strncpy(dev->name, &temp[1], sizeof(dev->name)); } dbg("name is '%s'", dev->name); @@ -138,5 +141,7 @@ sysbus_send_remove(dev->name, path); - return delete_node(dev); + retval = delete_node(dev); + free(dev); + return retval; } diff -Nru a/udevdb.c b/udevdb.c --- a/udevdb.c Thu Dec 18 03:23:11 2003 +++ b/udevdb.c Thu Dec 18 03:23:11 2003 @@ -62,29 +62,22 @@ return tdb_store(udevdb, key, data, TDB_REPLACE); } -struct udevice *udevdb_get_dev(const char *path) +int udevdb_get_dev(const char *path, struct udevice *dev) { TDB_DATA key, data; - struct udevice *dev; if (path == NULL) - return NULL; + return -ENODEV; key.dptr = (void *)path; key.dsize = strlen(path) + 1; data = tdb_fetch(udevdb, key); if (data.dptr == NULL || data.dsize == 0) - return NULL; - - dev = malloc(sizeof(*dev)); - if (dev == NULL) - goto exit; + return -ENODEV; memcpy(dev, data.dptr, sizeof(*dev)); -exit: - free(data.dptr); - return dev; + return 0; } int udevdb_delete_dev(const char *path) diff -Nru a/udevdb.h b/udevdb.h --- a/udevdb.h Thu Dec 18 03:23:11 2003 +++ b/udevdb.h Thu Dec 18 03:23:11 2003 @@ -13,7 +13,7 @@ extern int udevdb_init(int init_flag); extern int udevdb_add_dev(const char *path, const struct udevice *dev); -extern struct udevice *udevdb_get_dev(const char *path); +extern int udevdb_get_dev(const char *path, struct udevice *dev); extern int udevdb_delete_dev(const char *path); #endif /* _UDEVDB_H_ */ --xHFwDpU9dbj6ez1V-- ------------------------------------------------------- This SF.net email is sponsored by: IBM Linux Tutorials. Become an expert in LINUX or just sharpen your skills. Sign up for IBM's Free Linux Tutorials. Learn everything from the bash shell to sys admin. Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel