net/tap: net_init_tap(): common fail label
Add common failure label. This: - simplifies failure paths in the function - get rid of unusual free_fail: in the middle of the function - simplify further refactoring Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Ben Chaney <bchaney@akamai.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
Vladimir Sementsov-Ogievskiy committed
Mar 18, 2026 at 14:31 UTC
11d0e070a6d43008b3ec3461ce1d94c0def6786c
1 file changed
+37
-47
net/tap.c
+37
-47
@@ -820,10 +820,12 @@ int net_init_tap(const Netdev *netdev, const char *name,
820
NetClientState *peer, Error **errp)
821
{
822
const NetdevTapOptions *tap;
823
- int fd, vnet_hdr = 0, i = 0, queues;
823
+ int fd = -1, vnet_hdr = 0, i = 0, queues;
824
/* for the no-fd, no-helper case */
825
char ifname[128];
826
- int ret = 0;
826
+ char **fds = NULL, **vhost_fds = NULL;
827
+ int nfds = 0, nvhosts = 0;
828
+
829
830
assert(netdev->type == NET_CLIENT_DRIVER_TAP);
831
tap = &netdev->u.tap;
@@ -867,31 +869,24 @@ int net_init_tap(const Netdev *netdev, const char *name,
869
if (tap->fd) {
870
fd = monitor_fd_param(monitor_cur(), tap->fd, errp);
871
if (fd == -1) {
870
- return -1;
872
+ goto fail;
873
}
874
875
if (!qemu_set_blocking(fd, false, errp)) {
874
- close(fd);
875
- return -1;
876
+ goto fail;
877
}
878
879
vnet_hdr = tap_probe_vnet_hdr(fd, errp);
880
if (vnet_hdr < 0) {
880
- close(fd);
881
- return -1;
881
+ goto fail;
882
}
883
884
if (!net_init_tap_one(tap, peer, "tap", name, NULL,
885
NULL, NULL,
886
tap->vhostfd, vnet_hdr, fd, errp)) {
887
- close(fd);
888
- return -1;
887
+ goto fail;
888
}
889
} else if (tap->fds) {
891
- char **fds;
892
- char **vhost_fds;
893
- int nfds = 0, nvhosts = 0;
894
-
890
fds = g_new0(char *, MAX_TAP_QUEUES);
891
vhost_fds = g_new0(char *, MAX_TAP_QUEUES);
892
@@ -901,77 +896,58 @@ int net_init_tap(const Netdev *netdev, const char *name,
896
if (nfds != nvhosts) {
897
error_setg(errp, "The number of fds passed does not match "
898
"the number of vhostfds passed");
904
- ret = -1;
905
- goto free_fail;
899
+ goto fail;
900
}
901
}
902
903
for (i = 0; i < nfds; i++) {
904
fd = monitor_fd_param(monitor_cur(), fds[i], errp);
905
if (fd == -1) {
912
- ret = -1;
913
- goto free_fail;
906
+ goto fail;
907
}
908
909
if (!qemu_set_blocking(fd, false, errp)) {
917
- ret = -1;
918
- goto free_fail;
910
+ goto fail;
911
}
912
913
if (i == 0) {
914
vnet_hdr = tap_probe_vnet_hdr(fd, errp);
915
if (vnet_hdr < 0) {
924
- ret = -1;
925
- goto free_fail;
916
+ goto fail;
917
}
918
} else if (vnet_hdr != tap_probe_vnet_hdr(fd, NULL)) {
919
error_setg(errp,
920
"vnet_hdr not consistent across given tap fds");
930
- ret = -1;
931
- goto free_fail;
921
+ goto fail;
922
}
923
924
if (!net_init_tap_one(tap, peer, "tap", name, ifname,
925
NULL, NULL,
926
tap->vhostfds ? vhost_fds[i] : NULL,
927
vnet_hdr, fd, errp)) {
938
- ret = -1;
939
- goto free_fail;
928
+ goto fail;
929
}
930
}
942
-
943
-free_fail:
944
- for (i = 0; i < nvhosts; i++) {
945
- g_free(vhost_fds[i]);
946
- }
947
- for (i = 0; i < nfds; i++) {
948
- g_free(fds[i]);
949
- }
950
- g_free(fds);
951
- g_free(vhost_fds);
952
- return ret;
931
} else if (tap->helper) {
932
fd = net_bridge_run_helper(tap->helper,
933
tap->br ?: DEFAULT_BRIDGE_INTERFACE,
934
errp);
935
if (fd == -1) {
958
- return -1;
936
+ goto fail;
937
}
938
939
if (!qemu_set_blocking(fd, false, errp)) {
962
- return -1;
940
+ goto fail;
941
}
942
vnet_hdr = tap_probe_vnet_hdr(fd, errp);
943
if (vnet_hdr < 0) {
966
- close(fd);
967
- return -1;
944
+ goto fail;
945
}
946
947
if (!net_init_tap_one(tap, peer, "bridge", name, ifname,
948
NULL, NULL, tap->vhostfd,
949
vnet_hdr, fd, errp)) {
973
- close(fd);
974
- return -1;
950
+ goto fail;
951
}
952
} else {
953
g_autofree char *script =
@@ -989,14 +965,13 @@ free_fail:
965
fd = net_tap_init(tap, &vnet_hdr, i >= 1 ? NULL : script,
966
ifname, sizeof ifname, queues > 1, errp);
967
if (fd == -1) {
992
- return -1;
968
+ goto fail;
969
}
970
971
if (queues > 1 && i == 0 && !tap->ifname) {
972
if (tap_fd_get_ifname(fd, ifname)) {
973
error_setg(errp, "Fail to get ifname");
998
- close(fd);
999
- return -1;
974
+ goto fail;
975
}
976
}
977
@@ -1004,13 +979,28 @@ free_fail:
979
i >= 1 ? NULL : script,
980
i >= 1 ? NULL : downscript,
981
tap->vhostfd, vnet_hdr, fd, errp)) {
1007
- close(fd);
1008
- return -1;
982
+ goto fail;
983
}
984
}
985
}
986
987
return 0;
988
+
989
+fail:
990
+ close(fd);
991
+ if (vhost_fds) {
992
+ for (i = 0; i < nvhosts; i++) {
993
+ g_free(vhost_fds[i]);
994
+ }
995
+ g_free(vhost_fds);
996
+ }
997
+ if (fds) {
998
+ for (i = 0; i < nfds; i++) {
999
+ g_free(fds[i]);
1000
+ }
1001
+ g_free(fds);
1002
+ }
1003
+ return -1;
1004
}
1005
1006
int tap_enable(NetClientState *nc)