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)
|
||||
{
|
||||
gchar **substrings = NULL;
|
||||
void *object = NULL;
|
||||
Error *err = NULL;
|
||||
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");
|
||||
|
||||
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) {
|
||||
/* Default 64bit prefix length. */
|
||||
qemu_opt_set(opts, "ipv6-prefix", ip6_net, &error_abort);
|
||||
qemu_opt_set_number(opts, "ipv6-prefixlen", 64, &error_abort);
|
||||
} else {
|
||||
substrings = g_strsplit(ip6_net, "/", 2);
|
||||
if (!substrings || !substrings[0]) {
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
|
||||
"a valid IPv6 prefix");
|
||||
goto out;
|
||||
}
|
||||
|
||||
prefix_addr = substrings[0];
|
||||
|
||||
if (substrings[1]) {
|
||||
/* User-specified prefix length. */
|
||||
unsigned long len;
|
||||
int err;
|
||||
|
||||
qemu_opt_set(opts, "ipv6-prefix", buf, &error_abort);
|
||||
err = qemu_strtoul(ip6_net, NULL, 10, &len);
|
||||
|
||||
err = qemu_strtoul(substrings[1], NULL, 10, &prefix_len);
|
||||
if (err) {
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
|
||||
"ipv6-prefixlen", "a number");
|
||||
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");
|
||||
}
|
||||
}
|
||||
@ -1164,6 +1170,7 @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
|
||||
|
||||
out:
|
||||
error_propagate(errp, err);
|
||||
g_strfreev(substrings);
|
||||
visit_free(v);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user