Author: iratqq
Date: Thu Jan 24 11:08:56 2008
New Revision: 5139

Modified:
  trunk/emacs/uim-el-helper-agent.c
  trunk/fep/uim-fep.c
  trunk/uim/prime.c
  trunk/uim/skk.c
  trunk/uim/uim-helper-client.c
  trunk/uim/uim-helper-server.c
  trunk/uim/uim-ipc.c

Log:
* emacs/uim-el-helper-agent.c (read_command)
* fep/uim-fep.c (main_loop, recover_loop)
* uim/prime.c (prime_read_msg_from_ud)
* uim/skk.c (search_line_from_server)
* uim/uim-helper-server.c (reflect_message_fragment)
* uim/uim-helper-client.c (uim_helper_read_proc)
* uim/uim-ipc.c (open_pipe_rw):
  OpenBSD manpage of read(2) says, error checks should
  explicitly test for -1. Some platforms allow for
  nbytes to range between SSIZE_MAX and SIZE_MAX - 2,
  in which case the return value of an error-free read()
  may appear as a negative number distinct from -1.


Modified: trunk/emacs/uim-el-helper-agent.c
==============================================================================
--- trunk/emacs/uim-el-helper-agent.c   (original)
+++ trunk/emacs/uim-el-helper-agent.c   Thu Jan 24 11:08:56 2008
@@ -206,7 +206,8 @@
  debug_printf(DEBUG_NOTE, "read command\n");

  do {
-       len = read(STDIN_FILENO, rbuf, sizeof(rbuf) - 1);
+ if ((len = read(STDIN_FILENO, rbuf, sizeof(rbuf) - 1)) == -1 || len == 0)
+          return; /* XXX */
        rbuf[len] = '\0';

        if (strlen(cmdbuf) + len + 1 > cmdbuf_len) {

Modified: trunk/fep/uim-fep.c
==============================================================================
--- trunk/fep/uim-fep.c (original)
+++ trunk/fep/uim-fep.c Thu Jan 24 11:08:56 2008
@@ -819,13 +819,17 @@
      int start, end;

#ifdef __CYGWIN32__
-      if ((len = read(s_setmode_fd, buf, sizeof(buf) - 1)) <= 0) {
+      if ((len = read(s_setmode_fd, buf, sizeof(buf) - 1)) == -1 ||
len == 0) {
        debug2(("pipe closed\n"));
        close(s_setmode_fd);
        s_setmode_fd = open(s_path_setmode, O_RDONLY | O_NONBLOCK);
      }
#else
-      len = read(s_setmode_fd, buf, sizeof(buf) - 1);
+      if ((len = read(s_setmode_fd, buf, sizeof(buf) - 1)) == -1 ||
len == 0) {
+        /* XXX: fatal */
+        debug2(("cannot read setmode file\n"));
+        return;
+      }
#endif

       for (end = len - 1; end >= 0 && !isdigit((unsigned
char)buf[end]); --end);
@@ -855,7 +859,7 @@
        focus_in();
      }

-      if ((len = read_stdin(buf, sizeof(buf) - 1)) <= 0) {
+      if ((len = read_stdin(buf, sizeof(buf) - 1)) == -1 || len == 0) {
        /* �����ˤϤ��ʤ��Ȼפ� */
        return;
      }
@@ -895,11 +899,18 @@
              t.tv_sec = 0;
              t.tv_usec = g_opt.timeout;
              if (my_select(g_win_in + 1, &fds, &t) > 0) {
-                len += read_stdin(buf + len, sizeof(buf) - len - 1);
-                buf[len] = '\0';
-                debug(("read_again \"%s\"\n", buf));
-                i--;
-                continue;
+                ssize_t nr;
+
+                if ((nr = read_stdin(buf + len, sizeof(buf) - len -
1)) != -1) {
+                  len += nr;
+                  buf[len] = '\0';
+                  debug(("read_again \"%s\"\n", buf));
+                  i--;
+                  continue;
+                } else {
+                  /* XXX: fatal */
+                  return;
+                }
              }
            }

@@ -940,7 +951,7 @@

    /* input from pty (child process) */
    if (!g_opt.print_key && FD_ISSET(s_master, &fds)) {
-      if ((len = read(s_master, buf, sizeof(buf) - 1)) <= 0) {
+      if ((len = read(s_master, buf, sizeof(buf) - 1)) == -1 || len ==
0) {
        /* �ҥץ�������λ���� */
        return;
      }
@@ -993,14 +1004,14 @@
      continue;
    }
    if (FD_ISSET(g_win_in, &fds)) {
-      if ((len = read(g_win_in, buf, sizeof(buf))) <= 0) {
+      if ((len = read(g_win_in, buf, sizeof(buf))) == -1 || len == 0) {
        /* �����ˤϤ��ʤ��Ȼפ� */
        return;
      }
      write(s_master, buf, len);
    }
    if (FD_ISSET(s_master, &fds)) {
-      if ((len = read(s_master, buf, sizeof(buf))) <= 0) {
+      if ((len = read(s_master, buf, sizeof(buf))) == -1 || len == 0) {
        /* �ҥץ�������λ���� */
        return;
      }

Modified: trunk/uim/prime.c
==============================================================================
--- trunk/uim/prime.c   (original)
+++ trunk/uim/prime.c   Thu Jan 24 11:08:56 2008
@@ -183,13 +183,12 @@
  read_buf  = uim_strdup("");

  for (;;) {
-    rc = read(fd, buf, sizeof(buf) - 1);
-    buf[rc] = '\0';
-
-    if (rc <= 0) {
+    if ((rc = read(fd, buf, sizeof(buf) - 1)) == -1) {
      perror("disconnected");
      if (errno == EAGAIN || errno == EINTR)
        continue;
+
+      buf[rc] = '\0';

      free(read_buf);
      clear_prime_fd();

Modified: trunk/uim/skk.c
==============================================================================
--- trunk/uim/skk.c     (original)
+++ trunk/uim/skk.c     Thu Jan 24 11:08:56 2008
@@ -727,6 +727,7 @@
  int n = 0, ret, len;
  char buf[SKK_SERV_BUFSIZ];
  char *line, *idx;
+  ssize_t nr;

  if (!(di->skkserv_state & SKK_SERV_CONNECTED)) {
    if (!((di->skkserv_state |= open_skkserv(di->skkserv_hostname,
@@ -751,15 +752,14 @@
  line = uim_malloc(len);
  snprintf(line, len, "%s ", idx);

-  if (read(skkservsock, &r, 1) <= 0) {
+  if ((nr = read(skkservsock, &r, 1)) == -1 || nr == 0) {
    skkserv_disconnected(di);
    return NULL;
  }

  if (r == '1') {  /* succeeded */
    while (1) {
-      ret = read(skkservsock, &r, 1);
-      if (ret <= 0) {
+      if ((nr = read(skkservsock, &r, 1)) == -1 || nr == 0) {
        skkserv_disconnected(di);
        return NULL;
      }
@@ -786,7 +786,8 @@
    free(line);
    return sl;
  } else {
-    while (read(skkservsock, &r, 1) > 0 && r != '\n');
+    while ((nr = read(skkservsock, &r, 1)) != -1 && nr != 0 && r != '\n')
+      ;
    return NULL;
  }
}

Modified: trunk/uim/uim-helper-client.c
==============================================================================
--- trunk/uim/uim-helper-client.c       (original)
+++ trunk/uim/uim-helper-client.c       Thu Jan 24 11:08:56 2008
@@ -185,7 +185,7 @@

  while (uim_helper_fd_readable(fd) > 0) {
    rc = read(fd, uim_recv_buf, sizeof(uim_recv_buf));
-    if (rc == 0 || (rc < 0 && errno != EAGAIN)) {
+    if (rc == 0 || (rc == -1 && errno != EAGAIN)) {
      uim_helper_close_client_fd(fd);
      return;
    } else if (rc > 0) {

Modified: trunk/uim/uim-helper-server.c
==============================================================================
--- trunk/uim/uim-helper-server.c       (original)
+++ trunk/uim/uim-helper-server.c       Thu Jan 24 11:08:56 2008
@@ -182,16 +182,17 @@
static int
reflect_message_fragment(struct client *cl)
{
-  int rc;
+  ssize_t rc;
  char *msg;

  /* do read */
  rc = read(cl->fd, read_buf, sizeof(read_buf));
-  if (rc <= 0) {
-    if (rc < 0 && (errno == EAGAIN || errno == EINTR))
+  if (rc == -1) {
+    if (errno == EAGAIN || errno == EINTR)
      return 0;
    return -1;
-  }
+  } else if (rc == 0)
+    return -1;

  cl->rbuf = uim_helper_buffer_append(cl->rbuf, read_buf, rc);


Modified: trunk/uim/uim-ipc.c
==============================================================================
--- trunk/uim/uim-ipc.c (original)
+++ trunk/uim/uim-ipc.c Thu Jan 24 11:08:56 2008
@@ -69,6 +69,7 @@
  int pipe_fd[2];
  pid_t pid;
  int res;
+  ssize_t nr;

  if (pipe(pipe_fd) < 0)
    return (pid_t)-1;
@@ -120,7 +121,9 @@
      *fw = fdopen(fdw[1], "w");
  }

-  read(pipe_fd[0], &pid, sizeof(pid_t));
+  if ((nr = read(pipe_fd[0], &pid, sizeof(pid_t))) == -1 || nr == 0)
+    goto err0;
+
  close(pipe_fd[0]);
  close(pipe_fd[1]);

Reply via email to