]> source.dussan.org Git - rspamd.git/commitdiff
Fix the code for updated strings in HTTP library.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 14:58:57 +0000 (15:58 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 14:58:57 +0000 (15:58 +0100)
src/controller.c
src/http_proxy.c
src/libserver/protocol.c
src/libserver/task.c
src/libserver/worker_util.c
src/plugins/fuzzy_check.c
src/plugins/surbl.c

index c68cd1bdceec1b191098f7ccf868642b6430b798..6daf0bc57a742518aa165be501bdcca23af4b100 100644 (file)
@@ -252,7 +252,7 @@ rspamd_encrypted_password_get_str (const gchar * password, gsize skip,
 
 static gboolean
 rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
-               const GString * password, const gchar * check,
+               const rspamd_ftok_t * password, const gchar * check,
                const struct rspamd_controller_pbkdf *pbkdf,
                gboolean is_enable)
 {
@@ -267,7 +267,7 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
        /* First of all check cached versions to save resources */
        if (is_enable && ctx->cached_enable_password.len != 0) {
                if (password->len != ctx->cached_enable_password.len ||
-                               !rspamd_constant_memcmp (password->str,
+                               !rspamd_constant_memcmp (password->begin,
                                                ctx->cached_enable_password.begin, password->len)) {
                        msg_info_ctx ("incorrect or absent enable password has been specified");
                        return FALSE;
@@ -277,7 +277,7 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
        }
        else if (!is_enable && ctx->cached_password.len != 0) {
                if (password->len != ctx->cached_password.len ||
-                               !rspamd_constant_memcmp (password->str,
+                               !rspamd_constant_memcmp (password->begin,
                                                ctx->cached_password.begin, password->len)) {
                        msg_info_ctx ("incorrect or absent password has been specified");
                        return FALSE;
@@ -314,7 +314,7 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
                }
 
                local_key = g_alloca (pbkdf->key_len);
-               rspamd_cryptobox_pbkdf (password->str, password->len,
+               rspamd_cryptobox_pbkdf (password->begin, password->len,
                                salt_decoded, salt_len,
                                local_key, pbkdf->key_len, pbkdf->rounds);
 
@@ -335,7 +335,7 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
                        /* Mmap region */
                        m = mmap (NULL, password->len, PROT_WRITE,
                                        MAP_PRIVATE | MAP_ANON, -1, 0);
-                       memcpy (m, password->str, password->len);
+                       memcpy (m, password->begin, password->len);
                        (void)mprotect (m, password->len, PROT_READ);
                        (void)mlock (m, password->len);
                        cache->begin = m;
@@ -353,8 +353,8 @@ static gboolean rspamd_controller_check_password(
                struct rspamd_http_message *msg, gboolean is_enable)
 {
        const gchar *check;
-       const GString *password;
-       GString lookup;
+       const rspamd_ftok_t *password;
+       rspamd_ftok_t lookup;
        GHashTable *query_args = NULL;
        struct rspamd_controller_worker_ctx *ctx = session->ctx;
        gboolean check_normal = TRUE, check_enable = TRUE, ret = TRUE,
@@ -381,7 +381,7 @@ static gboolean rspamd_controller_check_password(
                /* Try to get password from query args */
                query_args = rspamd_http_message_parse_query (msg);
 
-               lookup.str = (gchar *)"password";
+               lookup.begin = (gchar *)"password";
                lookup.len = sizeof ("password") - 1;
 
                password = g_hash_table_lookup (query_args, &lookup);
@@ -415,7 +415,7 @@ static gboolean rspamd_controller_check_password(
                        }
                        if (check != NULL) {
                                if (!rspamd_is_encrypted_password (check, &pbkdf)) {
-                                       ret = rspamd_constant_memcmp (password->str, check, password->len);
+                                       ret = rspamd_constant_memcmp (password->begin, check, password->len);
                                }
                                else {
                                        ret = rspamd_check_encrypted_password (ctx, password, check,
@@ -437,7 +437,7 @@ static gboolean rspamd_controller_check_password(
                        if (ctx->password != NULL) {
                                check = ctx->password;
                                if (!rspamd_is_encrypted_password (check, &pbkdf)) {
-                                       check_normal = rspamd_constant_memcmp (password->str, check,
+                                       check_normal = rspamd_constant_memcmp (password->begin, check,
                                                        password->len);
                                }
                                else {
@@ -453,7 +453,7 @@ static gboolean rspamd_controller_check_password(
                        if (ctx->enable_password != NULL) {
                                check = ctx->enable_password;
                                if (!rspamd_is_encrypted_password (check, &pbkdf)) {
-                                       check_enable = rspamd_constant_memcmp (password->str, check,
+                                       check_enable = rspamd_constant_memcmp (password->begin, check,
                                                        password->len);
                                }
                                else {
@@ -748,11 +748,10 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
        struct rspamd_controller_session *session = conn_ent->ud;
        GList *cur;
        struct rspamd_map *map;
-       const GString *idstr;
-       gchar *errstr;
+       const rspamd_ftok_t *idstr;
        struct stat st;
        gint fd;
-       guint32 id;
+       gulong id;
        gboolean found = FALSE;
        struct rspamd_http_message *reply;
 
@@ -769,8 +768,7 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
                return 0;
        }
 
-       id = strtoul (idstr->str, &errstr, 10);
-       if (*errstr != '\0' && !g_ascii_isspace (*errstr)) {
+       if (!rspamd_strtoul (idstr->begin, idstr->len, &id)) {
                msg_info_session ("invalid map id");
                rspamd_controller_send_error (conn_ent, 400, "400 invalid map id");
                return 0;
@@ -802,7 +800,7 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
        reply = rspamd_http_new_message (HTTP_RESPONSE);
        reply->date = time (NULL);
        reply->code = 200;
-       reply->body = g_string_sized_new (st.st_size);
+       reply->body = rspamd_fstring_sized_new (st.st_size);
 
        /* Read the whole buffer */
        if (read (fd, reply->body->str, st.st_size) == -1) {
@@ -814,7 +812,6 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
        }
 
        reply->body->len = st.st_size;
-       reply->body->str[reply->body->len] = '\0';
 
        close (fd);
 
@@ -925,7 +922,7 @@ rspamd_controller_handle_graph (
        GHashTable *query;
        struct rspamd_controller_session *session = conn_ent->ud;
        struct rspamd_controller_worker_ctx *ctx;
-       GString srch, *value;
+       rspamd_ftok_t srch, *value;
        struct rspamd_rrd_query_result *rrd_result;
        gulong i, j, ts, start_row, cnt, t;
        ucl_object_t *res, *elt[4], *data_elt;
@@ -951,7 +948,7 @@ rspamd_controller_handle_graph (
        }
 
        query = rspamd_http_message_parse_query (msg);
-       srch.str = (gchar *)"type";
+       srch.begin = (gchar *)"type";
        srch.len = 4;
 
        if (query == NULL || (value = g_hash_table_lookup (query, &srch)) == NULL) {
@@ -965,16 +962,16 @@ rspamd_controller_handle_graph (
                return 0;
        }
 
-       if (strncmp (value->str, "hourly", value->len) == 0) {
+       if (strncmp (value->begin, "hourly", value->len) == 0) {
                rra_num = rra_hourly;
        }
-       else if (strncmp (value->str, "daily", value->len) == 0) {
+       else if (strncmp (value->begin, "daily", value->len) == 0) {
                rra_num = rra_hourly;
        }
-       else if (strncmp (value->str, "weekly", value->len) == 0) {
+       else if (strncmp (value->begin, "weekly", value->len) == 0) {
                rra_num = rra_hourly;
        }
-       else if (strncmp (value->str, "monthly", value->len) == 0) {
+       else if (strncmp (value->begin, "monthly", value->len) == 0) {
                rra_num = rra_monthly;
        }
 
@@ -1640,9 +1637,8 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
        GList *cur;
        struct rspamd_map *map;
        struct rspamd_controller_worker_ctx *ctx;
-       const GString *idstr;
-       gchar *errstr;
-       guint32 id;
+       const rspamd_ftok_t *idstr;
+       gulong id;
        gboolean found = FALSE;
        gint fd;
 
@@ -1668,9 +1664,8 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
                return 0;
        }
 
-       id = strtoul (idstr->str, &errstr, 10);
-       if (*errstr != '\0' && !g_ascii_isspace (*errstr)) {
-               msg_info_session ("invalid map id: %v", idstr);
+       if (!rspamd_strtoul (idstr->begin, idstr->len, &id)) {
+               msg_info_session ("invalid map id: %T", idstr);
                rspamd_controller_send_error (conn_ent, 400, "Map id is invalid");
                return 0;
        }
@@ -1983,7 +1978,7 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent,
 
        cmd = g_hash_table_lookup (session->ctx->custom_commands, msg->url->str);
        if (cmd == NULL || cmd->handler == NULL) {
-               msg_err_session ("custom command %v has not been found", msg->url);
+               msg_err_session ("custom command %V has not been found", msg->url);
                rspamd_controller_send_error (conn_ent, 404, "No command associated");
                return 0;
        }
index f71adc3f6d1fc04380a4107960d9b06a9c67495e..6570e01cce36b618869e9c15b9be4d4c6b083f32 100644 (file)
@@ -295,7 +295,7 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn,
 {
        struct http_proxy_session *session = conn->ud;
        struct rspamd_http_upstream *backend = NULL;
-       const GString *host;
+       const rspamd_ftok_t *host;
        gchar hostbuf[512];
 
        if (!session->replied) {
@@ -305,7 +305,7 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn,
                        backend = session->ctx->default_upstream;
                }
                else {
-                       rspamd_strlcpy (hostbuf, host->str, sizeof (hostbuf));
+                       rspamd_strlcpy (hostbuf, host->begin, MIN(host->len + 1, sizeof (hostbuf)));
                        backend = g_hash_table_lookup (session->ctx->upstreams, hostbuf);
 
                        if (backend == NULL) {
index 74b229c83c469527108d0aa3ab7cd436a8de8ff3..ba2599f5ff7e78ca5640b2c8e09680f71d8341e4 100644 (file)
@@ -313,7 +313,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                        task->deliver_to);
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -328,7 +328,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                debug_task ("read hostname header, value: %s", task->hostname);
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -336,12 +336,12 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                case 'F':
                        if (g_ascii_strncasecmp (headern, FROM_HEADER, hlen) == 0) {
                                if (!rspamd_task_add_sender (task, hv->str)) {
-                                       msg_err_task ("bad from header: '%v'", hv);
+                                       msg_err_task ("bad from header: '%V'", hv);
                                        validh = FALSE;
                                }
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -357,7 +357,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                }
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -368,7 +368,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                debug_task ("read queue_id header, value: %s", task->queue_id);
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -376,13 +376,13 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                case 'R':
                        if (g_ascii_strncasecmp (headern, RCPT_HEADER, hlen) == 0) {
                                if (!rspamd_task_add_recipient (task, hv->str)) {
-                                       msg_err_task ("bad from header: '%v'", h->value);
+                                       msg_err_task ("bad from header: '%V'", h->value);
                                        validh = FALSE;
                                }
-                               debug_task ("read rcpt header, value: %v", hv);
+                               debug_task ("read rcpt header, value: %V", hv);
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -390,14 +390,14 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                case 'I':
                        if (g_ascii_strncasecmp (headern, IP_ADDR_HEADER, hlen) == 0) {
                                if (!rspamd_parse_inet_address (&task->from_addr, hv->str)) {
-                                       msg_err_task ("bad ip header: '%v'", hv);
+                                       msg_err_task ("bad ip header: '%V'", hv);
                                        return FALSE;
                                }
-                               debug_task ("read IP header, value: %v", hv);
+                               debug_task ("read IP header, value: %V", hv);
                                has_ip = TRUE;
                        }
                        else {
-                               debug_task ("wrong header: %v", hn);
+                               debug_task ("wrong header: %V", hn);
                                validh = FALSE;
                        }
                        break;
@@ -463,7 +463,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                task->message_len = strtoul (hv->str, NULL, 10);
 
                                if (task->message_len == 0) {
-                                       msg_err_task ("Invalid message length header: %v", hv);
+                                       msg_err_task ("Invalid message length header: %V", hv);
                                        validh = FALSE;
                                }
                                else {
@@ -475,7 +475,7 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                        }
                        break;
                default:
-                       debug_task ("unknown header: %v", hn);
+                       debug_task ("unknown header: %V", hn);
                        validh = FALSE;
                        break;
                }
index 6d0eca2a2a5df7d8bec7c6c8f2a5bb0bc2e29058..907260af2740796c69374d8bbf6982352026ce48 100644 (file)
@@ -71,15 +71,15 @@ rspamd_task_new (struct rspamd_worker *worker)
                new_task->re_cache);
        new_task->raw_headers = g_hash_table_new (rspamd_strcase_hash,
                        rspamd_strcase_equal);
-       new_task->request_headers = g_hash_table_new_full (rspamd_gstring_icase_hash,
-               rspamd_gstring_icase_equal, rspamd_gstring_free_hard,
-               rspamd_gstring_free_hard);
+       new_task->request_headers = g_hash_table_new_full (rspamd_ftok_icase_hash,
+                       rspamd_ftok_icase_equal, rspamd_fstring_mapped_ftok_free,
+                       rspamd_fstring_mapped_ftok_free);
        rspamd_mempool_add_destructor (new_task->task_pool,
                (rspamd_mempool_destruct_t) g_hash_table_unref,
                new_task->request_headers);
-       new_task->reply_headers = g_hash_table_new_full (rspamd_gstring_icase_hash,
-                       rspamd_gstring_icase_equal, rspamd_gstring_free_hard,
-                       rspamd_gstring_free_hard);
+       new_task->reply_headers = g_hash_table_new_full (rspamd_ftok_icase_hash,
+                       rspamd_ftok_icase_equal, rspamd_fstring_mapped_ftok_free,
+                       rspamd_fstring_mapped_ftok_free);
        rspamd_mempool_add_destructor (new_task->task_pool,
                (rspamd_mempool_destruct_t) g_hash_table_unref,
                new_task->reply_headers);
@@ -261,6 +261,7 @@ rspamd_task_load_message (struct rspamd_task *task,
        ucl_object_t *control_obj;
        gchar filepath[PATH_MAX], *fp;
        gint fd, flen;
+       rspamd_ftok_t srch, *tok;
        gpointer map;
        struct stat st;
 
@@ -268,11 +269,19 @@ rspamd_task_load_message (struct rspamd_task *task,
                rspamd_protocol_handle_headers (task, msg);
        }
 
-       if (task->flags & RSPAMD_TASK_FLAG_FILE) {
-               g_assert (task->msg.len > 0);
+       srch.begin = "file";
+       srch.len = 4;
+       tok = g_hash_table_lookup (task->request_headers, &srch);
 
-               r = rspamd_strlcpy (filepath, task->msg.begin,
-                               MIN (sizeof (filepath), task->msg.len + 1));
+       if (tok == NULL) {
+               srch.begin = "path";
+               srch.len = 4;
+               tok = g_hash_table_lookup (task->request_headers, &srch);
+       }
+
+       if (tok) {
+               r = rspamd_strlcpy (filepath, tok->begin,
+                               MIN (sizeof (filepath), tok->len + 1));
 
                rspamd_decode_url (filepath, filepath, r + 1);
                flen = strlen (filepath);
index eee200a41834a7f934af326649588e60502f5719..ddd72acb94247db254453b6b234506a8922d2c48 100644 (file)
@@ -278,14 +278,14 @@ rspamd_controller_send_error (struct rspamd_http_connection_entry *entry,
        msg = rspamd_http_new_message (HTTP_RESPONSE);
 
        va_start (args, error_msg);
-       msg->status = g_string_sized_new (128);
-       rspamd_vprintf_gstring (msg->status, error_msg, args);
+       msg->status = rspamd_fstring_sized_new (128);
+       rspamd_vprintf_fstring (&msg->status, error_msg, args);
        va_end (args);
 
        msg->date = time (NULL);
        msg->code = code;
-       msg->body = g_string_sized_new (128);
-       rspamd_printf_gstring (msg->body, "{\"error\":\"%v\"}", msg->status);
+       msg->body = rspamd_fstring_sized_new (128);
+       rspamd_printf_fstring (&msg->body, "{\"error\":\"%V\"}", msg->status);
        rspamd_http_connection_reset (entry->conn);
        rspamd_http_connection_write_message (entry->conn,
                msg,
@@ -307,7 +307,7 @@ rspamd_controller_send_string (struct rspamd_http_connection_entry *entry,
        msg = rspamd_http_new_message (HTTP_RESPONSE);
        msg->date = time (NULL);
        msg->code = 200;
-       msg->body = g_string_new (str);
+       msg->body = rspamd_fstring_new_init (str, strlen (str));
        rspamd_http_connection_reset (entry->conn);
        rspamd_http_connection_write_message (entry->conn,
                msg,
@@ -329,8 +329,8 @@ rspamd_controller_send_ucl (struct rspamd_http_connection_entry *entry,
        msg = rspamd_http_new_message (HTTP_RESPONSE);
        msg->date = time (NULL);
        msg->code = 200;
-       msg->body = g_string_sized_new (BUFSIZ);
-       rspamd_ucl_emit_gstring (obj, UCL_EMIT_JSON_COMPACT, msg->body);
+       msg->body = rspamd_fstring_sized_new (BUFSIZ);
+       rspamd_ucl_emit_fstring (obj, UCL_EMIT_JSON_COMPACT, &msg->body);
        rspamd_http_connection_reset (entry->conn);
        rspamd_http_connection_write_message (entry->conn,
                msg,
index bc4822b173652146d6b80bbf9293f63098d98d7e..6ca18aaf88424af4aecedb0693cefb80903ad8b1 100644 (file)
@@ -1549,26 +1549,23 @@ static gboolean
 fuzzy_controller_handler (struct rspamd_http_connection_entry *conn_ent,
        struct rspamd_http_message *msg, struct module_ctx *ctx, gint cmd)
 {
-       const GString *arg;
-       gchar *err_str;
-       gint value = 1, flag = 0;
+       const rspamd_ftok_t *arg;
+       glong value = 1, flag = 0;
 
        /* Get size */
        arg = rspamd_http_message_find_header (msg, "Weight");
        if (arg) {
                errno = 0;
-               value = strtol (arg->str, &err_str, 10);
-               if (*err_str != '\0' && *err_str != '\r') {
-                       msg_info ("error converting numeric argument %v", arg);
-                       value = 0;
+
+               if (!rspamd_strtol (arg->begin, arg->len, &value)) {
+                       msg_info ("error converting numeric argument %T", arg);
                }
        }
        arg = rspamd_http_message_find_header (msg, "Flag");
        if (arg) {
                errno = 0;
-               flag = strtol (arg->str, &err_str, 10);
-               if (*err_str != '\0' && *err_str != '\r') {
-                       msg_info ("error converting numeric argument %v", arg);
+               if (!rspamd_strtol (arg->begin, arg->len, &flag)) {
+                       msg_info ("error converting numeric argument %T", arg);
                        flag = 0;
                }
        }
index 0c1d6887f07d177b2a0cae340e94aac9e2ae40ac..7ce58ab1d64c86f018645fab975632d8430422f0 100644 (file)
@@ -988,7 +988,7 @@ surbl_redirector_finish (struct rspamd_http_connection *conn,
        struct redirector_param *param = (struct redirector_param *)conn->ud;
        struct rspamd_task *task;
        gint r, urllen;
-       const GString *hdr;
+       const rspamd_ftok_t *hdr;
        gchar *urlstr;
 
        task = param->task;
@@ -1003,7 +1003,7 @@ surbl_redirector_finish (struct rspamd_http_connection *conn,
                        urllen = hdr->len;
                        urlstr = rspamd_mempool_alloc (param->task->task_pool,
                                        urllen + 1);
-                       rspamd_strlcpy (urlstr, hdr->str, urllen + 1);
+                       rspamd_strlcpy (urlstr, hdr->begin, urllen + 1);
                        r = rspamd_url_parse (param->url, urlstr, urllen,
                                        param->task->task_pool);
 
@@ -1066,7 +1066,7 @@ register_redirector_call (struct rspamd_url *url, struct rspamd_task *task,
                        RSPAMD_HTTP_CLIENT_SIMPLE,
                        RSPAMD_HTTP_CLIENT, NULL);
        msg = rspamd_http_new_message (HTTP_REQUEST);
-       g_string_assign (msg->url, struri (url));
+       msg->url = rspamd_fstring_assign (msg->url, struri (url), strlen (struri (url)));
        param->sock = s;
        param->suffix = suffix;
        param->redirector = selected;