Fixes for epoll_ctl and stack_t
-----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEzS913cjjpNwuT1Fz8ww4vT8vvjwFAl+sWkASHGxhdXJlbnRA dml2aWVyLmV1AAoJEPMMOL0/L748ncsQAI6JaS5BJM25vFslcplXyX1jBd8sXk+Z CnzgI/moLKr1HZRc3DecHbttApptHg+B4Twp/FqBCTk1gpqDsAUKmIgdqPZhP7Xj rsaUqXLJkChJtA5IFImMtI1XhQhuoI+S/AJ6l2gwnXaRqb0xILbonSXk9d2t+qpN aq9ho8yZfrB4025kSkEvE7YogPOKdNJdNGjPLn1MSiDP8syzgAKTSOcMehjiGQoC 90uyDDZqBx6JcFzF7kKl3K0MJxpKrqaEkV8iELQ6UI/SHfVPp/ToaYvgPvy+kloh iAuy71PrVWHredeLmyzgwB+fZyq0O+XWFfhw9r37Lo6fn6MQ1xIaNAUzF7+fEBB5 +2tIxpkeWrOfb2Eu0aagAVEHpFR+1MmtGYwdoxNXFvP15IOLFpGyxAY86m6haBsA j3w6lyt51iK6vJt4IYZJjMnh81LZ2fxTCBQs23kH+cxRu2wEc97qkkgNJSjzCCOv rgkHpw2cxT16IkqSlFZVu9w8Rv+sibUJWxtcJsYo9Xwy0R5tHoZNn5uzwdo1wTHJ ZUY3s9ag6dEle63jMwATZDsekvQVW6AHceFkc7OIr6mMvIynijSQAoi+JZbs4ysD NaNklc01H3IJMIv6e5iiWhFVdJL6Nm/mRXU6GC6yn2bp5dhY++GGcPevz+BDfP+v FzxALaxQoIHP =bIlV -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-5.2-pull-request' into staging Fixes for epoll_ctl and stack_t # gpg: Signature made Wed 11 Nov 2020 21:40:16 GMT # gpg: using RSA key CD2F75DDC8E3A4DC2E4F5173F30C38BD3F2FBE3C # gpg: issuer "laurent@vivier.eu" # gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" [full] # gpg: aka "Laurent Vivier <laurent@vivier.eu>" [full] # gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" [full] # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier2/tags/linux-user-for-5.2-pull-request: linux-user: Prevent crash in epoll_ctl linux-user: Correct definition of stack_t Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
674ee1245b
|
@ -42,8 +42,7 @@
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
int32_t ss_flags;
|
abi_int ss_flags;
|
||||||
int32_t dummy;
|
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_ulong ss_size;
|
abi_int ss_flags;
|
||||||
abi_long ss_flags;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
int32_t ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_ulong ss_size;
|
abi_int ss_flags;
|
||||||
abi_long ss_flags;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_long ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,12 +45,11 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_long ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
abi_int ss_flags;
|
abi_int ss_flags;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sigaltstack controls
|
* sigaltstack controls
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -4,11 +4,12 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_long ss_sp;
|
abi_ulong ss_sp;
|
||||||
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
abi_long ss_flags;
|
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
/* sigaltstack controls */
|
/* sigaltstack controls */
|
||||||
#define TARGET_SS_ONSTACK 1
|
#define TARGET_SS_ONSTACK 1
|
||||||
#define TARGET_SS_DISABLE 2
|
#define TARGET_SS_DISABLE 2
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
int ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
int ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12590,17 +12590,25 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
||||||
struct epoll_event ep;
|
struct epoll_event ep;
|
||||||
struct epoll_event *epp = 0;
|
struct epoll_event *epp = 0;
|
||||||
if (arg4) {
|
if (arg4) {
|
||||||
struct target_epoll_event *target_ep;
|
if (arg2 != EPOLL_CTL_DEL) {
|
||||||
if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
|
struct target_epoll_event *target_ep;
|
||||||
return -TARGET_EFAULT;
|
if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
ep.events = tswap32(target_ep->events);
|
||||||
|
/*
|
||||||
|
* The epoll_data_t union is just opaque data to the kernel,
|
||||||
|
* so we transfer all 64 bits across and need not worry what
|
||||||
|
* actual data type it is.
|
||||||
|
*/
|
||||||
|
ep.data.u64 = tswap64(target_ep->data.u64);
|
||||||
|
unlock_user_struct(target_ep, arg4, 0);
|
||||||
}
|
}
|
||||||
ep.events = tswap32(target_ep->events);
|
/*
|
||||||
/* The epoll_data_t union is just opaque data to the kernel,
|
* before kernel 2.6.9, EPOLL_CTL_DEL operation required a
|
||||||
* so we transfer all 64 bits across and need not worry what
|
* non-null pointer, even though this argument is ignored.
|
||||||
* actual data type it is.
|
*
|
||||||
*/
|
*/
|
||||||
ep.data.u64 = tswap64(target_ep->data.u64);
|
|
||||||
unlock_user_struct(target_ep, arg4, 0);
|
|
||||||
epp = &ep;
|
epp = &ep;
|
||||||
}
|
}
|
||||||
return get_errno(epoll_ctl(arg1, arg2, arg3, epp));
|
return get_errno(epoll_ctl(arg1, arg2, arg3, epp));
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
/* this struct defines a stack used during syscall handling */
|
/* this struct defines a stack used during syscall handling */
|
||||||
|
|
||||||
typedef struct target_sigaltstack {
|
typedef struct target_sigaltstack {
|
||||||
abi_ulong ss_sp;
|
abi_ulong ss_sp;
|
||||||
abi_long ss_flags;
|
abi_int ss_flags;
|
||||||
abi_ulong ss_size;
|
abi_ulong ss_size;
|
||||||
} target_stack_t;
|
} target_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue