net/slirp: free forwarding rules on cleanup
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
parent
3624730a32
commit
8d45a3b946
25
net/slirp.c
25
net/slirp.c
@ -75,6 +75,13 @@ struct slirp_config_str {
|
|||||||
char str[1024];
|
char str[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuestFwd {
|
||||||
|
CharBackend hd;
|
||||||
|
struct in_addr server;
|
||||||
|
int port;
|
||||||
|
Slirp *slirp;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct SlirpState {
|
typedef struct SlirpState {
|
||||||
NetClientState nc;
|
NetClientState nc;
|
||||||
QTAILQ_ENTRY(SlirpState) entry;
|
QTAILQ_ENTRY(SlirpState) entry;
|
||||||
@ -83,6 +90,7 @@ typedef struct SlirpState {
|
|||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
gchar *smb_dir;
|
gchar *smb_dir;
|
||||||
#endif
|
#endif
|
||||||
|
GSList *fwd;
|
||||||
} SlirpState;
|
} SlirpState;
|
||||||
|
|
||||||
static struct slirp_config_str *slirp_configs;
|
static struct slirp_config_str *slirp_configs;
|
||||||
@ -122,10 +130,19 @@ static void slirp_smb_exit(Notifier *n, void *data)
|
|||||||
slirp_smb_cleanup(s);
|
slirp_smb_cleanup(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void slirp_free_fwd(gpointer data)
|
||||||
|
{
|
||||||
|
struct GuestFwd *fwd = data;
|
||||||
|
|
||||||
|
qemu_chr_fe_deinit(&fwd->hd, true);
|
||||||
|
g_free(data);
|
||||||
|
}
|
||||||
|
|
||||||
static void net_slirp_cleanup(NetClientState *nc)
|
static void net_slirp_cleanup(NetClientState *nc)
|
||||||
{
|
{
|
||||||
SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
|
SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
|
||||||
|
|
||||||
|
g_slist_free_full(s->fwd, slirp_free_fwd);
|
||||||
slirp_cleanup(s->slirp);
|
slirp_cleanup(s->slirp);
|
||||||
if (s->exit_notifier.notify) {
|
if (s->exit_notifier.notify) {
|
||||||
qemu_remove_exit_notifier(&s->exit_notifier);
|
qemu_remove_exit_notifier(&s->exit_notifier);
|
||||||
@ -717,13 +734,6 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
|
|||||||
|
|
||||||
#endif /* !defined(_WIN32) */
|
#endif /* !defined(_WIN32) */
|
||||||
|
|
||||||
struct GuestFwd {
|
|
||||||
CharBackend hd;
|
|
||||||
struct in_addr server;
|
|
||||||
int port;
|
|
||||||
Slirp *slirp;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int guestfwd_can_read(void *opaque)
|
static int guestfwd_can_read(void *opaque)
|
||||||
{
|
{
|
||||||
struct GuestFwd *fwd = opaque;
|
struct GuestFwd *fwd = opaque;
|
||||||
@ -814,6 +824,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
|
|||||||
|
|
||||||
qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_read,
|
qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_read,
|
||||||
NULL, NULL, fwd, NULL, true);
|
NULL, NULL, fwd, NULL, true);
|
||||||
|
s->fwd = g_slist_append(s->fwd, fwd);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user