From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Mon, 16 May 2022 09:56:27 +0200 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nqVad-00FKiY-M4 for lore@lore.pengutronix.de; Mon, 16 May 2022 09:56:27 +0200 Received: from localhost ([127.0.0.1] helo=metis.ext.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1nqVac-00077j-4k; Mon, 16 May 2022 09:56:26 +0200 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nqVaZ-00077V-8a; Mon, 16 May 2022 09:56:23 +0200 Received: from mol by ptx.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1nqVaY-0000Ns-WE; Mon, 16 May 2022 09:56:23 +0200 Date: Mon, 16 May 2022 09:56:22 +0200 From: Michael Olbrich To: Roland Hieber Message-ID: <20220516075622.GC17580@pengutronix.de> Mail-Followup-To: Roland Hieber , oss-tools@pengutronix.de References: <20220511082125.4187531-1-m.olbrich@pengutronix.de> <20220511082125.4187531-3-m.olbrich@pengutronix.de> <20220515204055.lwdfnjegiapbzc3m@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220515204055.lwdfnjegiapbzc3m@pengutronix.de> X-Sent-From: Pengutronix Hildesheim X-URL: http://www.pengutronix.de/ X-IRC: #ptxdist @freenode X-Accept-Language: de,en X-Accept-Content-Type: text/plain X-Uptime: 09:15:24 up 46 days, 19:45, 76 users, load average: 0.10, 0.31, 0.26 User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [OSS-Tools] [PATCH v4 2/3] libdt: add support for barebox, storage-by-uuid X-BeenThere: oss-tools@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: Pengutronix Public Open-Source-Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: oss-tools@pengutronix.de Sender: "OSS-Tools" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: oss-tools-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false On Sun, May 15, 2022 at 10:40:55PM +0200, Roland Hieber wrote: > On Wed, May 11, 2022 at 10:21:24AM +0200, Michael Olbrich wrote: > > Signed-off-by: Michael Olbrich > > --- > > > > changes in v3: > > uuid comparison fixed: > > - compare the correct uuids > > - don't crash when no uuid is present > > > > changes in v4: > > use strcasecmp() to make the uuid check case insensitive. > > > > src/libdt.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++---- > > 1 file changed, 69 insertions(+), 5 deletions(-) > > > > diff --git a/src/libdt.c b/src/libdt.c > > index 48c31931e8a1..4076d9a2f4a3 100644 > > --- a/src/libdt.c > > +++ b/src/libdt.c > > @@ -2358,6 +2358,52 @@ out: > > return dev; > > } > > > > +static struct udev_device *of_find_device_by_uuid(const char *uuid) > > +{ > > + struct udev *udev; > > + struct udev_enumerate *enumerate; > > + struct udev_list_entry *devices, *dev_list_entry; > > + int ret = 0; > > + > > + udev = udev_new(); > > According to the udev docs, I think this should be udev_unref()ed > somewhere, see for example in of_find_mtd_device() above. > > Hmm… looking through the existing code there are more places which could > profit from an udev_unref()… That's not possible: The returned udev_device keeps a pointer udev but has not refcount :-/. So destroying the udev struct is probably not save until all udev devices are destroyed. > > + if (!udev) { > > + fprintf(stderr, "Can't create udev\n"); > > + return NULL; > > + } > > + > > + enumerate = udev_enumerate_new(udev); > > + udev_enumerate_add_match_subsystem(enumerate, "block"); > > + udev_enumerate_scan_devices(enumerate); > > + devices = udev_enumerate_get_list_entry(enumerate); > > + udev_list_entry_foreach(dev_list_entry, devices) { > > + const char *path, *devtype, *outpath, *dev_uuid; > > + struct udev_device *device; > > + > > + path = udev_list_entry_get_name(dev_list_entry); > > + device = udev_device_new_from_syspath(udev, path); > > + > > Same for a udev_device_unref(), somewhere…? Well, one device is returned so I could only unref those that don't match. And the returned on leaks as well (that's not new. It already happens in with the existing code). And I just copied this loop form existing code and modified. So if you really want to fix all memory leaks then that's a lot more work. And I have neither the time to do it nor can I actually test all the other code. Michael > > + /* distinguish device (disk) from partitions */ > > + devtype = udev_device_get_devtype(device); > > + if (!devtype) > > + continue; > > + if (!strcmp(devtype, "disk")) { > > + dev_uuid = udev_device_get_property_value(device, "ID_PART_TABLE_UUID"); > > + if (dev_uuid && !strcasecmp(dev_uuid, uuid)) { > > + outpath = udev_device_get_devnode(device); > > + return device; > > + } > > + } else if (!strcmp(devtype, "partition")) { > > + dev_uuid = udev_device_get_property_value(device, "ID_PART_ENTRY_UUID"); > > + if (dev_uuid && !strcasecmp(dev_uuid, uuid)) { > > + outpath = udev_device_get_devnode(device); > > + return device; > > + } > > + } > > + > > + } > > + return NULL; > > +} > > + > > /* > > * of_get_devicepath - get information how to access device corresponding to a device_node > > * @partition_node: The device_node which shall be accessed > > @@ -2443,11 +2489,29 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t > > if (!strcmp(node->name, "partitions")) > > node = node->parent; > > > > - dev = of_find_device_by_node_path(node->full_name); > > - if (!dev) { > > - fprintf(stderr, "%s: cannot find device from node %s\n", __func__, > > - node->full_name); > > - return -ENODEV; > > + if (of_device_is_compatible(node, "barebox,storage-by-uuid")) { > > + const char *uuid; > > + > > + ret = of_property_read_string(node, "uuid", &uuid); > > + if (ret) { > > + fprintf(stderr, "%s: missing uuid property for %s\n", __func__, > > + node->full_name); > > + return -ENODEV; > > + } > > + dev = of_find_device_by_uuid(uuid); > > + if (!dev) { > > + fprintf(stderr, "%s: cannot find device for uuid %s\n", __func__, > > + uuid); > > + return -ENODEV; > > + } > > + } > > + else { > > + dev = of_find_device_by_node_path(node->full_name); > > + if (!dev) { > > + fprintf(stderr, "%s: cannot find device from node %s\n", __func__, > > + node->full_name); > > + return -ENODEV; > > + } > > } > > > > mtd = of_find_mtd_device(dev); > > -- > > 2.30.2 > > > > > > > > -- > Roland Hieber, Pengutronix e.K. | r.hieber@pengutronix.de | > Steuerwalder Str. 21 | https://www.pengutronix.de/ | > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |