Module Name: src Committed By: jdolecek Date: Tue Apr 7 11:47:06 UTC 2020
Modified Files: src/sys/arch/xen/include: xenbus.h src/sys/arch/xen/xen: if_xennet_xenbus.c pciback.c shutdown_xenbus.c xbd_xenbus.c xbdback_xenbus.c xennetback_xenbus.c xpci_xenbus.c src/sys/arch/xen/xenbus: xenbus_probe.c xenbus_xs.c Log Message: change xenbus_read() interface so that caller supplies the buffer and it's size, caller doesn't free(9) the returned value any more To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/xen/include/xenbus.h cvs rdiff -u -r1.108 -r1.109 src/sys/arch/xen/xen/if_xennet_xenbus.c cvs rdiff -u -r1.20 -r1.21 src/sys/arch/xen/xen/pciback.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/xen/xen/shutdown_xenbus.c cvs rdiff -u -r1.96 -r1.97 src/sys/arch/xen/xen/xbd_xenbus.c cvs rdiff -u -r1.74 -r1.75 src/sys/arch/xen/xen/xbdback_xenbus.c cvs rdiff -u -r1.93 -r1.94 src/sys/arch/xen/xen/xennetback_xenbus.c cvs rdiff -u -r1.22 -r1.23 src/sys/arch/xen/xen/xpci_xenbus.c cvs rdiff -u -r1.41 -r1.42 src/sys/arch/xen/xenbus/xenbus_probe.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/xen/xenbus/xenbus_xs.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/arch/xen/include/xenbus.h diff -u src/sys/arch/xen/include/xenbus.h:1.15 src/sys/arch/xen/include/xenbus.h:1.16 --- src/sys/arch/xen/include/xenbus.h:1.15 Tue Apr 7 09:18:00 2020 +++ src/sys/arch/xen/include/xenbus.h Tue Apr 7 11:47:05 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xenbus.h,v 1.15 2020/04/07 09:18:00 jdolecek Exp $ */ +/* $NetBSD: xenbus.h,v 1.16 2020/04/07 11:47:05 jdolecek Exp $ */ /****************************************************************************** * xenbus.h * @@ -78,7 +78,7 @@ typedef enum { struct xenbus_device { SLIST_ENTRY(xenbus_device) xbusd_entries; - char *xbusd_otherend; /* the otherend path */ + char xbusd_otherend[64]; /* the otherend path (size arbitrary) */ int xbusd_otherend_id; /* the otherend's id */ /* callback for otherend change */ void (*xbusd_otherend_changed)(void *, XenbusState); @@ -118,9 +118,8 @@ struct xenbus_transaction; int xenbus_directory(struct xenbus_transaction *t, const char *dir, const char *node, unsigned int *num, char ***); -int xenbus_read(struct xenbus_transaction *t, - const char *dir, const char *node, unsigned int *len, - char **); +int xenbus_read(struct xenbus_transaction *, + const char *, const char *, char *, size_t); int xenbus_read_ul(struct xenbus_transaction *, const char *, const char *, unsigned long *, int); int xenbus_read_ull(struct xenbus_transaction *, @@ -135,20 +134,11 @@ int xenbus_rm(struct xenbus_transaction struct xenbus_transaction *xenbus_transaction_start(void); int xenbus_transaction_end(struct xenbus_transaction *t, int abort); -/* Single read and scanf: returns -errno or num scanned if > 0. */ -int xenbus_scanf(struct xenbus_transaction *t, - const char *dir, const char *node, const char *fmt, ...) - __attribute__((format(scanf, 4, 5))); - /* Single printf and write: returns -errno or 0. */ int xenbus_printf(struct xenbus_transaction *t, const char *dir, const char *node, const char *fmt, ...) __attribute__((format(printf, 4, 5))); -/* Generic read function: NULL-terminated triples of name, - * sprintf-style type string, and pointer. Returns 0 or errno.*/ -int xenbus_gather(struct xenbus_transaction *t, const char *dir, ...); - /* notifer routines for when the xenstore comes up */ // XXX int register_xenstore_notifier(struct notifier_block *nb); // XXX void unregister_xenstore_notifier(struct notifier_block *nb); Index: src/sys/arch/xen/xen/if_xennet_xenbus.c diff -u src/sys/arch/xen/xen/if_xennet_xenbus.c:1.108 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.109 --- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.108 Mon Apr 6 19:58:09 2020 +++ src/sys/arch/xen/xen/if_xennet_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xennet_xenbus.c,v 1.108 2020/04/06 19:58:09 jdolecek Exp $ */ +/* $NetBSD: if_xennet_xenbus.c,v 1.109 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.108 2020/04/06 19:58:09 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.109 2020/04/07 11:47:06 jdolecek Exp $"); #include "opt_xen.h" #include "opt_nfs_boot.h" @@ -268,9 +268,10 @@ xennet_xenbus_attach(device_t parent, de netif_tx_sring_t *tx_ring; netif_rx_sring_t *rx_ring; RING_IDX i; - char *val, *e, *p; + char *e, *p; unsigned long uval; extern int ifqmaxlen; /* XXX */ + char mac[32]; #ifdef XENNET_DEBUG char **dir; int dir_n = 0; @@ -280,28 +281,6 @@ xennet_xenbus_attach(device_t parent, de aprint_normal(": Xen Virtual Network Interface\n"); sc->sc_dev = self; -#ifdef XENNET_DEBUG - printf("path: %s\n", xa->xa_xbusd->xbusd_path); - snprintf(id_str, sizeof(id_str), "%d", xa->xa_id); - err = xenbus_directory(NULL, "device/vif", id_str, &dir_n, &dir); - if (err) { - aprint_error_dev(self, "xenbus_directory err %d\n", err); - } else { - printf("%s/\n", xa->xa_xbusd->xbusd_path); - for (i = 0; i < dir_n; i++) { - printf("\t/%s", dir[i]); - err = xenbus_read(NULL, xa->xa_xbusd->xbusd_path, - dir[i], NULL, &val); - if (err) { - aprint_error_dev(self, "xenbus_read err %d\n", - err); - } else { - printf(" = %s\n", val); - free(val, M_DEVBUF); - } - } - } -#endif /* XENNET_DEBUG */ sc->sc_xbusd = xa->xa_xbusd; sc->sc_xbusd->xbusd_otherend_changed = xennet_backend_changed; @@ -340,22 +319,21 @@ xennet_xenbus_attach(device_t parent, de } /* read mac address */ - err = xenbus_read(NULL, sc->sc_xbusd->xbusd_path, "mac", NULL, &val); + err = xenbus_read(NULL, sc->sc_xbusd->xbusd_path, "mac", + mac, sizeof(mac)); if (err) { aprint_error_dev(self, "can't read mac address, err %d\n", err); return; } - for (i = 0, p = val; i < 6; i++) { + for (i = 0, p = mac; i < ETHER_ADDR_LEN; i++) { sc->sc_enaddr[i] = strtoul(p, &e, 16); if ((e[0] == '\0' && i != 5) && e[0] != ':') { aprint_error_dev(self, - "%s is not a valid mac address\n", val); - free(val, M_DEVBUF); + "%s is not a valid mac address\n", mac); return; } p = &e[1]; } - free(val, M_DEVBUF); aprint_normal_dev(self, "MAC address %s\n", ether_sprintf(sc->sc_enaddr)); Index: src/sys/arch/xen/xen/pciback.c diff -u src/sys/arch/xen/xen/pciback.c:1.20 src/sys/arch/xen/xen/pciback.c:1.21 --- src/sys/arch/xen/xen/pciback.c:1.20 Tue Apr 7 08:14:42 2020 +++ src/sys/arch/xen/xen/pciback.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pciback.c,v 1.20 2020/04/07 08:14:42 jdolecek Exp $ */ +/* $NetBSD: pciback.c,v 1.21 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2009 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.20 2020/04/07 08:14:42 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.21 2020/04/07 11:47:06 jdolecek Exp $"); #include "opt_xen.h" @@ -35,7 +35,6 @@ __KERNEL_RCSID(0, "$NetBSD: pciback.c,v #include <sys/param.h> #include <sys/systm.h> #include <sys/errno.h> -#include <sys/malloc.h> #include <sys/kernel.h> #include <sys/bus.h> #include <sys/queue.h> @@ -450,7 +449,6 @@ pciback_xenbus_create(struct xenbus_devi { struct pb_xenbus_instance *pbxi; long domid; - char *val; char path[10]; int i, err; u_long num_devs; @@ -493,15 +491,15 @@ pciback_xenbus_create(struct xenbus_devi goto fail; } for (i = 0; i < num_devs; i++) { + char dev[64]; snprintf(path, sizeof(path), "dev-%d", i); if ((err = xenbus_read(NULL, xbusd->xbusd_path, path, - NULL, &val)) != 0) { + dev, sizeof(dev))) != 0) { aprint_error("pciback: can' read %s/%s: %d\n", xbusd->xbusd_path, path, err); goto fail; } - pciback_xenbus_export_device(pbxi, val); - free(val, M_DEVBUF); + pciback_xenbus_export_device(pbxi, dev); } pciback_xenbus_export_roots(pbxi); if ((err = xenbus_switch_state(xbusd, NULL, XenbusStateInitialised))) { Index: src/sys/arch/xen/xen/shutdown_xenbus.c diff -u src/sys/arch/xen/xen/shutdown_xenbus.c:1.7 src/sys/arch/xen/xen/shutdown_xenbus.c:1.8 --- src/sys/arch/xen/xen/shutdown_xenbus.c:1.7 Tue Sep 20 00:12:24 2011 +++ src/sys/arch/xen/xen/shutdown_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $Id: shutdown_xenbus.c,v 1.7 2011/09/20 00:12:24 jym Exp $ */ +/* $Id: shutdown_xenbus.c,v 1.8 2020/04/07 11:47:06 jdolecek Exp $ */ /*- * Copyright (c)2006 YAMAMOTO Takashi, @@ -56,10 +56,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: shutdown_xenbus.c,v 1.7 2011/09/20 00:12:24 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: shutdown_xenbus.c,v 1.8 2020/04/07 11:47:06 jdolecek Exp $"); #include <sys/param.h> -#include <sys/malloc.h> #include <dev/sysmon/sysmonvar.h> @@ -89,8 +88,7 @@ xenbus_shutdown_handler(struct xenbus_wa struct xenbus_transaction *xbt; int error; - char *reqstr; - unsigned int reqstrlen; + char reqstr[32]; again: xbt = xenbus_transaction_start(); @@ -98,7 +96,7 @@ again: return; } error = xenbus_read(xbt, SHUTDOWN_PATH, SHUTDOWN_NAME, - &reqstrlen, &reqstr); + reqstr, sizeof(reqstr)); if (error) { if (error != ENOENT) { printf("%s: xenbus_read %d\n", __func__, error); @@ -110,14 +108,13 @@ again: } return; } - KASSERT(strlen(reqstr) == reqstrlen); + error = xenbus_rm(xbt, SHUTDOWN_PATH, SHUTDOWN_NAME); if (error) { printf("%s: xenbus_rm %d\n", __func__, error); } error = xenbus_transaction_end(xbt, 0); if (error == EAGAIN) { - free(reqstr, M_DEVBUF); goto again; } if (error != 0) { @@ -135,7 +132,6 @@ again: } else { printf("ignore shutdown request: %s\n", reqstr); } - free(reqstr, M_DEVBUF); } static struct xenbus_watch xenbus_shutdown_watch = { Index: src/sys/arch/xen/xen/xbd_xenbus.c diff -u src/sys/arch/xen/xen/xbd_xenbus.c:1.96 src/sys/arch/xen/xen/xbd_xenbus.c:1.97 --- src/sys/arch/xen/xen/xbd_xenbus.c:1.96 Fri Mar 13 00:32:05 2020 +++ src/sys/arch/xen/xen/xbd_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xbd_xenbus.c,v 1.96 2020/03/13 00:32:05 jdolecek Exp $ */ +/* $NetBSD: xbd_xenbus.c,v 1.97 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.96 2020/03/13 00:32:05 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.97 2020/04/07 11:47:06 jdolecek Exp $"); #include "opt_xen.h" @@ -261,28 +261,6 @@ xbd_xenbus_attach(device_t parent, devic dk_init(&sc->sc_dksc, self, DKTYPE_ESDI); disk_init(&sc->sc_dksc.sc_dkdev, device_xname(self), &xbddkdriver); -#ifdef XBD_DEBUG - printf("path: %s\n", xa->xa_xbusd->xbusd_path); - snprintf(id_str, sizeof(id_str), "%d", xa->xa_id); - err = xenbus_directory(NULL, "device/vbd", id_str, &dir_n, &dir); - if (err) { - aprint_error_dev(self, "xenbus_directory err %d\n", err); - } else { - printf("%s/\n", xa->xa_xbusd->xbusd_path); - for (i = 0; i < dir_n; i++) { - printf("\t/%s", dir[i]); - err = xenbus_read(NULL, xa->xa_xbusd->xbusd_path, - dir[i], NULL, &val); - if (err) { - aprint_error_dev(self, "xenbus_read err %d\n", - err); - } else { - printf(" = %s\n", val); - free(val, M_DEVBUF); - } - } - } -#endif /* XBD_DEBUG */ sc->sc_xbusd = xa->xa_xbusd; sc->sc_xbusd->xbusd_otherend_changed = xbd_backend_changed; Index: src/sys/arch/xen/xen/xbdback_xenbus.c diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.74 src/sys/arch/xen/xen/xbdback_xenbus.c:1.75 --- src/sys/arch/xen/xen/xbdback_xenbus.c:1.74 Tue Apr 7 09:18:00 2020 +++ src/sys/arch/xen/xen/xbdback_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xbdback_xenbus.c,v 1.74 2020/04/07 09:18:00 jdolecek Exp $ */ +/* $NetBSD: xbdback_xenbus.c,v 1.75 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.74 2020/04/07 09:18:00 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.75 2020/04/07 11:47:06 jdolecek Exp $"); #include <sys/atomic.h> #include <sys/buf.h> @@ -39,7 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: xbdback_xenb #include <sys/kernel.h> #include <sys/kmem.h> #include <sys/kthread.h> -#include <sys/malloc.h> #include <sys/mutex.h> #include <sys/param.h> #include <sys/queue.h> @@ -529,12 +528,12 @@ xbdback_xenbus_destroy(void *arg) static int xbdback_connect(struct xbdback_instance *xbdi) { - int len, err; + int err; struct gnttab_map_grant_ref grop; struct gnttab_unmap_grant_ref ungrop; evtchn_op_t evop; u_long ring_ref, revtchn; - char *xsproto; + char xsproto[32]; const char *proto; struct xenbus_device *xbusd = xbdi->xbdi_xbusd; @@ -557,7 +556,7 @@ xbdback_connect(struct xbdback_instance } XENPRINTF(("xbdback %s: connect revtchn %lu\n", xbusd->xbusd_path, revtchn)); err = xenbus_read(NULL, xbusd->xbusd_otherend, "protocol", - &len, &xsproto); + xsproto, sizeof(xsproto)); if (err) { xbdi->xbdi_proto = XBDIP_NATIVE; proto = "unspecified"; @@ -576,10 +575,8 @@ xbdback_connect(struct xbdback_instance } else { aprint_error("xbd domain %d: unknown proto %s\n", xbdi->xbdi_domid, xsproto); - free(xsproto, M_DEVBUF); return -1; } - free(xsproto, M_DEVBUF); } /* allocate VA space and map rings */ @@ -744,7 +741,7 @@ xbdback_backend_changed(struct xenbus_wa struct xbdback_instance *xbdi = xbusd->xbusd_u.b.b_cookie; int err; long dev; - char *mode; + char mode[32]; struct xenbus_transaction *xbt; const char *devname; int major; @@ -772,7 +769,7 @@ xbdback_backend_changed(struct xenbus_wa return; } xbdi->xbdi_dev = dev; - err = xenbus_read(NULL, xbusd->xbusd_path, "mode", NULL, &mode); + err = xenbus_read(NULL, xbusd->xbusd_path, "mode", mode, sizeof(mode)); if (err) { printf("xbdback: failed to read %s/mode: %d\n", xbusd->xbusd_path, err); @@ -782,7 +779,6 @@ xbdback_backend_changed(struct xenbus_wa xbdi->xbdi_ro = false; else xbdi->xbdi_ro = true; - free(mode, M_DEVBUF); major = major(xbdi->xbdi_dev); devname = devsw_blk2name(major); if (devname == NULL) { Index: src/sys/arch/xen/xen/xennetback_xenbus.c diff -u src/sys/arch/xen/xen/xennetback_xenbus.c:1.93 src/sys/arch/xen/xen/xennetback_xenbus.c:1.94 --- src/sys/arch/xen/xen/xennetback_xenbus.c:1.93 Mon Apr 6 19:52:38 2020 +++ src/sys/arch/xen/xen/xennetback_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xennetback_xenbus.c,v 1.93 2020/04/06 19:52:38 jdolecek Exp $ */ +/* $NetBSD: xennetback_xenbus.c,v 1.94 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -25,14 +25,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.93 2020/04/06 19:52:38 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.94 2020/04/07 11:47:06 jdolecek Exp $"); #include "opt_xen.h" #include <sys/types.h> #include <sys/param.h> #include <sys/systm.h> -#include <sys/malloc.h> #include <sys/kmem.h> #include <sys/queue.h> #include <sys/kernel.h> @@ -176,7 +175,8 @@ xennetback_xenbus_create(struct xenbus_d long domid, handle; struct ifnet *ifp; extern int ifqmaxlen; /* XXX */ - char *val, *e, *p; + char *e, *p; + char mac[32]; int i, err; struct xenbus_transaction *xbt; @@ -211,23 +211,22 @@ xennetback_xenbus_create(struct xenbus_d (int)domid, (int)handle); /* read mac address */ - if ((err = xenbus_read(NULL, xbusd->xbusd_path, "mac", NULL, &val))) { + err = xenbus_read(NULL, xbusd->xbusd_path, "mac", mac, sizeof(mac)); + if (err) { aprint_error_ifnet(ifp, "can't read %s/mac: %d\n", xbusd->xbusd_path, err); goto fail; } - for (i = 0, p = val; i < 6; i++) { + for (i = 0, p = mac; i < ETHER_ADDR_LEN; i++) { xneti->xni_enaddr[i] = strtoul(p, &e, 16); if ((e[0] == '\0' && i != 5) && e[0] != ':') { aprint_error_ifnet(ifp, - "%s is not a valid mac address\n", val); - free(val, M_DEVBUF); + "%s is not a valid mac address\n", mac); err = EINVAL; goto fail; } p = &e[1]; } - free(val, M_DEVBUF); /* we can't use the same MAC addr as our guest */ xneti->xni_enaddr[3]++; Index: src/sys/arch/xen/xen/xpci_xenbus.c diff -u src/sys/arch/xen/xen/xpci_xenbus.c:1.22 src/sys/arch/xen/xen/xpci_xenbus.c:1.23 --- src/sys/arch/xen/xen/xpci_xenbus.c:1.22 Sat Feb 2 12:32:55 2019 +++ src/sys/arch/xen/xen/xpci_xenbus.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xpci_xenbus.c,v 1.22 2019/02/02 12:32:55 cherry Exp $ */ +/* $NetBSD: xpci_xenbus.c,v 1.23 2020/04/07 11:47:06 jdolecek Exp $ */ /* * Copyright (c) 2009 Manuel Bouyer. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xpci_xenbus.c,v 1.22 2019/02/02 12:32:55 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xpci_xenbus.c,v 1.23 2020/04/07 11:47:06 jdolecek Exp $"); #include "opt_xen.h" @@ -33,7 +33,6 @@ __KERNEL_RCSID(0, "$NetBSD: xpci_xenbus. #include <sys/param.h> #include <sys/systm.h> #include <sys/errno.h> -#include <sys/malloc.h> #include <sys/kernel.h> #include <sys/bus.h> @@ -290,7 +289,6 @@ xpci_connect(struct xpci_xenbus_softc *s { u_long num_roots; int err; - char *string; char *domain, *bus, *ep; char node[10]; u_long busn; @@ -316,13 +314,14 @@ xpci_connect(struct xpci_xenbus_softc *s (num_roots > 1) ? "ses" : ""); for (i = 0; i < num_roots; i++) { + char root[32]; snprintf(node, sizeof(node), "root-%d", i); xenbus_read(NULL, sc->sc_xbusd->xbusd_otherend, node, - NULL, &string); + root, sizeof(root)); /* split dddd:bb in 2 strings, a la strtok */ - domain = string; - string[4] = '\0'; - bus = &string[5]; + domain = dev; + root[4] = '\0'; + bus = &root[5]; if (strcmp(domain, "0000") != 0) { aprint_error_dev(sc->sc_dev, "non-zero PCI domain %s not supported\n", domain); @@ -337,7 +336,6 @@ xpci_connect(struct xpci_xenbus_softc *s splx(s); } } - free(string, M_DEVBUF); } xenbus_switch_state(sc->sc_xbusd, NULL, XenbusStateConnected); @@ -515,9 +513,10 @@ xpci_enumerate_bus(struct pci_softc *sc, return err; } for (i = 0; i < num_devs; i++) { + char string[32]; snprintf(node, sizeof(node), "dev-%d", i); xenbus_read(NULL, xpci_sc->sc_xbusd->xbusd_otherend, - node, NULL, &string); + node, string, sizeof(string)); /* split dddd:bb:dd:ff in 4 strings, a la strtok */ domain = string; string[4] = '\0'; @@ -556,7 +555,6 @@ xpci_enumerate_bus(struct pci_softc *sc, return (err); } endfor: - free(string, M_DEVBUF); } return (0); #else Index: src/sys/arch/xen/xenbus/xenbus_probe.c diff -u src/sys/arch/xen/xenbus/xenbus_probe.c:1.41 src/sys/arch/xen/xenbus/xenbus_probe.c:1.42 --- src/sys/arch/xen/xenbus/xenbus_probe.c:1.41 Tue Apr 7 09:18:00 2020 +++ src/sys/arch/xen/xenbus/xenbus_probe.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xenbus_probe.c,v 1.41 2020/04/07 09:18:00 jdolecek Exp $ */ +/* $NetBSD: xenbus_probe.c,v 1.42 2020/04/07 11:47:06 jdolecek Exp $ */ /****************************************************************************** * Talks to Xen Store to figure out what devices we have. * @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.41 2020/04/07 09:18:00 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.42 2020/04/07 11:47:06 jdolecek Exp $"); #if 0 #define DPRINTK(fmt, args...) \ @@ -171,9 +171,9 @@ read_otherend_details(struct xenbus_devi const char *id_node, const char *path_node) { int err; - char *val, *ep; + unsigned long id; - err = xenbus_read(NULL, xendev->xbusd_path, id_node, NULL, &val); + err = xenbus_read_ul(NULL, xendev->xbusd_path, id_node, &id, 10); if (err) { printf("reading other end details %s from %s\n", id_node, xendev->xbusd_path); @@ -182,17 +182,10 @@ read_otherend_details(struct xenbus_devi id_node, xendev->xbusd_path); return err; } - xendev->xbusd_otherend_id = strtoul(val, &ep, 10); - if (val[0] == '\0' || *ep != '\0') { - printf("reading other end details %s from %s: %s is not a number\n", id_node, xendev->xbusd_path, val); - xenbus_dev_fatal(xendev, err, - "reading other end details %s from %s: %s is not a number", - id_node, xendev->xbusd_path, val); - free(val, M_DEVBUF); - return EFTYPE; - } - free(val, M_DEVBUF); - err = xenbus_read(NULL, xendev->xbusd_path, path_node, NULL, &val); + xendev->xbusd_otherend_id = (int)id; + + err = xenbus_read(NULL, xendev->xbusd_path, path_node, + xendev->xbusd_otherend, sizeof(xendev->xbusd_otherend)); if (err) { printf("reading other end details %s from %s (%d)\n", path_node, xendev->xbusd_path, err); @@ -203,7 +196,6 @@ read_otherend_details(struct xenbus_devi } DPRINTK("read_otherend_details: read %s/%s returned %s\n", xendev->xbusd_path, path_node, val); - xendev->xbusd_otherend = val; if (strlen(xendev->xbusd_otherend) == 0 || !xenbus_exists(NULL, xendev->xbusd_otherend, "")) { @@ -233,8 +225,8 @@ read_frontend_details(struct xenbus_devi static void free_otherend_details(struct xenbus_device *dev) { - free(dev->xbusd_otherend, M_DEVBUF); - dev->xbusd_otherend = NULL; + /* Nothing to free */ + dev->xbusd_otherend[0] = '\0'; } static void Index: src/sys/arch/xen/xenbus/xenbus_xs.c diff -u src/sys/arch/xen/xenbus/xenbus_xs.c:1.23 src/sys/arch/xen/xenbus/xenbus_xs.c:1.24 --- src/sys/arch/xen/xenbus/xenbus_xs.c:1.23 Wed Nov 28 16:26:59 2012 +++ src/sys/arch/xen/xenbus/xenbus_xs.c Tue Apr 7 11:47:06 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xenbus_xs.c,v 1.23 2012/11/28 16:26:59 royger Exp $ */ +/* $NetBSD: xenbus_xs.c,v 1.24 2020/04/07 11:47:06 jdolecek Exp $ */ /****************************************************************************** * xenbus_xs.c * @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.23 2012/11/28 16:26:59 royger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.24 2020/04/07 11:47:06 jdolecek Exp $"); #if 0 #define DPRINTK(fmt, args...) \ @@ -359,17 +359,29 @@ xenbus_exists(struct xenbus_transaction */ int xenbus_read(struct xenbus_transaction *t, - const char *dir, const char *node, unsigned int *len, - char **ret) + const char *dir, const char *node, + char *buffer, size_t bufsz) { char *path; int err; + char *ret; + unsigned int len; path = join(dir, node); if (path == NULL) return ENOMEM; - err = xs_single(t, XS_READ, path, len, ret); + err = xs_single(t, XS_READ, path, &len, &ret); + + if (err == 0) { + if (len + 1 <= bufsz) { + strncpy(buffer, ret, bufsz); + } else { + err = ENAMETOOLONG; + } + free(ret, M_DEVBUF); + } + free(path, M_DEVBUF); return err; } @@ -380,18 +392,16 @@ xenbus_read_ul(struct xenbus_transaction const char *dir, const char *node, unsigned long *val, int base) { - char *string, *ep; + char string[32], *ep; int err; - err = xenbus_read(t, dir, node, NULL, &string); + err = xenbus_read(t, dir, node, string, sizeof(string)); if (err) return err; *val = strtoul(string, &ep, base); if (*ep != '\0') { - free(string, M_DEVBUF); return EFTYPE; } - free(string, M_DEVBUF); return 0; } @@ -401,18 +411,16 @@ xenbus_read_ull(struct xenbus_transactio const char *dir, const char *node, unsigned long long *val, int base) { - char *string, *ep; + char string[32], *ep; int err; - err = xenbus_read(t, dir, node, NULL, &string); + err = xenbus_read(t, dir, node, string, sizeof(string)); if (err) return err; *val = strtoull(string, &ep, base); if (*ep != '\0') { - free(string, M_DEVBUF); return EFTYPE; } - free(string, M_DEVBUF); return 0; } @@ -513,28 +521,6 @@ int xenbus_transaction_end(struct xenbus return err; } -/* Single read and scanf: returns -errno or num scanned. */ -int -xenbus_scanf(struct xenbus_transaction *t, - const char *dir, const char *node, const char *fmt, ...) -{ - va_list ap; - int ret; - char *val; - - ret = xenbus_read(t, dir, node, NULL, &val); - if (ret) - return ret; - - va_start(ap, fmt); - //ret = vsscanf(val, fmt, ap); - ret = ENXIO; - printf("xb_scanf format %s in %s\n", fmt, val); - va_end(ap); - free(val, M_DEVBUF); - return ret; -} - /* Single printf and write: returns -errno or 0. */ int xenbus_printf(struct xenbus_transaction *t, @@ -561,34 +547,6 @@ xenbus_printf(struct xenbus_transaction return ret; } -/* Takes tuples of names, scanf-style args, and void **, NULL terminated. */ -int -xenbus_gather(struct xenbus_transaction *t, const char *dir, ...) -{ - va_list ap; - const char *name; - int ret = 0; - - va_start(ap, dir); - while (ret == 0 && (name = va_arg(ap, char *)) != NULL) { - const char *fmt = va_arg(ap, char *); - void *result = va_arg(ap, void *); - char *p; - - ret = xenbus_read(t, dir, name, NULL, &p); - if (ret) - break; - if (fmt) { - // XXX if (sscanf(p, fmt, result) == 0) - ret = -EINVAL; - free(p, M_DEVBUF); - } else - *(char **)result = p; - } - va_end(ap); - return ret; -} - static int xs_watch(const char *path, const char *token) {