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:
parent
21c520d0c1
commit
c1112b2d3d
31
net/net.c
31
net/net.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user