Re: [PATCH 2/3] imap-send: be more careful when casting to `curl_off_t`
From: Junio C Hamano <hidden>
Date: 2025-09-21 15:06:12
"Johannes Schindelin via GitGitGadget" [off-list ref] writes:
From: Johannes Schindelin <redacted> 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.
quoted hunk
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);