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) */