• Show log

    Commit

  • Hash : 5ff8eb26
    Author : Azat Khuzhin
    Date : 2017-10-23T00:13:37

    Fix crashing http server when callback do not reply in place
    
    General http callback looks like:
      static void http_cb(struct evhttp_request *req, void *arg)
      {
        evhttp_send_reply(req, HTTP_OK, "Everything is fine", NULL);
      }
    
    And they will work fine becuase in this case http will write request
    first, and during write preparation it will disable *read callback* (in
    evhttp_write_buffer()), but if we don't reply immediately, for example:
      static void http_cb(struct evhttp_request *req, void *arg)
      {
        return;
      }
    
    This will leave connection in incorrect state, and if another request
    will be written to the same connection libevent will abort with:
      [err] ../http.c: illegal connection state 7
    
    Because it thinks that read for now is not possible, since there were no
    write.
    
    Fix this by disabling EV_READ entirely. We couldn't just reset callbacks
    because this will leave EOF detection, which we don't need, since user
    hasn't replied to callback yet.
    
    Reported-by: Cory Fields <cory@coryfields.com>