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)
 {

Reply via email to