[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] meson: Stop if cfi is enabled with system slirp
From: |
Paolo Bonzini |
Subject: |
Re: [PATCH] meson: Stop if cfi is enabled with system slirp |
Date: |
Thu, 4 Mar 2021 11:56:06 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 |
On 04/03/21 11:37, Daniel P. Berrangé wrote:
On Wed, Mar 03, 2021 at 09:59:38PM -0500, Daniele Buono wrote:
For CFI, we need to compile slirp as a static library together with qemu.
This is because we register slirp functions as callbacks for QEMU Timers.
When using a system-wide shared libslirp, the type information for the
callback is missing and the timer call produces a false positive with CFI.
Is there work being done, or at least an active plan, for fixing this ?
Daniele, would this work (uncompiled even)?
diff --git a/net/slirp.c b/net/slirp.c
index be914c0be0..82e05d2c01 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -174,23 +174,42 @@ static int64_t net_slirp_clock_get_ns(void *opaque)
return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
}
+typedef struct SlirpTimer {
+ QEMUTimer t;
+ SlirpTimerCb cb;
+ void *cb_opaque;
+} SlirpTimer;
+
+static void slirp_timer_cb(void *opaque)
+{
+ SlirpTimer *st = opaque;
+ st->cb(st->cb_opaque);
+}
+
static void *net_slirp_timer_new(SlirpTimerCb cb,
void *cb_opaque, void *opaque)
{
- return timer_new_full(NULL, QEMU_CLOCK_VIRTUAL,
- SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
- cb, cb_opaque);
+ SlirpTimer *st = g_new(SlirpTimer, 1);
+ st->cb = cb;
+ st->cb_opaque = cb_opaque;
+ timer_init_full(&st->t, NULL, QEMU_CLOCK_VIRTUAL,
+ SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
+ slirp_timer_cb, st);
+ return st;
}
static void net_slirp_timer_free(void *timer, void *opaque)
{
- timer_free(timer);
+ SlirpTimer *st = timer;
+ timer_del(&st->t);
+ g_free(st);
}
static void net_slirp_timer_mod(void *timer, int64_t expire_timer,
void *opaque)
{
- timer_mod(timer, expire_timer);
+ SlirpTimer *st = timer;
+ timer_mod(&st->t, expire_timer);
}
static void net_slirp_register_poll_fd(int fd, void *opaque)