sendf: fix CRLF conversion of input

When CRLF line end conversion was enabled (--crlf), input after the last
newline in the upload buffer was not sent, if the buffer contained a
newline.

Reported-by: vuonganh1993 on github
Fixes #14165
Closes #14169
This commit is contained in:
Stefan Eissing 2024-07-12 14:07:29 +02:00 committed by Daniel Stenberg
parent 6f0a8bd43c
commit 9e5b11c659
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 12 additions and 0 deletions

View File

@ -1025,6 +1025,12 @@ static CURLcode cr_lc_read(struct Curl_easy *data,
* the content length after having started the request... */
}
}
if(start < i) { /* leftover */
result = Curl_bufq_cwrite(&ctx->buf, buf + start, i - start, &n);
if(result)
return result;
}
}
DEBUGASSERT(!Curl_bufq_is_empty(&ctx->buf));

View File

@ -32,6 +32,7 @@ converted
with
the
--crlf option
%repeat[650 x 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789%0a]%
</file>
<command>
smtp://%HOSTIP:%SMTPPORT/%TESTNUMBER --mail-rcpt recipient@example.com --mail-from sender@example.com -T %LOGDIR/upload%TESTNUMBER --crlf
@ -60,6 +61,7 @@ converted
with
the
--crlf option
%repeat[650 x 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 %0a]%
.
</upload>
</verify>

View File

@ -1460,6 +1460,9 @@ sub singletest_check {
# cut off the final newline from the final line of the upload data
chomp($upload[-1]);
}
for my $line (@upload) {
subbase64(\$line);
}
# verify uploaded data
my @out = loadarray("$logdir/upload.$testnum");

View File

@ -127,6 +127,7 @@ sub subbase64 {
# decode %NN characters
my ($d, $n) = ($2, $1);
$d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$n =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
my $all = $d x $n;
$$thing =~ s/%%REPEAT%%/$all/;
}