Loading src/or/buffers.c +21 −0 Original line number Diff line number Diff line Loading @@ -1988,6 +1988,27 @@ peek_buf_has_control0_command(buf_t *buf) return 0; } #ifdef USE_BUFFEREVENTS int peek_evbuffer_has_control0_command(struct evbuffer *buf) { int result = 0; if (evbuffer_get_length(buf) >= 4) { int free_out = 0; char *data = NULL; size_t n = inspect_evbuffer(buf, &data, 4, &free_out); uint16_t cmd; tor_assert(n >= 4); cmd = ntohs(get_uint16(data+2)); if (cmd <= 0x14) result = 1; if (free_out) tor_free(data); } return result; } #endif /** Return the index within <b>buf</b> at which <b>ch</b> first appears, * or -1 if <b>ch</b> does not appear on buf. */ static off_t Loading src/or/buffers.h +1 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ int fetch_from_evbuffer_http(struct evbuffer *buf, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete); int peek_evbuffer_has_control0_command(struct evbuffer *buf); #endif void assert_buf_ok(buf_t *buf); Loading src/or/connection.c +18 −0 Original line number Diff line number Diff line Loading @@ -2785,6 +2785,24 @@ connection_fetch_from_buf_line(connection_t *conn, char *data, } } /** As fetch_from_buf_http, but fetches from a conncetion's input buffer_t or * its bufferevent as appropriate. */ int connection_fetch_from_buf_http(connection_t *conn, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete) { IF_HAS_BUFFEREVENT(conn, { struct evbuffer *input = bufferevent_get_input(conn->bufev); return fetch_from_evbuffer_http(input, headers_out, max_headerlen, body_out, body_used, max_bodylen, force_complete); }) ELSE_IF_NO_BUFFEREVENT { return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, body_out, body_used, max_bodylen, force_complete); } } /** Return conn-\>outbuf_flushlen: how many bytes conn wants to flush * from its outbuf. */ int Loading src/or/connection.h +4 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,10 @@ int connection_handle_read(connection_t *conn); int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); int connection_fetch_from_buf_line(connection_t *conn, char *data, size_t *data_len); int connection_fetch_from_buf_http(connection_t *conn, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete); int connection_wants_to_flush(connection_t *conn); int connection_outbuf_too_full(connection_t *conn); Loading src/or/connection_or.c +9 −3 Original line number Diff line number Diff line Loading @@ -1253,12 +1253,18 @@ connection_or_write_var_cell_to_buf(const var_cell_t *cell, conn->timestamp_last_added_nonpadding = approx_time(); } /** See whether there's a variable-length cell waiting on <b>conn</b>'s /** See whether there's a variable-length cell waiting on <b>or_conn</b>'s * inbuf. Return values as for fetch_var_cell_from_buf(). */ static int connection_fetch_var_cell_from_buf(or_connection_t *conn, var_cell_t **out) connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out) { return fetch_var_cell_from_buf(conn->_base.inbuf, out, conn->link_proto); connection_t *conn = TO_CONN(or_conn); IF_HAS_BUFFEREVENT(conn, { struct evbuffer *input = bufferevent_get_input(conn->bufev); return fetch_var_cell_from_evbuffer(input, out, or_conn->link_proto); }) ELSE_IF_NO_BUFFEREVENT { return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); } } /** Process cells from <b>conn</b>'s inbuf. Loading Loading
src/or/buffers.c +21 −0 Original line number Diff line number Diff line Loading @@ -1988,6 +1988,27 @@ peek_buf_has_control0_command(buf_t *buf) return 0; } #ifdef USE_BUFFEREVENTS int peek_evbuffer_has_control0_command(struct evbuffer *buf) { int result = 0; if (evbuffer_get_length(buf) >= 4) { int free_out = 0; char *data = NULL; size_t n = inspect_evbuffer(buf, &data, 4, &free_out); uint16_t cmd; tor_assert(n >= 4); cmd = ntohs(get_uint16(data+2)); if (cmd <= 0x14) result = 1; if (free_out) tor_free(data); } return result; } #endif /** Return the index within <b>buf</b> at which <b>ch</b> first appears, * or -1 if <b>ch</b> does not appear on buf. */ static off_t Loading
src/or/buffers.h +1 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ int fetch_from_evbuffer_http(struct evbuffer *buf, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete); int peek_evbuffer_has_control0_command(struct evbuffer *buf); #endif void assert_buf_ok(buf_t *buf); Loading
src/or/connection.c +18 −0 Original line number Diff line number Diff line Loading @@ -2785,6 +2785,24 @@ connection_fetch_from_buf_line(connection_t *conn, char *data, } } /** As fetch_from_buf_http, but fetches from a conncetion's input buffer_t or * its bufferevent as appropriate. */ int connection_fetch_from_buf_http(connection_t *conn, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete) { IF_HAS_BUFFEREVENT(conn, { struct evbuffer *input = bufferevent_get_input(conn->bufev); return fetch_from_evbuffer_http(input, headers_out, max_headerlen, body_out, body_used, max_bodylen, force_complete); }) ELSE_IF_NO_BUFFEREVENT { return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, body_out, body_used, max_bodylen, force_complete); } } /** Return conn-\>outbuf_flushlen: how many bytes conn wants to flush * from its outbuf. */ int Loading
src/or/connection.h +4 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,10 @@ int connection_handle_read(connection_t *conn); int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); int connection_fetch_from_buf_line(connection_t *conn, char *data, size_t *data_len); int connection_fetch_from_buf_http(connection_t *conn, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete); int connection_wants_to_flush(connection_t *conn); int connection_outbuf_too_full(connection_t *conn); Loading
src/or/connection_or.c +9 −3 Original line number Diff line number Diff line Loading @@ -1253,12 +1253,18 @@ connection_or_write_var_cell_to_buf(const var_cell_t *cell, conn->timestamp_last_added_nonpadding = approx_time(); } /** See whether there's a variable-length cell waiting on <b>conn</b>'s /** See whether there's a variable-length cell waiting on <b>or_conn</b>'s * inbuf. Return values as for fetch_var_cell_from_buf(). */ static int connection_fetch_var_cell_from_buf(or_connection_t *conn, var_cell_t **out) connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out) { return fetch_var_cell_from_buf(conn->_base.inbuf, out, conn->link_proto); connection_t *conn = TO_CONN(or_conn); IF_HAS_BUFFEREVENT(conn, { struct evbuffer *input = bufferevent_get_input(conn->bufev); return fetch_var_cell_from_evbuffer(input, out, or_conn->link_proto); }) ELSE_IF_NO_BUFFEREVENT { return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); } } /** Process cells from <b>conn</b>'s inbuf. Loading