net: avoid using variable length array in net_client_init()

net_client_init() uses a variable length array to store the prefix
of 'ipv6-net' parameter (e.g. if ipv6-net=fec0::0/64, the prefix
is 'fec0::0').
This patch introduces g_strsplit() to split the 'ipv6-net' parameter,
so we can remove the variable length array.

Suggested-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Stefano Garzarella 2019-05-17 15:47:46 +02:00 committed by Jason Wang
parent 21c520d0c1
commit c1112b2d3d

View File

@ -1105,6 +1105,7 @@ static void show_netdevs(void)
static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp) static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
{ {
gchar **substrings = NULL;
void *object = NULL; void *object = NULL;
Error *err = NULL; Error *err = NULL;
int ret = -1; int ret = -1;
@ -1120,28 +1121,33 @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
const char *ip6_net = qemu_opt_get(opts, "ipv6-net"); const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
if (ip6_net) { if (ip6_net) {
char buf[strlen(ip6_net) + 1]; char *prefix_addr;
unsigned long prefix_len = 64; /* Default 64bit prefix length. */
if (get_str_sep(buf, sizeof(buf), &ip6_net, '/') < 0) { substrings = g_strsplit(ip6_net, "/", 2);
/* Default 64bit prefix length. */ if (!substrings || !substrings[0]) {
qemu_opt_set(opts, "ipv6-prefix", ip6_net, &error_abort); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
qemu_opt_set_number(opts, "ipv6-prefixlen", 64, &error_abort); "a valid IPv6 prefix");
} else { goto out;
}
prefix_addr = substrings[0];
if (substrings[1]) {
/* User-specified prefix length. */ /* User-specified prefix length. */
unsigned long len;
int err; int err;
qemu_opt_set(opts, "ipv6-prefix", buf, &error_abort); err = qemu_strtoul(substrings[1], NULL, 10, &prefix_len);
err = qemu_strtoul(ip6_net, NULL, 10, &len);
if (err) { if (err) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"ipv6-prefixlen", "a number"); "ipv6-prefixlen", "a number");
goto out; goto out;
} }
qemu_opt_set_number(opts, "ipv6-prefixlen", len, &error_abort);
} }
qemu_opt_set(opts, "ipv6-prefix", prefix_addr, &error_abort);
qemu_opt_set_number(opts, "ipv6-prefixlen", prefix_len,
&error_abort);
qemu_opt_unset(opts, "ipv6-net"); qemu_opt_unset(opts, "ipv6-net");
} }
} }
@ -1164,6 +1170,7 @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
out: out:
error_propagate(errp, err); error_propagate(errp, err);
g_strfreev(substrings);
visit_free(v); visit_free(v);
return ret; return ret;
} }