]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: BDAT - Avoid ubsan warning about integer wrapping with large sizes
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 Mar 2026 08:43:51 +0000 (10:43 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 5 Mar 2026 09:43:52 +0000 (09:43 +0000)
src/lib-smtp/smtp-server-cmd-data.c

index 035abe2df004d881d083983eba409064cd17b51a..2002de221f879a58800582a6e07c453a6176d5ff 100644 (file)
@@ -579,7 +579,6 @@ int smtp_server_connection_data_chunk_add(struct smtp_server_cmd_ctx *cmd,
        const struct smtp_server_settings *set = &conn->set;
        struct smtp_server_command *command = cmd->cmd;
        struct cmd_data_context *data_cmd = command->data;
-       uoff_t new_size;
 
        i_assert(chunk != NULL);
        i_assert(data_cmd != NULL);
@@ -591,13 +590,13 @@ int smtp_server_connection_data_chunk_add(struct smtp_server_cmd_ctx *cmd,
                return -1;
 
        /* check message size increase early */
-       new_size = conn->state.data_size + chunk_size;
-       if (new_size < conn->state.data_size ||
-           (set->max_message_size > 0 && new_size > set->max_message_size)) {
+       if (UOFF_T_MAX - conn->state.data_size < chunk_size ||
+           (set->max_message_size > 0 &&
+            conn->state.data_size + chunk_size > set->max_message_size)) {
                smtp_server_cmd_data_size_limit_exceeded(cmd);
                return -1;
        }
-       conn->state.data_size = new_size;
+       conn->state.data_size += chunk_size;
 
        if (chunk_last) {
                smtp_server_command_remove_hook(