From: Jihoon Kim Date: Fri, 20 Sep 2024 09:26:33 +0000 (+0900) Subject: input: handle more error in pipe X-Git-Tag: accepted/tizen/unified/20240926.050059~22 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bbce407e49e5de5503d5fcc1eb03ed5bef35fbf8;p=platform%2Fupstream%2Fenlightenment.git input: handle more error in pipe Change-Id: Idbcce43537ed5cd8539b1100ef006a8b791854dc Signed-off-by: Jihoon Kim --- diff --git a/src/bin/inputmgr/e_input_backend.c b/src/bin/inputmgr/e_input_backend.c index 47754c9..85c1c91 100644 --- a/src/bin/inputmgr/e_input_backend.c +++ b/src/bin/inputmgr/e_input_backend.c @@ -1038,7 +1038,7 @@ input_thread_pipe_read(int fd, void *data, size_t data_length) ssize_t read_bytes = 0; do { - if (data_length < read_bytes) + if (data_length <= read_bytes) break; ret = read(fd, data + read_bytes, data_length - read_bytes); @@ -1047,18 +1047,21 @@ input_thread_pipe_read(int fd, void *data, size_t data_length) break; else if (ret >= 0) read_bytes += ret; - else if ((ret == -1) && (errno == EPIPE)) + else if (ret == -1) { - ERR("error when reading data in pipe\n"); + switch (errno) + { + case EINTR: + case EAGAIN: + ERR("error when reading data in pipe. try again\n"); + continue; + default: + ERR("unhandled error (ret: %zd, errno: %d)\n", ret, errno); + break; + } + return -1; } - else if ((ret == -1) && (errno == EINTR)) - ERR("error when reading data in pipe. try again\n"); - else - { - ERR("unhandled error (ret: %zd, errno: %d)\n", ret, errno); - return -1; - } } while (retry--); return 0; @@ -1073,7 +1076,7 @@ input_thread_pipe_write(void *data, size_t data_length) ssize_t written_bytes = 0; do { - if (data_length < written_bytes) + if (data_length <= written_bytes) break; ret = write(g_input_backend->main_to_input_thread_pipe_fd[1], data + written_bytes, data_length - written_bytes); @@ -1085,18 +1088,36 @@ input_thread_pipe_write(void *data, size_t data_length) written_bytes += ret; ERR("write %zd bytes in pipe. try more\n", ret); } - else if ((ret == -1) && (errno == EPIPE)) + else if (ret < 0) { - ERR("error when writing data in pipe\n"); + switch (errno) + { + case EPIPE: + ERR("error when writing data in pipe\n"); + break; + case EINTR: + case EAGAIN: + ERR("error when writing data in pipe. try again\n"); + continue; + case EACCES: + ERR("error when writing data in pipe. permission denied\n"); + break; + case EFAULT: + ERR("error when writing data in pipe. Bad buf outside address space\n"); + break; + case EBADF: + ERR("error when writing data in pipe. Bad fd\n"); + break; + case EINVAL: + ERR("error when writing data in pipe. Invalid value\n"); + break; + default: + ERR("unhandled error (ret: %zd, errno: %d)\n", ret, errno); + break; + } + return -1; } - else if ((ret == -1) && (errno == EINTR)) - ERR("error when writing data in pipe. try again\n"); - else - { - ERR("unhandled error (ret: %zd, errno: %d)\n", ret, errno); - return -1; - } } while (retry--); return 0; @@ -1114,7 +1135,10 @@ _pipe_recv_handler(GIOChannel *source, GIOCondition condition, gpointer user_dat { ret = input_thread_pipe_read(input->main_to_input_thread_pipe_fd[0], &order, sizeof(E_Input_Thread_Request_Data)); if (ret < 0) - return TRUE; + { + ERR("Error when reading header pipe"); + return TRUE; + } data = calloc(1, sizeof(char)*order.data_length); EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_TRUE); @@ -1122,6 +1146,7 @@ _pipe_recv_handler(GIOChannel *source, GIOCondition condition, gpointer user_dat ret = input_thread_pipe_read(input->main_to_input_thread_pipe_fd[0], data, order.data_length); if (ret < 0) { + ERR("Error when reading body pipe"); free(data); return TRUE; } @@ -1435,7 +1460,6 @@ e_input_backend_thread_safe_call(E_Input_Thread_Safe_Call_Cb cb, void *data, siz } } - static int _device_open_no_pending(const char *device, int flags) {