]> granicus.if.org Git - libevent/commit
Fix bufferevent_pair to properly set BEV_EVENT_{READING,WRITING} on flush.
authorDavid Paschich <davidp@navdy.com>
Sun, 22 May 2016 04:05:11 +0000 (21:05 -0700)
committerAzat Khuzhin <a3at.mail@gmail.com>
Fri, 17 Jun 2016 15:21:45 +0000 (18:21 +0300)
commit285188963d06b5838148b961ab7b6bb5c6e3b0e5
tree9055bd264b93294c4920bf330454408f906b3437
parent2a4bf294704034f6a7a962931d3028fe6c0b0ac8
Fix bufferevent_pair to properly set BEV_EVENT_{READING,WRITING} on flush.

Here's some fun. From `bufferevent.h`:
  ```
  #define BEV_EVENT_READING 0x01 /**< error encountered while reading */
  #define BEV_EVENT_WRITING 0x02 /**< error encountered while writing */
  ```

And from `event.h`:
  ```
  /** Wait for a socket or FD to become readable */
  #define EV_READ 0x02
  /** Wait for a socket or FD to become writeable */
  #define EV_WRITE 0x04
  ```

Library users have to be very careful to get this right; it turns out, the
library itself got this wrong in the `bufferevent_pair` code. It appears that
in most of the code, only `BEV_EVENT_FINISHED` will indicate whether it's read
or write; on error or timeout, it appears that "both" is assumed and not set in
the callback. I read through all the other places where `BEV_EVENT_FINISHED` is
passed to an event callback; it appears that the pair code is the only spot
that got it wrong.

azat: add TT_FORK to avoid breaking clean env, and rebase commit message
(copied from #359)
Fixes: #359
bufferevent_pair.c
test/regress_bufferevent.c