Changeset 840a13b790af535f43b9ae9b0b5128b4462dde9a

Show
Ignore:
Timestamp:
03/02/12 20:14:07 (2 years ago)
Author:
Philip Maddox <pmaddox@pmaddox.(none)>
git-committer:
Philip Maddox <pmaddox@pmaddox.(none)> 1330719247 -0500
git-parent:

[bb84bf791b8380b1ed2e0a65b2f595fab3bd711d]

git-author:
Philip Maddox <pmaddox@pmaddox.(none)> 1330719247 -0500
Message:

Fixed some issues with not reading full messages in external and getting into non-recoverable error states

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules/external.c

    rbb84bf7 r840a13b  
    242242      while (1) 
    243243      { 
    244         ret = read(e->fd, (char*)(&h)+inlen, expectlen - inlen); 
     244        ret = read(e->fd, ((char*)(&h))+inlen, expectlen - inlen); 
    245245        if (ret == -1) 
    246246        { 
    247247          if (errno == EAGAIN) 
    248248          { 
    249             return EVENTER_READ | EVENTER_EXCEPTION; 
     249            if (inlen == 0) 
     250              return EVENTER_READ | EVENTER_EXCEPTION; 
    250251          } 
    251252          else if (errno != EINTR) 
     
    273274      r.stdoutlen = h.stdoutlen; 
    274275      data->cr = calloc(sizeof(*data->cr), 1); 
     276      memset(data->cr, 0, sizeof(data->cr)); 
    275277      memcpy(data->cr, &r, sizeof(r)); 
    276278      data->cr->stdoutbuff = malloc(data->cr->stdoutlen); 
     279      memset(data->cr->stdoutbuff, 0, data->cr->stdoutlen); 
    277280    } 
    278281    if(data->cr) { 
  • src/modules/external_proc.c

    r8645a57 r840a13b  
    137137#define assert_read(fd, d, l) do { \ 
    138138  int len; \ 
    139   while((len = read(fd,d,l)) == -1 && errno == EINTR) finish_procs(); \ 
    140   assert(len == l); \ 
    141 } while(0) 
     139  int read_bytes = 0; \ 
     140  if (l == 0) break; \ 
     141  while (1) { \ 
     142    len = read(fd,(char*)d+read_bytes,l); \ 
     143    if (len == -1) { \ 
     144      if (errno == EINTR) { \ 
     145        finish_procs(); \ 
     146      } \ 
     147      else break; \ 
     148    } \ 
     149    else if (len == 0) { \ 
     150      break; \ 
     151    } \ 
     152    else { \ 
     153      read_bytes += len; \ 
     154      if (read_bytes >= l) break; \ 
     155    } \ 
     156  } \ 
     157  assert(read_bytes == l); \ 
     158} while (0) 
     159 
    142160#define assert_write(fd, s, l) do { \ 
    143161  int len; \ 
    144   while((len = write(fd,s,l)) == -1 && errno == EINTR) finish_procs(); \ 
    145   assert(len == l); \ 
    146 } while(0) 
     162  int written_bytes = 0; \ 
     163  if (l == 0) break; \ 
     164  while (1) { \ 
     165    len = write(fd,(char*)s+written_bytes,l); \ 
     166    if (len == -1) { \ 
     167      if (errno == EINTR) { \ 
     168        finish_procs(); \ 
     169      } \ 
     170      else break; \ 
     171    } \ 
     172    else if (len == 0) { \ 
     173      break; \ 
     174    } \ 
     175    else { \ 
     176      written_bytes += len; \ 
     177      if (written_bytes >= l) break; \ 
     178    } \ 
     179  } \ 
     180  assert(written_bytes == l); \ 
     181} while (0) 
    147182 
    148183int write_out_backing_fd(int ofd, int bfd) {