tool_operate: refuse (--data or --form) and --continue-at combo

libcurl assumes that a --continue-at resumption is done to continue an
upload using the read callback and neither --data nor --form use
that and thus won't do what the user wants. Whatever the user wants
with this strange combination.

Add test 426 to verify.

Reported-by: Smackd0wn on github
Fixes #11081
Closes #11083
This commit is contained in:
Daniel Stenberg 2023-05-08 00:14:33 +02:00
parent fb7886b9c9
commit 39a33fcac0
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 54 additions and 9 deletions

View File

@ -1398,19 +1398,30 @@ static CURLcode single_transfer(struct GlobalConfig *global,
switch(config->httpreq) {
case HTTPREQ_SIMPLEPOST:
my_setopt_str(curl, CURLOPT_POSTFIELDS,
config->postfields);
my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
config->postfieldsize);
if(config->resume_from) {
errorf(global, "cannot mix --continue-at with --data\n");
result = CURLE_FAILED_INIT;
}
else {
my_setopt_str(curl, CURLOPT_POSTFIELDS,
config->postfields);
my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
config->postfieldsize);
}
break;
case HTTPREQ_MIMEPOST:
/* free previous remainders */
curl_mime_free(config->mimepost);
config->mimepost = NULL;
result = tool2curlmime(curl, config->mimeroot, &config->mimepost);
if(result)
break;
my_setopt_mimepost(curl, CURLOPT_MIMEPOST, config->mimepost);
if(config->resume_from) {
errorf(global, "cannot mix --continue-at with --form\n");
result = CURLE_FAILED_INIT;
}
else {
result = tool2curlmime(curl, config->mimeroot, &config->mimepost);
if(!result)
my_setopt_mimepost(curl, CURLOPT_MIMEPOST, config->mimepost);
}
break;
default:
break;

View File

@ -69,7 +69,7 @@ test390 test391 test392 test393 test394 test395 test396 test397 test398 \
test399 test400 test401 test402 test403 test404 test405 test406 test407 \
test408 test409 test410 test411 test412 test413 test414 test415 test416 \
test417 test418 test419 test420 test421 test422 test423 test424 test425 \
\
test426 \
test430 test431 test432 test433 test434 test435 test436 \
\
test440 test441 test442 test443 test444 test445 test446 \

34
tests/data/test426 Normal file
View File

@ -0,0 +1,34 @@
<testcase>
<info>
<keywords>
error detection
</keywords>
</info>
#
# Server-side
<reply>
</reply>
#
# Client-side
<client>
<server>
http
</server>
<name>
try --data with --continue-at
</name>
<command>
http://%HOSTIP:%HTTPPORT/%TESTNUMBER -d foobar -C 3
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<errorcode>
2
</errorcode>
</verify>
</testcase>