mirror of
https://github.com/curl/curl.git
synced 2026-08-26 09:23:31 +03:00
sftp: fix range downloads in both SSH backends
When asking for the last N bytes of a file, and that size was larger than the file size, it would miss the first byte due to a logic error. The fixed range parser is now made a common function in the file now renamed to vssh.c (from curl_path.c) - used by both backends. Unit test 2605 verifies the parser. Reported-by: Stanislav Fort (Aisle Research) Closes #19460
This commit is contained in:
parent
67ef4a34f2
commit
c545e10fa7
12 changed files with 204 additions and 84 deletions
|
|
@ -40,6 +40,6 @@ TESTS_C = \
|
|||
unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c \
|
||||
unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c \
|
||||
unit1979.c unit1980.c \
|
||||
unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c \
|
||||
unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c \
|
||||
unit3200.c unit3205.c \
|
||||
unit3211.c unit3212.c unit3213.c unit3214.c
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
*
|
||||
***************************************************************************/
|
||||
#include "unitcheck.h"
|
||||
#include "vssh/curl_path.h"
|
||||
#include "vssh/vssh.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
static CURLcode test_unit2604(const char *arg)
|
||||
|
|
|
|||
113
tests/unit/unit2605.c
Normal file
113
tests/unit/unit2605.c
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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.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.
|
||||
*
|
||||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#include "unitcheck.h"
|
||||
#include "vssh/vssh.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
static CURLcode test_unit2605(const char *arg)
|
||||
{
|
||||
UNITTEST_BEGIN_SIMPLE
|
||||
|
||||
#ifdef USE_SSH
|
||||
CURL *curl;
|
||||
struct range {
|
||||
const char *r;
|
||||
curl_off_t filesize;
|
||||
curl_off_t start;
|
||||
curl_off_t size;
|
||||
CURLcode result;
|
||||
};
|
||||
|
||||
int i;
|
||||
struct range list[] = {
|
||||
{ "0-9", 100, 0, 10, CURLE_OK},
|
||||
{ "1-10", 100, 1, 10, CURLE_OK},
|
||||
{ "222222-222222", 300000, 222222, 1, CURLE_OK},
|
||||
{ "4294967296 - 4294967297", 4294967298, 4294967296, 2, CURLE_OK},
|
||||
{ "-10", 100, 90, 10, CURLE_OK},
|
||||
{ "-20", 100, 80, 20, CURLE_OK},
|
||||
{ "-1", 100, 99, 1, CURLE_OK},
|
||||
{ "-0", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "--2", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "-100", 100, 0, 100, CURLE_OK},
|
||||
{ "-101", 100, 0, 100, CURLE_OK},
|
||||
{ "-1000", 100, 0, 100, CURLE_OK},
|
||||
{ "2-1000", 100, 2, 98, CURLE_OK},
|
||||
{ ".2-3", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "+2-3", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "2 - 3", 100, 2, 2, CURLE_OK},
|
||||
{ " 2 - 3", 100, 2, 2, CURLE_RANGE_ERROR}, /* no leading space */
|
||||
{ "2 - 3 ", 100, 2, 2, CURLE_RANGE_ERROR}, /* no trailing space */
|
||||
{ "3-2", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "2.-3", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "-3-2", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "101-102", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ "0-", 100, 0, 100, CURLE_OK},
|
||||
{ "1-", 100, 1, 99, CURLE_OK},
|
||||
{ "99-", 100, 99, 1, CURLE_OK},
|
||||
{ "100-", 100, 0, 0, CURLE_RANGE_ERROR},
|
||||
{ NULL, 0, 0, 0, CURLE_OK }
|
||||
};
|
||||
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
for(i = 0; list[i].r; i++) {
|
||||
curl_off_t start;
|
||||
curl_off_t size;
|
||||
CURLcode result;
|
||||
curl_mprintf("%u: '%s' (file size: %" FMT_OFF_T ")\n",
|
||||
i, list[i].r, list[i].filesize);
|
||||
result = Curl_ssh_range(curl, list[i].r, list[i].filesize,
|
||||
&start, &size);
|
||||
if(result != list[i].result) {
|
||||
curl_mprintf("... returned %d\n", result);
|
||||
unitfail++;
|
||||
}
|
||||
if(!result) {
|
||||
if(start != list[i].start) {
|
||||
curl_mprintf("... start (%" FMT_OFF_T ") was not %" FMT_OFF_T " \n",
|
||||
start, list[i].start);
|
||||
unitfail++;
|
||||
}
|
||||
if(size != list[i].size) {
|
||||
curl_mprintf("... size (%" FMT_OFF_T ") was not %" FMT_OFF_T " \n",
|
||||
size, list[i].size);
|
||||
unitfail++;
|
||||
}
|
||||
}
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
|
||||
if(!unitfail)
|
||||
curl_mprintf("ok\n");
|
||||
|
||||
#endif
|
||||
|
||||
UNITTEST_END_SIMPLE
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue