input: handle more error in pipe 58/318058/3
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 20 Sep 2024 09:26:33 +0000 (18:26 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Tue, 24 Sep 2024 06:11:17 +0000 (15:11 +0900)
Change-Id: Idbcce43537ed5cd8539b1100ef006a8b791854dc
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/inputmgr/e_input_backend.c

index 47754c9..85c1c91 100644 (file)
@@ -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)
 {