Page MenuHomeFreeBSD

D31279.diff
No OneTemporary

D31279.diff

diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c
--- a/sys/compat/linux/linux_futex.c
+++ b/sys/compat/linux/linux_futex.c
@@ -125,6 +125,7 @@
struct timespec kts;
};
+static inline int futex_key_get(const void *, int, int, struct umtx_key *);
static void linux_umtx_abs_timeout_init(struct umtx_abs_timeout *,
struct linux_futex_args *);
static int linux_futex(struct thread *, struct linux_futex_args *);
@@ -137,6 +138,16 @@
struct linux_futex_args *);
static int futex_wake_pi(struct thread *, uint32_t *, bool);
+static int
+futex_key_get(const void *uaddr, int type, int share, struct umtx_key *key)
+{
+
+ /* Check that futex address is a 32bit aligned. */
+ if (!__is_aligned(uaddr, sizeof(uint32_t)))
+ return (EINVAL);
+ return (umtx_key_get(uaddr, type, share, key));
+}
+
int
futex_wake(struct thread *td, uint32_t *uaddr, int val, bool shared)
{
@@ -404,7 +415,7 @@
em = em_find(td);
uq = td->td_umtxq;
- error = umtx_key_get(args->uaddr, TYPE_PI_FUTEX, GET_SHARED(args),
+ error = futex_key_get(args->uaddr, TYPE_PI_FUTEX, GET_SHARED(args),
&uq->uq_key);
if (error != 0)
return (error);
@@ -611,7 +622,7 @@
if (!rb && (owner & FUTEX_TID_MASK) != em->em_tid)
return (EPERM);
- error = umtx_key_get(args->uaddr, TYPE_PI_FUTEX, GET_SHARED(args), &key);
+ error = futex_key_get(args->uaddr, TYPE_PI_FUTEX, GET_SHARED(args), &key);
if (error != 0)
return (error);
umtxq_lock(&key);
@@ -661,10 +672,10 @@
if (args->uaddr == args->uaddr2)
return (EINVAL);
- error = umtx_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
+ error = futex_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
if (error != 0)
return (error);
- error = umtx_key_get(args->uaddr2, TYPE_FUTEX, GET_SHARED(args), &key2);
+ error = futex_key_get(args->uaddr2, TYPE_FUTEX, GET_SHARED(args), &key2);
if (error != 0) {
umtx_key_release(&key);
return (error);
@@ -726,10 +737,10 @@
if (nrwake < 0 || nrrequeue < 0)
return (EINVAL);
- error = umtx_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
+ error = futex_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
if (error != 0)
return (error);
- error = umtx_key_get(args->uaddr2, TYPE_FUTEX, GET_SHARED(args), &key2);
+ error = futex_key_get(args->uaddr2, TYPE_FUTEX, GET_SHARED(args), &key2);
if (error != 0) {
umtx_key_release(&key);
return (error);
@@ -764,7 +775,7 @@
if (args->val3 == 0)
return (EINVAL);
- error = umtx_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
+ error = futex_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args), &key);
if (error != 0)
return (error);
umtxq_lock(&key);
@@ -786,7 +797,7 @@
error = EINVAL;
uq = td->td_umtxq;
- error = umtx_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args),
+ error = futex_key_get(args->uaddr, TYPE_FUTEX, GET_SHARED(args),
&uq->uq_key);
if (error != 0)
return (error);

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 22, 9:29 PM (15 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17687377
Default Alt Text
D31279.diff (2 KB)

Event Timeline