diff options
author | Nick Mathewson <nickm@torproject.org> | 2006-12-13 22:46:42 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2006-12-13 22:46:42 +0000 |
commit | 43e06eba8baab0fec003841f2fe6baafbe506e39 (patch) | |
tree | f2d7eae98ddc44dc1217ee4de00685a88cced18e | |
parent | 5cce710e2b86ffcaf3bad81b95ba94f26f1d2838 (diff) | |
download | tor-43e06eba8baab0fec003841f2fe6baafbe506e39.tar tor-43e06eba8baab0fec003841f2fe6baafbe506e39.tar.gz |
r11566@Kushana: nickm | 2006-12-13 17:46:24 -0500
Try to fix an assert failure in new write limiting code: make buffers.c aware of previous "forced" write sizes from tortls.
svn:r9105
-rw-r--r-- | src/common/tortls.c | 7 | ||||
-rw-r--r-- | src/common/tortls.h | 1 | ||||
-rw-r--r-- | src/or/buffers.c | 13 |
3 files changed, 17 insertions, 4 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c index 7f601258c..51c4abe24 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -850,7 +850,14 @@ tor_tls_get_pending_bytes(tor_tls_t *tls) return 0; #endif return SSL_pending(tls->ssl); +} +/** If <b>tls</b> requires that the next write be of a particular size, + * return that size. Otherwise, return 0. */ +size_t +tor_tls_get_forced_write_size(tor_tls_t *tls) +{ + return tls->wantwrite_n; } /** Return the number of bytes read across the underlying socket. */ diff --git a/src/common/tortls.h b/src/common/tortls.h index 2569abf79..dea072a33 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -41,6 +41,7 @@ int tor_tls_write(tor_tls_t *tls, char *cp, size_t n); int tor_tls_handshake(tor_tls_t *tls); int tor_tls_shutdown(tor_tls_t *tls); int tor_tls_get_pending_bytes(tor_tls_t *tls); +size_t tor_tls_get_forced_write_size(tor_tls_t *tls); unsigned long tor_tls_get_n_bytes_read(tor_tls_t *tls); unsigned long tor_tls_get_n_bytes_written(tor_tls_t *tls); diff --git a/src/or/buffers.c b/src/or/buffers.c index 55120c60a..aeca8b0ec 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -648,16 +648,21 @@ flush_buf(int s, buf_t *buf, size_t sz, size_t *buf_flushlen) return flushed; } -/** Helper for flush_buf_tls(): try to write <b>sz</b> bytes from buffer - * <b>buf</b> onto TLS object <b>tls</b>. On success, deduct the bytes - * written from *<b>buf_flushlen</b>. - * Return the number of bytes written on success, -1 on failure. +/** Helper for flush_buf_tls(): try to write <b>sz</b> bytes (or more if + * required by a previous write) from buffer <b>buf</b> onto TLS object + * <b>tls</b>. On success, deduct the bytes written from + * *<b>buf_flushlen</b>. Return the number of bytes written on success, -1 on + * failure. */ static INLINE int flush_buf_tls_impl(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen) { int r; + size_t forced; + forced = tor_tls_get_forced_write_size(tls); + if (forced < sz) + sz = forced; r = tor_tls_write(tls, buf->cur, sz); if (r < 0) { return r; |