aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2006-12-13 22:46:42 +0000
committerNick Mathewson <nickm@torproject.org>2006-12-13 22:46:42 +0000
commit43e06eba8baab0fec003841f2fe6baafbe506e39 (patch)
treef2d7eae98ddc44dc1217ee4de00685a88cced18e
parent5cce710e2b86ffcaf3bad81b95ba94f26f1d2838 (diff)
downloadtor-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.c7
-rw-r--r--src/common/tortls.h1
-rw-r--r--src/or/buffers.c13
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;