From b2caaa0681f329eed317ffb6ae6927f4a539f0c1 Mon Sep 17 00:00:00 2001 From: Patrick Monnerat Date: Wed, 29 Jan 2020 05:30:08 +0100 Subject: mime: fix the binary encoder to handle large data properly New test 666 checks this is effective. As upload buffer size is significant in this kind of tests, shorten it in similar test 652. Fixes #4860 Reported-by: RuurdBeerstra on github --- tests/libtest/lib666.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 tests/libtest/lib666.c (limited to 'tests/libtest/lib666.c') diff --git a/tests/libtest/lib666.c b/tests/libtest/lib666.c new file mode 100644 index 000000000..c75936eeb --- /dev/null +++ b/tests/libtest/lib666.c @@ -0,0 +1,120 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "test.h" + +#include "memdebug.h" + +static char buffer[17000]; /* more than 16K */ + +int test(char *URL) +{ + CURL *curl = NULL; + CURLcode res = CURLE_OK; + curl_mime *mime = NULL; + curl_mimepart *part; + size_t i; + + /* Checks huge binary-encoded mime post. */ + + /* Create a buffer with pseudo-binary data. */ + for(i = 0; i < sizeof(buffer); i++) + if(i % 77 == 76) + buffer[i] = '\n'; + else + buffer[i] = (char) (0x41 + i % 26); /* A...Z */ + + if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + fprintf(stderr, "curl_global_init() failed\n"); + return TEST_ERR_MAJOR_BAD; + } + + curl = curl_easy_init(); + if(!curl) { + fprintf(stderr, "curl_easy_init() failed\n"); + res = (CURLcode) TEST_ERR_MAJOR_BAD; + goto test_cleanup; + } + + /* Build mime structure. */ + mime = curl_mime_init(curl); + if(!mime) { + fprintf(stderr, "curl_mime_init() failed\n"); + res = (CURLcode) TEST_ERR_MAJOR_BAD; + goto test_cleanup; + } + part = curl_mime_addpart(mime); + if(!part) { + fprintf(stderr, "curl_mime_addpart() failed\n"); + res = (CURLcode) TEST_ERR_MAJOR_BAD; + goto test_cleanup; + } + res = curl_mime_name(part, "upfile"); + if(res) { + fprintf(stderr, "curl_mime_name() failed\n"); + goto test_cleanup; + } + res = curl_mime_filename(part, "myfile.txt"); + if(res) { + fprintf(stderr, "curl_mime_filename() failed\n"); + goto test_cleanup; + } + res = curl_mime_data(part, buffer, sizeof(buffer)); + if(res) { + fprintf(stderr, "curl_mime_data() failed\n"); + goto test_cleanup; + } + res = curl_mime_encoder(part, "binary"); + if(res) { + fprintf(stderr, "curl_mime_encoder() failed\n"); + goto test_cleanup; + } + + /* First set the URL that is about to receive our mime mail. */ + test_setopt(curl, CURLOPT_URL, URL); + + /* Post form */ + test_setopt(curl, CURLOPT_MIMEPOST, mime); + + /* Shorten upload buffer. */ + test_setopt(curl, CURLOPT_UPLOAD_BUFFERSIZE, 16411L); + + /* get verbose debug output please */ + test_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* include headers in the output */ + test_setopt(curl, CURLOPT_HEADER, 1L); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + +test_cleanup: + + /* always cleanup */ + curl_easy_cleanup(curl); + + /* now cleanup the mime structure */ + curl_mime_free(mime); + + curl_global_cleanup(); + + return res; +} -- cgit v1.2.3