]> granicus.if.org Git - libevent/commitdiff
Prevent unsupported modifications to bufferevent_sock buffers.
authorNick Mathewson <nickm@torproject.org>
Wed, 8 Apr 2009 03:05:42 +0000 (03:05 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 8 Apr 2009 03:05:42 +0000 (03:05 +0000)
In particular, we don't allow adding any data to end front of inbuf
(we do that when we read), or removing it from the front of outbuf (we
drain data only when we write).

svn:r1144

ChangeLog
bufferevent_sock.c

index 01f0bb8b0e8eca96e670469a6d17173ef3f62b32..e74c864eec00aa521d48a51835b8552b325e3a01 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -144,7 +144,7 @@ Changes in current version:
  o New evutil_make_listen_socket_reuseable() to abstract SO_REUSEADDR.
  o New bind-to option to allow DNS clients to bind to an arbitrary port for outgoing requests.
  o evbuffers can now be "frozen" to prevent operations at one or both ends.
-
+ o Bufferevents now notice external attempts to add data to an inbuf or remove it from an outbuf, and stop them.
 
 Changes in 1.4.0:
  o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
index 679204d0b6c1e5f36ec8745fc048727c4fe82718..391d99b1ef5654fc1ac22ae7ef47e6a85d952e20 100644 (file)
@@ -134,7 +134,9 @@ bufferevent_readcb(evutil_socket_t fd, short event, void *arg)
                }
        }
 
+       evbuffer_unfreeze(input, 0);
        res = evbuffer_read(input, fd, howmuch);
+       evbuffer_freeze(input, 0);
 
        if (res == -1) {
                int err = evutil_socket_geterror(fd);
@@ -180,7 +182,9 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg)
        }
 
        if (EVBUFFER_LENGTH(bufev->output)) {
+           evbuffer_unfreeze(bufev->output, 1);
            res = evbuffer_write(bufev->output, fd);
+           evbuffer_freeze(bufev->output, 1);
            if (res == -1) {
                        int err = evutil_socket_geterror(fd);
                        if (EVUTIL_ERR_RW_RETRIABLE(err))
@@ -239,6 +243,9 @@ bufferevent_socket_new(struct event_base *base, evutil_socket_t fd,
 
        evbuffer_add_cb(bufev->output, bufferevent_socket_outbuf_cb, bufev);
 
+       evbuffer_freeze(bufev->input, 0);
+       evbuffer_freeze(bufev->output, 1);
+
        return bufev;
 }