From 791c2192a9a19e42d8a396b0e46e1b15feb542cb Mon Sep 17 00:00:00 2001 From: Sharvil Nanavati Date: Mon, 20 Jun 2016 19:16:12 -0700 Subject: Fix potential DoS caused by delivering signal to BT process Ticket: CYNGNOS-3177 Bug: 28885210 Change-Id: I63866d894bfca47464d6e42e3fb0357c4f94d360 --- btif/src/btif_core.c | 5 +++-- btif/src/btif_dm.c | 3 ++- btif/src/btif_hh.c | 4 ++-- btif/src/btif_hl.c | 14 +++++++------- btif/src/btif_pan.c | 22 +++++++++++----------- btif/src/btif_rc.c | 19 ++++++++++--------- btif/src/btif_sock_l2cap.c | 10 +++++----- btif/src/btif_sock_rfc.c | 14 ++++++-------- btif/src/btif_sock_thread.c | 20 ++++++++++---------- btif/src/btif_sock_util.c | 6 +++--- 10 files changed, 59 insertions(+), 58 deletions(-) (limited to 'btif/src') diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c index 6db10762c..ba717bb48 100644 --- a/btif/src/btif_core.c +++ b/btif/src/btif_core.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -413,10 +414,10 @@ static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) BTIF_TRACE_DEBUG("%s, local bdaddr is stored in %s", __func__, val); - if ((addr_fd = open(val, O_RDONLY)) != -1) + if ((addr_fd = TEMP_FAILURE_RETRY(open(val, O_RDONLY))) != -1) { memset(val, 0, sizeof(val)); - read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN); + TEMP_FAILURE_RETRY(read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN)); /* If this is not a reserved/special bda, then use it */ if ((string_to_bdaddr(val, local_addr)) && (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)) diff --git a/btif/src/btif_dm.c b/btif/src/btif_dm.c index 34b8077ea..ca114fa8f 100644 --- a/btif/src/btif_dm.c +++ b/btif/src/btif_dm.c @@ -30,6 +30,7 @@ #define LOG_TAG "bt_btif_dm" #include +#include #include #include #include @@ -2028,7 +2029,7 @@ static void btif_dm_upstreams_evt(UINT16 event, char* p_param) BTIF_TRACE_ERROR("Received H/W Error. "); /* Flush storage data */ btif_config_flush(); - usleep(100000); /* 100milliseconds */ + TEMP_FAILURE_RETRY(usleep(100000)); /* 100milliseconds */ /* Killing the process to force a restart as part of fault tolerance */ kill(getpid(), SIGKILL); break; diff --git a/btif/src/btif_hh.c b/btif/src/btif_hh.c index 88e767a91..e78bfc234 100644 --- a/btif/src/btif_hh.c +++ b/btif/src/btif_hh.c @@ -237,7 +237,7 @@ static void toggle_os_keylockstates(int fd, int changedlockstates) BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__, hidreport[6], hidreport[7], hidreport[8]); bta_hh_co_write(fd , hidreport, sizeof(hidreport)); - usleep(200000); + TEMP_FAILURE_RETRY(usleep(200000)); memset(hidreport,0,9); hidreport[0]=1; BTIF_TRACE_DEBUG("Writing hidreport #2 to os: "\ @@ -332,7 +332,7 @@ static void sync_lockstate_on_connect(btif_hh_device_t *p_dev) BTIF_TRACE_DEBUG("%s: Sending hid report to kernel "\ "indicating lock key state 0x%x",__FUNCTION__, keylockstates); - usleep(200000); + TEMP_FAILURE_RETRY(usleep(200000)); toggle_os_keylockstates(p_dev->fd, keylockstates); } else diff --git a/btif/src/btif_hl.c b/btif/src/btif_hl.c index d9e0d1f46..cbce15f7b 100644 --- a/btif/src/btif_hl.c +++ b/btif/src/btif_hl.c @@ -4795,8 +4795,8 @@ void btif_hl_select_monitor_callback(fd_set *p_cur_set ,fd_set *p_org_set) { } p_dcb->p_tx_pkt = btif_hl_get_buf (p_dcb->mtu); if (p_dcb) { - int r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, - p_dcb->mtu, MSG_DONTWAIT); + int r = (int)TEMP_FAILURE_RETRY(recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, + p_dcb->mtu, MSG_DONTWAIT)); if (r > 0) { BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r); p_dcb->tx_size = r; @@ -4852,7 +4852,7 @@ static inline int btif_hl_select_wakeup_init(fd_set* set){ static inline int btif_hl_select_wakeup(void){ char sig_on = btif_hl_signal_select_wakeup; BTIF_TRACE_DEBUG("btif_hl_select_wakeup"); - return send(signal_fds[1], &sig_on, sizeof(sig_on), 0); + return TEMP_FAILURE_RETRY(send(signal_fds[1], &sig_on, sizeof(sig_on), 0)); } /******************************************************************************* @@ -4867,7 +4867,7 @@ static inline int btif_hl_select_wakeup(void){ static inline int btif_hl_select_close_connected(void){ char sig_on = btif_hl_signal_select_close_connected; BTIF_TRACE_DEBUG("btif_hl_select_close_connected"); - return send(signal_fds[1], &sig_on, sizeof(sig_on), 0); + return TEMP_FAILURE_RETRY(send(signal_fds[1], &sig_on, sizeof(sig_on), 0)); } /******************************************************************************* @@ -4884,7 +4884,7 @@ static inline int btif_hl_close_select_thread(void) int result = 0; char sig_on = btif_hl_signal_select_exit; BTIF_TRACE_DEBUG("btif_hl_signal_select_exit"); - result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0); + result = TEMP_FAILURE_RETRY(send(signal_fds[1], &sig_on, sizeof(sig_on), 0)); if (btif_is_enabled()) { /* Wait for the select_thread_id to exit if BT is still enabled @@ -4911,7 +4911,7 @@ static inline int btif_hl_select_wake_reset(void){ char sig_recv = 0; BTIF_TRACE_DEBUG("btif_hl_select_wake_reset"); - recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL); + TEMP_FAILURE_RETRY(recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL)); return(int)sig_recv; } /******************************************************************************* @@ -4972,7 +4972,7 @@ static void *btif_hl_select_thread(void *arg){ BTIF_TRACE_DEBUG("set curr_set = org_set "); curr_set = org_set; max_curr_s = max_org_s; - int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL); + int ret = TEMP_FAILURE_RETRY(select((max_curr_s + 1), &curr_set, NULL, NULL, NULL)); BTIF_TRACE_DEBUG("select unblocked ret=%d", ret); if (ret == -1) { diff --git a/btif/src/btif_pan.c b/btif/src/btif_pan.c index 377843822..69f28a00b 100644 --- a/btif/src/btif_pan.c +++ b/btif/src/btif_pan.c @@ -312,7 +312,7 @@ static int tap_if_up(const char *devname, const bt_bdaddr_t *addr) //set mac addr memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, devname, IFNAMSIZ - 1); - err = ioctl(sk, SIOCGIFHWADDR, &ifr); + err = TEMP_FAILURE_RETRY(ioctl(sk, SIOCGIFHWADDR, &ifr)); if (err < 0) { BTIF_TRACE_ERROR("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno)); @@ -333,7 +333,7 @@ static int tap_if_up(const char *devname, const bt_bdaddr_t *addr) ifr.ifr_hwaddr.sa_data[0] &= ~0x01; } - err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr); + err = TEMP_FAILURE_RETRY(ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr)); if (err < 0) { BTIF_TRACE_ERROR("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno)); @@ -348,7 +348,7 @@ static int tap_if_up(const char *devname, const bt_bdaddr_t *addr) ifr.ifr_flags |= IFF_UP; ifr.ifr_flags |= IFF_MULTICAST; - err = ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr); + err = TEMP_FAILURE_RETRY(ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr)); if (err < 0) { @@ -375,7 +375,7 @@ static int tap_if_down(const char *devname) ifr.ifr_flags &= ~IFF_UP; - ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr); + TEMP_FAILURE_RETRY(ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr)); close(sk); @@ -401,7 +401,7 @@ int btpan_tap_open() /* open the clone device */ - if ((fd = open(clonedev, O_RDWR)) < 0) + if ((fd = TEMP_FAILURE_RETRY(open(clonedev, O_RDWR))) < 0) { BTIF_TRACE_DEBUG("could not open %s, err:%d", clonedev, errno); return fd; @@ -413,7 +413,7 @@ int btpan_tap_open() strncpy(ifr.ifr_name, TAP_IF_NAME, IFNAMSIZ); /* try to create the device */ - if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) + if ((err = TEMP_FAILURE_RETRY(ioctl(fd, TUNSETIFF, (void *) &ifr))) < 0) { BTIF_TRACE_DEBUG("ioctl error:%d, errno:%s", err, strerror(errno)); close(fd); @@ -421,8 +421,8 @@ int btpan_tap_open() } if (tap_if_up(TAP_IF_NAME, controller_get_interface()->get_address()) == 0) { - int flags = fcntl(fd, F_GETFL, 0); - fcntl(fd, F_SETFL, flags | O_NONBLOCK); + int flags = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL, 0)); + TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, flags | O_NONBLOCK)); return fd; } BTIF_TRACE_ERROR("can not bring up tap interface:%s", TAP_IF_NAME); @@ -451,7 +451,7 @@ int btpan_tap_send(int tap_fd, const BD_ADDR src, const BD_ADDR dst, UINT16 prot memcpy(packet + sizeof(tETH_HDR), buf, len); /* Send data to network interface */ - int ret = write(tap_fd, packet, len + sizeof(tETH_HDR)); + int ret = TEMP_FAILURE_RETRY(write(tap_fd, packet, len + sizeof(tETH_HDR))); BTIF_TRACE_DEBUG("ret:%d", ret); return ret; } @@ -742,7 +742,7 @@ static void btu_exec_tap_fd_read(void *p_param) { // We save it in the congest_packet right away in case we can't deliver it in this // attempt. if (!btpan_cb.congest_packet_size) { - ssize_t ret = read(fd, btpan_cb.congest_packet, sizeof(btpan_cb.congest_packet)); + ssize_t ret = TEMP_FAILURE_RETRY(read(fd, btpan_cb.congest_packet, sizeof(btpan_cb.congest_packet))); switch (ret) { case -1: BTIF_TRACE_ERROR("%s unable to read from driver: %s", __func__, strerror(errno)); @@ -786,7 +786,7 @@ static void btu_exec_tap_fd_read(void *p_param) { ufd.fd = fd; ufd.events = POLLIN; ufd.revents = 0; - if (poll(&ufd, 1, 0) <= 0 || IS_EXCEPTION(ufd.revents)) + if (TEMP_FAILURE_RETRY(poll(&ufd, 1, 0)) <= 0 || IS_EXCEPTION(ufd.revents)) break; } if (btpan_cb.flow) { diff --git a/btif/src/btif_rc.c b/btif/src/btif_rc.c index 4a83c269d..63b311e64 100644 --- a/btif/src/btif_rc.c +++ b/btif/src/btif_rc.c @@ -28,6 +28,7 @@ * Description: Bluetooth AVRC implementation * *****************************************************************************/ +#include #include #include #include @@ -317,7 +318,7 @@ int send_event (int fd, uint16_t type, uint16_t code, int32_t value) event.code = code; event.value = value; - return write(fd, &event, sizeof(event)); + return TEMP_FAILURE_RETRY(write(fd, &event, sizeof(event))); } void send_key (int fd, uint16_t key, int pressed) @@ -356,7 +357,7 @@ int uinput_create(char *name) for(x=0; x < MAX_UINPUT_PATHS; x++) { - fd = open(uinput_dev_path[x], O_RDWR); + fd = TEMP_FAILURE_RETRY(open(uinput_dev_path[x], O_RDWR)); if (fd < 0) continue; break; @@ -374,20 +375,20 @@ int uinput_create(char *name) dev.id.product = 0x0000; dev.id.version = 0x0000; - if (write(fd, &dev, sizeof(dev)) < 0) { + if (TEMP_FAILURE_RETRY(write(fd, &dev, sizeof(dev))) < 0) { BTIF_TRACE_ERROR("%s Unable to write device information", __FUNCTION__); close(fd); return -1; } - ioctl(fd, UI_SET_EVBIT, EV_KEY); - ioctl(fd, UI_SET_EVBIT, EV_REL); - ioctl(fd, UI_SET_EVBIT, EV_SYN); + TEMP_FAILURE_RETRY(ioctl(fd, UI_SET_EVBIT, EV_KEY)); + TEMP_FAILURE_RETRY(ioctl(fd, UI_SET_EVBIT, EV_REL)); + TEMP_FAILURE_RETRY(ioctl(fd, UI_SET_EVBIT, EV_SYN)); for (x = 0; key_map[x].name != NULL; x++) - ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id); + TEMP_FAILURE_RETRY(ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id)); - if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) { + if (TEMP_FAILURE_RETRY(ioctl(fd, UI_DEV_CREATE, NULL)) < 0) { BTIF_TRACE_ERROR("%s Unable to create uinput device", __FUNCTION__); close(fd); return -1; @@ -425,7 +426,7 @@ void close_uinput (void) // Since we support Dual AVRCP conn now. BTIF_TRACE_DEBUG("%s", __FUNCTION__); if (uinput_fd > 0) { - ioctl(uinput_fd, UI_DEV_DESTROY); + TEMP_FAILURE_RETRY(ioctl(uinput_fd, UI_DEV_DESTROY)); close(uinput_fd); uinput_fd = -1; diff --git a/btif/src/btif_sock_l2cap.c b/btif/src/btif_sock_l2cap.c index 93ba9be61..f4f152953 100644 --- a/btif/src/btif_sock_l2cap.c +++ b/btif/src/btif_sock_l2cap.c @@ -979,7 +979,7 @@ static BOOLEAN flush_incoming_que_on_wr_signal_l(l2cap_socket *sock) uint32_t len; while (packet_get_head_l(sock, &buf, &len)) { - int sent = send(sock->our_fd, buf, len, MSG_DONTWAIT); + int sent = TEMP_FAILURE_RETRY(send(sock->our_fd, buf, len, MSG_DONTWAIT)); if (sent == (signed)len) osi_free(buf); @@ -1013,7 +1013,7 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) if (sock->connected) { int size = 0; - if (!(flags & SOCK_THREAD_FD_EXCEPTION) || (ioctl(sock->our_fd, FIONREAD, &size) + if (!(flags & SOCK_THREAD_FD_EXCEPTION) || (TEMP_FAILURE_RETRY(ioctl(sock->our_fd, FIONREAD, &size)) == 0 && size)) { uint8_t *buffer = osi_malloc(L2CAP_MAX_SDU_LENGTH); //uint8_t *buffer = (uint8_t*)GKI_getbuf(L2CAP_MAX_SDU_LENGTH); @@ -1039,8 +1039,8 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) * UPDATE: Since we are responsible for freeing the buffer in the * write_complete_ind, it is OK to use malloc. */ - int count = recv(fd, buffer, L2CAP_MAX_SDU_LENGTH, - MSG_NOSIGNAL | MSG_DONTWAIT); + int count = TEMP_FAILURE_RETRY(recv(fd, buffer, L2CAP_MAX_SDU_LENGTH, + MSG_NOSIGNAL | MSG_DONTWAIT)); APPL_TRACE_DEBUG("btsock_l2cap_signaled - %d bytes received from socket", count); if (sock->fixed_chan) { @@ -1072,7 +1072,7 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) } if (drop_it || (flags & SOCK_THREAD_FD_EXCEPTION)) { int size = 0; - if (drop_it || ioctl(sock->our_fd, FIONREAD, &size) != 0 || size == 0) + if (drop_it || TEMP_FAILURE_RETRY(ioctl(sock->our_fd, FIONREAD, &size)) != 0 || size == 0) btsock_l2cap_free_l(sock); } } diff --git a/btif/src/btif_sock_rfc.c b/btif/src/btif_sock_rfc.c index c352966ef..059b62c0f 100644 --- a/btif/src/btif_sock_rfc.c +++ b/btif/src/btif_sock_rfc.c @@ -840,7 +840,7 @@ static sent_status_t send_data_to_app(int fd, BT_HDR *p_buf) { if (p_buf->len == 0) return SENT_ALL; - ssize_t sent = send(fd, p_buf->data + p_buf->offset, p_buf->len, MSG_DONTWAIT); + ssize_t sent = TEMP_FAILURE_RETRY(send(fd, p_buf->data + p_buf->offset, p_buf->len, MSG_DONTWAIT)); if (sent == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) @@ -903,11 +903,9 @@ void btsock_rfc_signaled(UNUSED_ATTR int fd, int flags, uint32_t user_id) { if (slot->f.connected) { // Make sure there's data pending in case the peer closed the socket. int size = 0; - if (!(flags & SOCK_THREAD_FD_EXCEPTION) || (ioctl(slot->fd, FIONREAD, &size) == 0 && size)) - //unlock before BTA_JvRfcommWrite to avoid deadlock on concurrnet multi rfcomm connectoins - //concurrnet multi rfcomm connectoins - pthread_mutex_unlock(&slot_lock); + if (!(flags & SOCK_THREAD_FD_EXCEPTION) || (TEMP_FAILURE_RETRY(ioctl(slot->fd, FIONREAD, &size)) == 0 && size)) { BTA_JvRfcommWrite(slot->rfc_handle, slot->id); + } } else { LOG_ERROR("%s socket signaled for read while disconnected, slot: %d, channel: %d", __func__, slot->id, slot->scn); need_close = true; @@ -925,7 +923,7 @@ void btsock_rfc_signaled(UNUSED_ATTR int fd, int flags, uint32_t user_id) { if (need_close || (flags & SOCK_THREAD_FD_EXCEPTION)) { // Clean up if there's no data pending. int size = 0; - if (need_close || ioctl(slot->fd, FIONREAD, &size) != 0 || !size) + if (need_close || TEMP_FAILURE_RETRY(ioctl(slot->fd, FIONREAD, &size)) != 0 || !size) cleanup_rfc_slot(slot); } @@ -979,7 +977,7 @@ int bta_co_rfc_data_outgoing_size(void *user_data, int *size) { if (!slot) goto out; - if (ioctl(slot->fd, FIONREAD, size) == 0) { + if (TEMP_FAILURE_RETRY(ioctl(slot->fd, FIONREAD, size)) == 0) { ret = true; } else { LOG_ERROR("%s unable to determine bytes remaining to be read on fd %d: %s", __func__, slot->fd, strerror(errno)); @@ -1000,7 +998,7 @@ int bta_co_rfc_data_outgoing(void *user_data, uint8_t *buf, uint16_t size) { if (!slot) goto out; - int received = recv(slot->fd, buf, size, 0); + int received = TEMP_FAILURE_RETRY(recv(slot->fd, buf, size, 0)); if(received == size) { ret = true; } else { diff --git a/btif/src/btif_sock_thread.c b/btif/src/btif_sock_thread.c index 5dc0e3038..317b68a64 100644 --- a/btif/src/btif_sock_thread.c +++ b/btif/src/btif_sock_thread.c @@ -115,12 +115,12 @@ static pthread_mutex_t thread_slot_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP static inline void set_socket_blocking(int s, int blocking) { int opts; - opts = fcntl(s, F_GETFL); + opts = TEMP_FAILURE_RETRY(fcntl(s, F_GETFL)); if (opts<0) APPL_TRACE_ERROR("set blocking (%s)", strerror(errno)); if(blocking) opts &= ~O_NONBLOCK; else opts |= O_NONBLOCK; - if (fcntl(s, F_SETFL, opts) < 0) + if (TEMP_FAILURE_RETRY(fcntl(s, F_SETFL, opts)) < 0) APPL_TRACE_ERROR("set blocking (%s)", strerror(errno)); } @@ -162,7 +162,7 @@ static inline int accept_server_socket(int s) { struct sockaddr_un client_address; socklen_t clen; - int fd = accept(s, (struct sockaddr*)&client_address, &clen); + int fd = TEMP_FAILURE_RETRY(accept(s, (struct sockaddr*)&client_address, &clen)); APPL_TRACE_DEBUG("accepted fd:%d for server fd:%d", fd, s); return fd; } @@ -326,7 +326,7 @@ int btsock_thread_add_fd(int h, int fd, int type, int flags, uint32_t user_id) } sock_cmd_t cmd = {CMD_ADD_FD, fd, type, flags, user_id}; APPL_TRACE_DEBUG("adding fd:%d, flags:0x%x", fd, flags); - return send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd); + return TEMP_FAILURE_RETRY(send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0)) == sizeof(cmd); } bool btsock_thread_remove_fd_and_close(int thread_handle, int fd) @@ -343,7 +343,7 @@ bool btsock_thread_remove_fd_and_close(int thread_handle, int fd) } sock_cmd_t cmd = {CMD_REMOVE_FD, fd, 0, 0, 0}; - return send(ts[thread_handle].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd); + return TEMP_FAILURE_RETRY(send(ts[thread_handle].cmd_fdw, &cmd, sizeof(cmd), 0)) == sizeof(cmd); } int btsock_thread_post_cmd(int h, int type, const unsigned char* data, int size, uint32_t user_id) @@ -377,7 +377,7 @@ int btsock_thread_post_cmd(int h, int type, const unsigned char* data, int size, return FALSE; } } - return send(ts[h].cmd_fdw, cmd_send, size_send, 0) == size_send; + return TEMP_FAILURE_RETRY(send(ts[h].cmd_fdw, cmd_send, size_send, 0)) == size_send; } int btsock_thread_wakeup(int h) { @@ -392,7 +392,7 @@ int btsock_thread_wakeup(int h) return FALSE; } sock_cmd_t cmd = {CMD_WAKEUP, 0, 0, 0, 0}; - return send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd); + return TEMP_FAILURE_RETRY(send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0)) == sizeof(cmd); } int btsock_thread_exit(int h) { @@ -407,7 +407,7 @@ int btsock_thread_exit(int h) return FALSE; } sock_cmd_t cmd = {CMD_EXIT, 0, 0, 0, 0}; - if(send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd)) + if(TEMP_FAILURE_RETRY(send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0)) == sizeof(cmd)) { pthread_join(ts[h].thread_id, 0); pthread_mutex_lock(&thread_slot_lock); @@ -502,7 +502,7 @@ static int process_cmd_sock(int h) { sock_cmd_t cmd = {-1, 0, 0, 0, 0}; int fd = ts[h].cmd_fdr; - if(recv(fd, &cmd, sizeof(cmd), MSG_WAITALL) != sizeof(cmd)) + if(TEMP_FAILURE_RETRY(recv(fd, &cmd, sizeof(cmd), MSG_WAITALL)) != sizeof(cmd)) { APPL_TRACE_ERROR("recv cmd errno:%d", errno); return FALSE; @@ -611,7 +611,7 @@ static void *sock_poll_thread(void *arg) for(;;) { prepare_poll_fds(h, pfds); - int ret = poll(pfds, ts[h].poll_count, -1); + int ret = TEMP_FAILURE_RETRY(poll(pfds, ts[h].poll_count, -1)); if(ret == -1) { APPL_TRACE_ERROR("poll ret -1, exit the thread, errno:%d, err:%s", errno, strerror(errno)); diff --git a/btif/src/btif_sock_util.c b/btif/src/btif_sock_util.c index baa3ed3d9..ead113f13 100644 --- a/btif/src/btif_sock_util.c +++ b/btif/src/btif_sock_util.c @@ -74,7 +74,7 @@ int sock_send_all(int sock_fd, const uint8_t* buf, int len) int ret; while(s) { - do ret = send(sock_fd, buf, s, 0); + do ret = TEMP_FAILURE_RETRY(send(sock_fd, buf, s, 0)); while(ret < 0 && errno == EINTR); if(ret <= 0) { @@ -92,7 +92,7 @@ int sock_recv_all(int sock_fd, uint8_t* buf, int len) int ret = -1; while(r) { - do ret = recv(sock_fd, buf, r, MSG_WAITALL); + do ret = TEMP_FAILURE_RETRY(recv(sock_fd, buf, r, MSG_WAITALL)); while(ret < 0 && errno == EINTR); if(ret <= 0) { @@ -140,7 +140,7 @@ int sock_send_fd(int sock_fd, const uint8_t* buf, int len, int send_fd) msg.msg_iovlen = 1; do { - ret = sendmsg(sock_fd, &msg, MSG_NOSIGNAL); + ret = TEMP_FAILURE_RETRY(sendmsg(sock_fd, &msg, MSG_NOSIGNAL)); } while (ret < 0 && errno == EINTR); if (ret < 0) { -- cgit v1.2.3