File fix-fep-hang_on.patch of Package uim_backports

--- ./fep/uim-fep.orig.c	2018-05-12 06:33:26.000000000 +0900
+++ ./fep/uim-fep.c	2020-07-27 09:55:59.000000000 +0900
@@ -108,6 +108,9 @@
 #ifdef HAVE_LIBUTIL_H
 #include <libutil.h>
 #endif
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
 
 #include <uim/uim.h>
 
@@ -863,7 +866,8 @@
       buf[len] = '\0';
       debug(("read \"%s\"\n", buf));
 
-      if (len >= 10 && !g_opt.print_key) {
+#define LARGE_INPUT_THRESHOLD 10
+      if (len >= LARGE_INPUT_THRESHOLD && !g_opt.print_key) {
         /* ペーストなどで大量に入力されたときは変換しない */
         if (!g_start_preedit) {
           write(s_master, buf, len);
@@ -871,6 +875,8 @@
       } else {
 
         int i;
+        char master_buf[LARGE_INPUT_THRESHOLD];
+        int master_buf_len = 0;
         for (i = 0; i < len; i++) {
           int key_len;
           int *key_and_key_len = escape_sequence2key(buf + i, len - i);
@@ -932,9 +938,11 @@
             }
             if (raw && !g_start_preedit) {
               if (key_state & UMod_Alt) {
-                write(s_master, buf + i - 1, key_len + 1);
+                memcpy(master_buf + master_buf_len, buf + i - 1, key_len + 1);
+                master_buf_len += key_len + 1;
               } else {
-                write(s_master, buf + i, key_len);
+                memcpy(master_buf + master_buf_len, buf + i, key_len);
+                master_buf_len += key_len;
               }
             }
           }
@@ -942,8 +950,10 @@
           key_state = 0;
           i += (key_len - 1);
         }
+        write(s_master, master_buf, master_buf_len);
       }
     }
+#undef LARGE_INPUT_THRESHOLD
 
 
     /* input from pty (child process) */
openSUSE Build Service is sponsored by