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