Subject: Re: [PATCH 2/3] imap-send: be more careful when casting to `curl_off_t`

From: Junio C Hamano <[email-masked]>
Date: Sun, 21 Sep 2025 08:06:10 -0700

"Johannes Schindelin via GitGitGadget" <[email-masked]>
writes:

> From: Johannes Schindelin <[email-masked]>
>
> When casting a `size_t` to `curl_off_t`, there is a currently uncommon
> chance that the value can be cut off (`curl_off_t` is supposed to be
> guaranteed to be 64-bit).

"64-bit" -> "signed 64-bit", per what <curl/system.h> says,
i.e. "curl_off_t MUST be typedef'ed to a 64-bit * wide signed
integral data type.", perhaps?

msgbuf.buf is a strbuf, so its .len member is of size_t (so is
prev_len); prev_len is how big the msgbuf.buf was before the code
added some stuff taken from all_msgs, possibly wrapping the result
in html, and converting lf to crlf, all only enlarging the buffer.
We are computing how much we bloated the msgbuf.buf relative to the
original here, so this subtraction should not suffer unsigned
wraparound.  Now thanks to the previous step, we can consistently
and safely cast size_t values to curl_off_t easily, which is nice.

Looking good.  Will queue.  Thanks.

> diff --git a/imap-send.c b/imap-send.c
> index 4bd5b8aa0d..26dda7f328 100644
> --- a/imap-send.c
> +++ b/imap-send.c
> @@ -1721,7 +1721,7 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
>  		lf_to_crlf(&msgbuf.buf);
>  
>  		curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
> -				 (curl_off_t)(msgbuf.buf.len-prev_len));
> +				 cast_size_t_to_curl_off_t(msgbuf.buf.len-prev_len));
>  
>  		res = curl_easy_perform(curl);