You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "Oknet Xu (JIRA)" <ji...@apache.org> on 2016/06/12 13:02:20 UTC

[jira] [Created] (TS-4522) did not check EPIPE on write_to_net_io

Oknet Xu created TS-4522:
----------------------------

             Summary: did not check EPIPE on write_to_net_io
                 Key: TS-4522
                 URL: https://issues.apache.org/jira/browse/TS-4522
             Project: Traffic Server
          Issue Type: Bug
          Components: Core, Network
            Reporter: Oknet Xu


On a closed socket fd:
read(socketfd) return 0
write(socketfd) return EPIPE

In the write_to_net_io, we check the return value of write() with the same way to read().

{code}
    if (!r || r == -ECONNRESET) {
{code}

The bug makes no VC_EVENT_EOS callbacked while write_to_net_io, but VC_EVENT_ERROR instead. 

full code here:
{code}
  int64_t r = vc->load_buffer_and_write(towrite, buf, total_written, needs);

  if (total_written > 0) {
    NET_SUM_DYN_STAT(net_write_bytes_stat, total_written);
    s->vio.ndone += total_written;
  }

  // check for errors
  if (r <= 0) { // if the socket was not ready,add to WaitList
    if (r == -EAGAIN || r == -ENOTCONN) {
      NET_INCREMENT_DYN_STAT(net_calls_to_write_nodata_stat);
      if ((needs & EVENTIO_WRITE) == EVENTIO_WRITE) {
        vc->write.triggered = 0;
        nh->write_ready_list.remove(vc);
        write_reschedule(nh, vc);
      }
      if ((needs & EVENTIO_READ) == EVENTIO_READ) {
        vc->read.triggered = 0;
        nh->read_ready_list.remove(vc);
        read_reschedule(nh, vc);
      }
      return;
    }
    if (!r || r == -ECONNRESET) {
      vc->write.triggered = 0;
      write_signal_done(VC_EVENT_EOS, nh, vc);
      return;
    }
    vc->write.triggered = 0;
    write_signal_error(nh, vc, (int)-total_written);
    return;
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)