diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-05-09 21:46:41 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-05-09 21:46:41 +0100 |
commit | 6dd83c3d1009dcacd75fef9e503294bd48f2cf7f (patch) | |
tree | 886e804a513f80b9c5c85a1575792cc2d52af131 | |
parent | 687d60392ec948bc849e2fb7a81c67bbfacd41f6 (diff) | |
download | rspamd-6dd83c3d1009dcacd75fef9e503294bd48f2cf7f.tar.gz rspamd-6dd83c3d1009dcacd75fef9e503294bd48f2cf7f.zip |
Fix dealing with growing strings.
-rw-r--r-- | src/libutil/http.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/libutil/http.c b/src/libutil/http.c index 858ca5582..7ff83f5f0 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -520,6 +520,8 @@ rspamd_http_on_header_field (http_parser * parser, g_string_append_len (priv->header->combined, "\r\n", 2); priv->header->value->len = priv->header->combined->len - priv->header->name->len - 4; + priv->header->value->str = priv->header->combined->str + + priv->header->name->len + 2; DL_APPEND (priv->msg->headers, priv->header); rspamd_http_check_special_header (conn, priv); priv->header = g_slice_alloc (sizeof (struct rspamd_http_header)); @@ -552,11 +554,9 @@ rspamd_http_on_header_value (http_parser * parser, if (!priv->new_header) { priv->new_header = TRUE; - priv->header->name->str = priv->header->combined->str; - priv->header->name->len = priv->header->combined->len; g_string_append_len (priv->header->combined, ": ", 2); - priv->header->value->str = priv->header->combined->str + - priv->header->combined->len; + priv->header->name->str = priv->header->combined->str; + priv->header->name->len = priv->header->combined->len - 2; } g_string_append_len (priv->header->combined, at, length); @@ -575,6 +575,8 @@ rspamd_http_on_headers_complete (http_parser * parser) if (priv->header != NULL) { g_string_append_len (priv->header->combined, "\r\n", 2); + priv->header->value->str = priv->header->combined->str + + priv->header->name->len + 2; priv->header->value->len = priv->header->combined->len - priv->header->name->len - 4; DL_APPEND (priv->msg->headers, priv->header); @@ -1529,19 +1531,12 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, priv->out[0].iov_len = buf->len; if (encrypted) { + gint meth_offset, nonce_offset, mac_offset; + ottery_rand_bytes (nonce, sizeof (nonce)); memset (mac, 0, sizeof (mac)); + meth_offset = buf->len; - /* Add some used vars */ - meth_pos = buf->str + buf->len; - - /* XXX: bad bad bad - * TODO: - * XXX: - * Actually, g_string_append_len can break everything as it may do realloc, - * hence, we need to store offsets here instead of the direct pointers - * XXX: fix fix fix - */ if (conn->type == RSPAMD_HTTP_SERVER) { g_string_append_len (buf, repbuf, meth_len); } @@ -1551,10 +1546,12 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, meth_len - 1); g_string_append_c (buf, ' '); } - np = buf->str + buf->len; + + nonce_offset = buf->len; g_string_append_len (buf, nonce, sizeof (nonce)); - mp = buf->str + buf->len; + mac_offset = buf->len; g_string_append_len (buf, mac, sizeof (mac)); + /* Need to be encrypted */ if (conn->type == RSPAMD_HTTP_SERVER) { g_string_append (buf, "\r\n\r\n"); @@ -1562,6 +1559,10 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, else { g_string_append_len (buf, repbuf, preludelen); } + + meth_pos = buf->str + meth_offset; + np = buf->str + nonce_offset; + mp = buf->str + mac_offset; } |