From d60cf44deb297119f97d7e792eae5ab01977e2fc Mon Sep 17 00:00:00 2001 From: Christopher Larson Date: Mon, 25 Nov 2013 20:05:13 +0000 Subject: qemu: handle CLOEXEC/NONBLOCK if unavailable on host Signed-off-by: Christopher Larson Signed-off-by: Saul Wold Signed-off-by: Richard Purdie --- ...Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch | 92 ++++++++++++++++++++++ meta/recipes-devtools/qemu/qemu.inc | 1 + 2 files changed, 93 insertions(+) create mode 100644 meta/recipes-devtools/qemu/files/linux-user-Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch (limited to 'meta/recipes-devtools/qemu') diff --git a/meta/recipes-devtools/qemu/files/linux-user-Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch b/meta/recipes-devtools/qemu/files/linux-user-Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch new file mode 100644 index 0000000000..eb638960dd --- /dev/null +++ b/meta/recipes-devtools/qemu/files/linux-user-Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch @@ -0,0 +1,92 @@ +Upstream-Status: Backport + +From 53d09b761f032f50c4424e8649396a9041070bae Mon Sep 17 00:00:00 2001 +From: "Edgar E. Iglesias" +Date: Mon, 23 Sep 2013 14:11:53 +0200 +Subject: [PATCH] linux-user: Handle SOCK_CLOEXEC/NONBLOCK if unavailable on + host + +If the host lacks SOCK_CLOEXEC, bail out with -EINVAL. +If the host lacks SOCK_ONONBLOCK, try to emulate it with fcntl() +and O_NONBLOCK. + +Signed-off-by: Edgar E. Iglesias +Signed-off-by: Riku Voipio +--- + linux-user/syscall.c | 40 +++++++++++++++++++++++++++++++++++++--- + 1 file changed, 37 insertions(+), 3 deletions(-) + +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index b3822b3..4a14a43 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -1773,7 +1773,7 @@ static void unlock_iovec(struct iovec *vec, abi_ulong target_addr, + free(vec); + } + +-static inline void target_to_host_sock_type(int *type) ++static inline int target_to_host_sock_type(int *type) + { + int host_type = 0; + int target_type = *type; +@@ -1790,22 +1790,56 @@ static inline void target_to_host_sock_type(int *type) + break; + } + if (target_type & TARGET_SOCK_CLOEXEC) { ++#if defined(SOCK_CLOEXEC) + host_type |= SOCK_CLOEXEC; ++#else ++ return -TARGET_EINVAL; ++#endif + } + if (target_type & TARGET_SOCK_NONBLOCK) { ++#if defined(SOCK_NONBLOCK) + host_type |= SOCK_NONBLOCK; ++#elif !defined(O_NONBLOCK) ++ return -TARGET_EINVAL; ++#endif + } + *type = host_type; ++ return 0; ++} ++ ++/* Try to emulate socket type flags after socket creation. */ ++static int sock_flags_fixup(int fd, int target_type) ++{ ++#if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK) ++ if (target_type & TARGET_SOCK_NONBLOCK) { ++ int flags = fcntl(fd, F_GETFL); ++ if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) { ++ close(fd); ++ return -TARGET_EINVAL; ++ } ++ } ++#endif ++ return fd; + } + + /* do_socket() Must return target values and target errnos. */ + static abi_long do_socket(int domain, int type, int protocol) + { +- target_to_host_sock_type(&type); ++ int target_type = type; ++ int ret; ++ ++ ret = target_to_host_sock_type(&type); ++ if (ret) { ++ return ret; ++ } + + if (domain == PF_NETLINK) + return -EAFNOSUPPORT; /* do not NETLINK socket connections possible */ +- return get_errno(socket(domain, type, protocol)); ++ ret = get_errno(socket(domain, type, protocol)); ++ if (ret >= 0) { ++ ret = sock_flags_fixup(ret, target_type); ++ } ++ return ret; + } + + /* do_bind() Must return target values and target errnos. */ +-- +1.8.2.1 diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc index 747d6b23e1..0852722df2 100644 --- a/meta/recipes-devtools/qemu/qemu.inc +++ b/meta/recipes-devtools/qemu/qemu.inc @@ -18,6 +18,7 @@ SRC_URI = "\ file://no-strip.patch \ file://larger_default_ram_size.patch \ file://disable-grabs.patch \ + file://linux-user-Handle-SOCK_CLOEXEC-NONBLOCK-if-unavailab.patch \ " SRC_URI_append_class-native = "\ -- cgit 1.2.3-korg