Compare commits

..

5 Commits

Author SHA1 Message Date
Daniel Stenberg
ec99918e4d
fixup try odd work-around 2025-02-28 23:21:52 +01:00
Daniel Stenberg
6d6841c5db
fixup simple subst test instead 2025-02-28 23:00:33 +01:00
Daniel Stenberg
678f65590f
fixup try it a little different 2025-02-28 13:47:32 +01:00
Daniel Stenberg
43d80a773c
fixup junk 2025-02-28 13:03:43 +01:00
Daniel Stenberg
6dd72cfc8e
winbuild: use $(strip) to trim off spaces
strip: https://learn.microsoft.com/en-us/cpp/build/reference/nmake-function-strip?view=msvc-170

Trim off spaces when getting the list of objects in an attempt to avoid
reaching "too long line".

Ref: #16508
2025-02-28 13:01:01 +01:00
33 changed files with 214 additions and 278 deletions

View File

@ -123,10 +123,9 @@ jobs:
compiler: clang compiler: clang
configure: --enable-debug --with-openssl=$(brew --prefix openssl) configure: --enable-debug --with-openssl=$(brew --prefix openssl)
tflags: --test-event tflags: --test-event
- name: 'quictls libssh2 !ldap 10.15' - name: 'OpenSSL libssh2 !ldap 10.15'
compiler: clang compiler: clang
install: quictls configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix openssl)
configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix quictls) LDFLAGS="${LDFLAGS} -L$(brew --prefix quictls)/lib"
macos-version-min: '10.15' macos-version-min: '10.15'
# cmake # cmake
- name: 'OpenSSL gsasl rtmp AppleIDN' - name: 'OpenSSL gsasl rtmp AppleIDN'
@ -137,9 +136,9 @@ jobs:
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DUSE_APPLE_IDN=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DUSE_APPLE_IDN=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy
clang-tidy: true clang-tidy: true
chkprefill: _chkprefill chkprefill: _chkprefill
- name: 'quictls +static libssh +examples' - name: 'OpenSSL +static libssh +examples'
install: quictls libssh install: libssh
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix quictls) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON
- name: 'SecureTransport debug' - name: 'SecureTransport debug'
generate: -DCURL_USE_SECTRANSP=ON -DENABLE_DEBUG=ON generate: -DCURL_USE_SECTRANSP=ON -DENABLE_DEBUG=ON
macos-version-min: '10.8' macos-version-min: '10.8'
@ -185,12 +184,11 @@ jobs:
run: | run: |
echo ${{ matrix.build.generate && 'ninja' || 'automake libtool' }} \ echo ${{ matrix.build.generate && 'ninja' || 'automake libtool' }} \
pkgconf libpsl libssh2 \ pkgconf libpsl libssh2 \
${{ !matrix.build.clang-tidy && 'libnghttp2 stunnel' || '' }} \ ${{ !matrix.build.clang-tidy && 'nghttp2 stunnel' || '' }} \
${{ matrix.build.install }} | xargs -Ix -n1 echo brew '"x"' > /tmp/Brewfile ${{ matrix.build.install }} | xargs -Ix -n1 echo brew '"x"' > /tmp/Brewfile
while [[ $? == 0 ]]; do for i in 1 2 3; do brew update && brew bundle install --no-lock --file /tmp/Brewfile && break 2 || { echo Error: wait to try again; sleep 10; } done; false Too many retries; done while [[ $? == 0 ]]; do for i in 1 2 3; do brew update && brew bundle install --no-lock --file /tmp/Brewfile && break 2 || { echo Error: wait to try again; sleep 10; } done; false Too many retries; done
- name: 'brew unlink openssl' - name: 'brew unlink openssl'
if: ${{ contains(matrix.build.install, 'libressl') || contains(matrix.build.install, 'quictls') }}
run: | run: |
if test -d $(brew --prefix)/include/openssl; then if test -d $(brew --prefix)/include/openssl; then
brew unlink openssl brew unlink openssl
@ -345,7 +343,7 @@ jobs:
if: ${{ contains(matrix.build.name, '+examples') }} if: ${{ contains(matrix.build.name, '+examples') }}
run: | run: |
if [ -n '${{ matrix.build.generate }}' ]; then if [ -n '${{ matrix.build.generate }}' ]; then
cmake --build bld --verbose --target curl-examples cmake --build bld --target curl-examples --verbose
else else
make -C bld examples V=1 make -C bld examples V=1
fi fi

View File

@ -352,12 +352,13 @@ endif()
if(WIN32) if(WIN32)
option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF) option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF)
if(CURL_STATIC_CRT AND MSVC) if(CURL_STATIC_CRT AND MSVC)
if(BUILD_STATIC_CURL OR NOT BUILD_CURL_EXE) if(BUILD_STATIC_CURL)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
string(APPEND CMAKE_C_FLAGS_RELEASE " -MT") string(APPEND CMAKE_C_FLAGS_RELEASE " -MT")
string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd") string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd")
else() else()
message(WARNING "Static CRT requires static or no curl executable.") message(WARNING "Static CRT requires curl executable built with static libcurl "
"(BUILD_STATIC_LIBS=ON and BUILD_STATIC_CURL=ON).")
endif() endif()
endif() endif()
endif() endif()

View File

@ -238,7 +238,7 @@ target_link_libraries(my_target PRIVATE CURL::libcurl)
- `CURL_LIBCURL_VERSIONED_SYMBOLS`: Enable libcurl versioned symbols. Default: `OFF` - `CURL_LIBCURL_VERSIONED_SYMBOLS`: Enable libcurl versioned symbols. Default: `OFF`
- `CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX`: Override default versioned symbol prefix. Default: `<TLS-BACKEND>_` or `MULTISSL_` - `CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX`: Override default versioned symbol prefix. Default: `<TLS-BACKEND>_` or `MULTISSL_`
- `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF` - `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF`
- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static or no curl executable). Default: `OFF` - `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static curl executable). Default: `OFF`
- `CURL_TARGET_WINDOWS_VERSION`: Minimum target Windows version as hex string. - `CURL_TARGET_WINDOWS_VERSION`: Minimum target Windows version as hex string.
- `CURL_TEST_BUNDLES`: Bundle `libtest` and `unittest` tests into single binaries. Default: `OFF` - `CURL_TEST_BUNDLES`: Bundle `libtest` and `unittest` tests into single binaries. Default: `OFF`
- `CURL_WERROR`: Turn compiler warnings into errors. Default: `OFF` - `CURL_WERROR`: Turn compiler warnings into errors. Default: `OFF`

View File

@ -247,11 +247,11 @@ local system or network, the bar is raised. If a local user wrongfully has
elevated rights on your system enough to attack curl, they can probably elevated rights on your system enough to attack curl, they can probably
already do much worse harm and the problem is not really in curl. already do much worse harm and the problem is not really in curl.
## Debug & Experiments ## Experiments
Vulnerabilities in features which are off by default (in the build) and Vulnerabilities in features which are off by default (in the build) and
documented as experimental, or exist only in debug mode, are not eligible for a documented as experimental, are not eligible for a reward and we do not
reward and we do not consider them security problems. consider them security problems.
## URL inconsistencies ## URL inconsistencies

View File

@ -298,19 +298,14 @@ int main(void)
filter = (struct connection_filter *)calloc(1, sizeof(*filter)); filter = (struct connection_filter *)calloc(1, sizeof(*filter));
if(!filter) if(!filter)
return 1; exit(1);
if(curl_global_init(CURL_GLOBAL_DEFAULT)) { if(curl_global_init(CURL_GLOBAL_DEFAULT))
free(filter); exit(1);
return 1;
}
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) { if(!curl)
curl_global_cleanup(); exit(1);
free(filter);
return 1;
}
/* Set the target URL */ /* Set the target URL */
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost"); curl_easy_setopt(curl, CURLOPT_URL, "http://localhost");

View File

@ -79,12 +79,12 @@ int main(int argc, char *argv[])
fprintf(stderr, fprintf(stderr,
"\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n", "\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n",
appname); appname);
return 1; exit(1);
case 'v': case 'v':
case 'V': case 'V':
fprintf(stderr, "\r%s %s - %s\n", fprintf(stderr, "\r%s %s - %s\n",
appname, CHKSPEED_VERSION, curl_version()); appname, CHKSPEED_VERSION, curl_version());
return 1; exit(1);
case 'a': case 'a':
case 'A': case 'A':
prtall = 1; prtall = 1;

View File

@ -34,7 +34,8 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/mprintf.h> #include <curl/mprintf.h>
static int print_cookies(CURL *curl) static void
print_cookies(CURL *curl)
{ {
CURLcode res; CURLcode res;
struct curl_slist *cookies; struct curl_slist *cookies;
@ -46,7 +47,7 @@ static int print_cookies(CURL *curl)
if(res != CURLE_OK) { if(res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n",
curl_easy_strerror(res)); curl_easy_strerror(res));
return 1; exit(1);
} }
nc = cookies; nc = cookies;
i = 1; i = 1;
@ -59,8 +60,6 @@ static int print_cookies(CURL *curl)
printf("(none)\n"); printf("(none)\n");
} }
curl_slist_free_all(cookies); curl_slist_free_all(cookies);
return 0;
} }
int int

View File

@ -422,18 +422,18 @@ static int init_fifo(GlobalInfo *g)
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
return 1; exit(1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
return 1; exit(1);
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
return 1; exit(1);
} }
g->fifofd = sockfd; g->fifofd = sockfd;
@ -478,13 +478,13 @@ int main(int argc, char **argv)
g.epfd = epoll_create1(EPOLL_CLOEXEC); g.epfd = epoll_create1(EPOLL_CLOEXEC);
if(g.epfd == -1) { if(g.epfd == -1) {
perror("epoll_create1 failed"); perror("epoll_create1 failed");
return 1; exit(1);
} }
g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
if(g.tfd == -1) { if(g.tfd == -1) {
perror("timerfd_create failed"); perror("timerfd_create failed");
return 1; exit(1);
} }
memset(&its, 0, sizeof(struct itimerspec)); memset(&its, 0, sizeof(struct itimerspec));
@ -496,8 +496,7 @@ int main(int argc, char **argv)
ev.data.fd = g.tfd; ev.data.fd = g.tfd;
epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev); epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev);
if(init_fifo(&g)) init_fifo(&g);
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
/* setup the generic multi interface options we want */ /* setup the generic multi interface options we want */
@ -522,7 +521,7 @@ int main(int argc, char **argv)
} }
else { else {
perror("epoll_wait"); perror("epoll_wait");
return 1; exit(1);
} }
} }

View File

@ -406,18 +406,18 @@ static int init_fifo(GlobalInfo *g)
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
return 1; exit(1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
return 1; exit(1);
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
return 1; exit(1);
} }
g->input = fdopen(sockfd, "r"); g->input = fdopen(sockfd, "r");
@ -436,8 +436,7 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo)); memset(&g, 0, sizeof(GlobalInfo));
g.loop = ev_default_loop(0); g.loop = ev_default_loop(0);
if(init_fifo(&g)) init_fifo(&g);
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
ev_timer_init(&g.timer_event, timer_cb, 0., 0.); ev_timer_init(&g.timer_event, timer_cb, 0., 0.);

View File

@ -392,21 +392,21 @@ int init_fifo(void)
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
return CURL_SOCKET_BAD; exit(1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
return CURL_SOCKET_BAD; exit(1);
} }
socket = open(fifo, O_RDWR | O_NONBLOCK, 0); socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(socket == CURL_SOCKET_BAD) { if(socket == -1) {
perror("open"); perror("open");
return socket; exit(1);
} }
MSG_OUT("Now, pipe some URL's into > %s\n", fifo); MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
@ -421,8 +421,6 @@ int main(void)
GIOChannel* ch; GIOChannel* ch;
fd = init_fifo(); fd = init_fifo();
if(fd == CURL_SOCKET_BAD)
return 1;
ch = g_io_channel_unix_new(fd); ch = g_io_channel_unix_new(fd);
g_io_add_watch(ch, G_IO_IN, fifo_cb, g); g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
gmain = g_main_loop_new(NULL, FALSE); gmain = g_main_loop_new(NULL, FALSE);

View File

@ -403,18 +403,18 @@ static int init_fifo(GlobalInfo *g)
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
return 1; exit(1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
return 1; exit(1);
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
return 1; exit(1);
} }
g->input = fdopen(sockfd, "r"); g->input = fdopen(sockfd, "r");
@ -440,8 +440,7 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo)); memset(&g, 0, sizeof(GlobalInfo));
g.evbase = event_base_new(); g.evbase = event_base_new();
if(init_fifo(&g)) init_fifo(&g);
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g); evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g);

View File

@ -94,7 +94,7 @@ static bool init(CURL *&conn, const char *url)
if(conn == NULL) { if(conn == NULL) {
fprintf(stderr, "Failed to create CURL connection\n"); fprintf(stderr, "Failed to create CURL connection\n");
return false; exit(EXIT_FAILURE);
} }
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer); code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
@ -270,7 +270,7 @@ int main(int argc, char *argv[])
if(argc != 2) { if(argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]); fprintf(stderr, "Usage: %s <url>\n", argv[0]);
return EXIT_FAILURE; exit(EXIT_FAILURE);
} }
curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_init(CURL_GLOBAL_DEFAULT);
@ -279,7 +279,7 @@ int main(int argc, char *argv[])
if(!init(conn, argv[1])) { if(!init(conn, argv[1])) {
fprintf(stderr, "Connection initialization failed\n"); fprintf(stderr, "Connection initialization failed\n");
return EXIT_FAILURE; exit(EXIT_FAILURE);
} }
// Retrieve content for the URL // Retrieve content for the URL
@ -289,7 +289,7 @@ int main(int argc, char *argv[])
if(code != CURLE_OK) { if(code != CURLE_OK) {
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer); fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
return EXIT_FAILURE; exit(EXIT_FAILURE);
} }
// Parse the (assumed) HTML code // Parse the (assumed) HTML code

View File

@ -142,7 +142,7 @@ int my_trace(CURL *handle, curl_infotype type,
return 0; return 0;
} }
static int setup(struct transfer *t, int num) static void setup(struct transfer *t, int num)
{ {
char filename[128]; char filename[128];
CURL *hnd; CURL *hnd;
@ -155,7 +155,7 @@ static int setup(struct transfer *t, int num)
if(!t->out) { if(!t->out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n", fprintf(stderr, "error: could not open file %s for writing: %s\n",
filename, strerror(errno)); filename, strerror(errno));
return 1; exit(1);
} }
/* write to this file */ /* write to this file */
@ -179,7 +179,6 @@ static int setup(struct transfer *t, int num)
/* wait for pipe connection to confirm */ /* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L); curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif #endif
return 0;
} }
/* /*
@ -205,8 +204,7 @@ int main(int argc, char **argv)
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) { for(i = 0; i < num_transfers; i++) {
if(setup(&trans[i], i)) setup(&trans[i], i);
return 1;
/* add the individual transfer */ /* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].easy); curl_multi_add_handle(multi_handle, trans[i].easy);

View File

@ -200,7 +200,7 @@ static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
return retcode; return retcode;
} }
static int setup(struct input *i, int num, const char *upload) static void setup(struct input *i, int num, const char *upload)
{ {
FILE *out; FILE *out;
char url[256]; char url[256];
@ -209,15 +209,14 @@ static int setup(struct input *i, int num, const char *upload)
curl_off_t uploadsize; curl_off_t uploadsize;
CURL *hnd; CURL *hnd;
hnd = i->hnd = NULL; hnd = i->hnd = curl_easy_init();
i->num = num; i->num = num;
curl_msnprintf(filename, 128, "dl-%d", num); curl_msnprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb"); out = fopen(filename, "wb");
if(!out) { if(!out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n", upload, fprintf(stderr, "error: could not open file %s for writing: %s\n", upload,
strerror(errno)); strerror(errno));
return 1; exit(1);
} }
curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num); curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num);
@ -226,8 +225,7 @@ static int setup(struct input *i, int num, const char *upload)
if(stat(upload, &file_info)) { if(stat(upload, &file_info)) {
fprintf(stderr, "error: could not stat file %s: %s\n", upload, fprintf(stderr, "error: could not stat file %s: %s\n", upload,
strerror(errno)); strerror(errno));
fclose(out); exit(1);
return 1;
} }
uploadsize = file_info.st_size; uploadsize = file_info.st_size;
@ -236,12 +234,9 @@ static int setup(struct input *i, int num, const char *upload)
if(!i->in) { if(!i->in) {
fprintf(stderr, "error: could not open file %s for reading: %s\n", upload, fprintf(stderr, "error: could not open file %s for reading: %s\n", upload,
strerror(errno)); strerror(errno));
fclose(out); exit(1);
return 1;
} }
hnd = i->hnd = curl_easy_init();
/* write to this file */ /* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out); curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
@ -274,7 +269,6 @@ static int setup(struct input *i, int num, const char *upload)
/* wait for pipe connection to confirm */ /* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L); curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif #endif
return 0;
} }
/* /*
@ -307,8 +301,7 @@ int main(int argc, char **argv)
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) { for(i = 0; i < num_transfers; i++) {
if(setup(&trans[i], i, filename)) setup(&trans[i], i, filename);
return 1;
/* add the individual transfer */ /* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].hnd); curl_multi_add_handle(multi_handle, trans[i].hnd);

View File

@ -959,7 +959,7 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
return CURLE_SSL_CONNECT_ERROR; return CURLE_SSL_CONNECT_ERROR;
} }
} }
else { else if(ssl_config->key_passwd) {
const unsigned int supported_key_encryption_algorithms = const unsigned int supported_key_encryption_algorithms =
GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR | GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR |
GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES | GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES |
@ -974,12 +974,22 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
supported_key_encryption_algorithms); supported_key_encryption_algorithms);
if(rc != GNUTLS_E_SUCCESS) { if(rc != GNUTLS_E_SUCCESS) {
failf(data, failf(data,
"error reading X.509 %skey file: %s", "error reading X.509 potentially-encrypted key file: %s",
ssl_config->key_passwd ? "potentially-encrypted " : "",
gnutls_strerror(rc)); gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR; return CURLE_SSL_CONNECT_ERROR;
} }
} }
else {
if(gnutls_certificate_set_x509_key_file(
gtls->shared_creds->creds,
config->clientcert,
ssl_config->key ? ssl_config->key : config->clientcert,
gnutls_do_file_type(ssl_config->cert_type) ) !=
GNUTLS_E_SUCCESS) {
failf(data, "error reading X.509 key or certificate file");
return CURLE_SSL_CONNECT_ERROR;
}
}
} }
#ifdef USE_GNUTLS_SRP #ifdef USE_GNUTLS_SRP

View File

@ -482,7 +482,7 @@ AC_DEFUN([CURL_COMPILER_WORKS_IFELSE], [
#endif #endif
]],[[ ]],[[
int i = 0; int i = 0;
return i; exit(i);
]]) ]])
],[ ],[
tmp_compiler_works="yes" tmp_compiler_works="yes"

View File

@ -1270,12 +1270,11 @@ AC_DEFUN([CURL_CHECK_FUNC_GETADDRINFO], [
struct addrinfo hints; struct addrinfo hints;
struct addrinfo *ai = 0; struct addrinfo *ai = 0;
int error; int error;
int exitcode;
#ifdef _WIN32 #ifdef _WIN32
WSADATA wsa; WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 2), &wsa)) if(WSAStartup(MAKEWORD(2, 2), &wsa))
return 2; exit(2);
#endif #endif
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
@ -1284,15 +1283,9 @@ AC_DEFUN([CURL_CHECK_FUNC_GETADDRINFO], [
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo("127.0.0.1", 0, &hints, &ai); error = getaddrinfo("127.0.0.1", 0, &hints, &ai);
if(error || !ai) if(error || !ai)
exitcode = 1; /* fail */ exit(1); /* fail */
else { else
freeaddrinfo(ai); exit(0);
exitcode = 0;
}
#ifdef _WIN32
WSACleanup();
#endif
return exitcode;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -1890,11 +1883,9 @@ AC_DEFUN([CURL_CHECK_FUNC_GETIFADDRS], [
error = getifaddrs(&ifa); error = getifaddrs(&ifa);
if(error || !ifa) if(error || !ifa)
return 1; /* fail */ exit(1); /* fail */
else { else
freeifaddrs(ifa); exit(0);
return 0;
}
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2012,9 +2003,9 @@ AC_DEFUN([CURL_CHECK_FUNC_GMTIME_R], [
gmt = gmtime_r(&local, &result); gmt = gmtime_r(&local, &result);
(void)result; (void)result;
if(gmt) if(gmt)
return 0; exit(0);
else else
return 1; exit(1);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2143,13 +2134,13 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [
/* - */ /* - */
ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res)); ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res));
if(!ipv4ptr) if(!ipv4ptr)
return 1; /* fail */ exit(1); /* fail */
if(ipv4ptr != ipv4res) if(ipv4ptr != ipv4res)
return 1; /* fail */ exit(1); /* fail */
if(!ipv4ptr[0]) if(!ipv4ptr[0])
return 1; /* fail */ exit(1); /* fail */
if(memcmp(ipv4res, "192.168.100.1", 13) != 0) if(memcmp(ipv4res, "192.168.100.1", 13) != 0)
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
ipv6res[0] = '\0'; ipv6res[0] = '\0';
memset(ipv6a, 0, sizeof(ipv6a)); memset(ipv6a, 0, sizeof(ipv6a));
@ -2167,15 +2158,15 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [
/* - */ /* - */
ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
if(!ipv6ptr) if(!ipv6ptr)
return 1; /* fail */ exit(1); /* fail */
if(ipv6ptr != ipv6res) if(ipv6ptr != ipv6res)
return 1; /* fail */ exit(1); /* fail */
if(!ipv6ptr[0]) if(!ipv6ptr[0])
return 1; /* fail */ exit(1); /* fail */
if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0) if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0)
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
return 0; exit(0);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2295,18 +2286,18 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
/* - */ /* - */
memset(ipv4a, 1, sizeof(ipv4a)); memset(ipv4a, 1, sizeof(ipv4a));
if(1 != inet_pton(AF_INET, ipv4src, ipv4a)) if(1 != inet_pton(AF_INET, ipv4src, ipv4a))
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
if( (ipv4a[0] != 0xc0) || if( (ipv4a[0] != 0xc0) ||
(ipv4a[1] != 0xa8) || (ipv4a[1] != 0xa8) ||
(ipv4a[2] != 0x64) || (ipv4a[2] != 0x64) ||
(ipv4a[3] != 0x01) || (ipv4a[3] != 0x01) ||
(ipv4a[4] != 0x01) ) (ipv4a[4] != 0x01) )
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
memset(ipv6a, 1, sizeof(ipv6a)); memset(ipv6a, 1, sizeof(ipv6a));
if(1 != inet_pton(AF_INET6, ipv6src, ipv6a)) if(1 != inet_pton(AF_INET6, ipv6src, ipv6a))
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
if( (ipv6a[0] != 0xfe) || if( (ipv6a[0] != 0xfe) ||
(ipv6a[1] != 0x80) || (ipv6a[1] != 0x80) ||
@ -2319,7 +2310,7 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
(ipv6a[14] != 0x76) || (ipv6a[14] != 0x76) ||
(ipv6a[15] != 0xc8) || (ipv6a[15] != 0xc8) ||
(ipv6a[16] != 0x01) ) (ipv6a[16] != 0x01) )
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
if( (ipv6a[2] != 0x0) || if( (ipv6a[2] != 0x0) ||
(ipv6a[3] != 0x0) || (ipv6a[3] != 0x0) ||
@ -2327,9 +2318,9 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
(ipv6a[5] != 0x0) || (ipv6a[5] != 0x0) ||
(ipv6a[6] != 0x0) || (ipv6a[6] != 0x0) ||
(ipv6a[7] != 0x0) ) (ipv6a[7] != 0x0) )
return 1; /* fail */ exit(1); /* fail */
/* - */ /* - */
return 0; exit(0);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -3818,11 +3809,11 @@ AC_DEFUN([CURL_CHECK_FUNC_STRERROR_R], [
buffer[0] = '\0'; buffer[0] = '\0';
string = strerror_r(EACCES, buffer, sizeof(buffer)); string = strerror_r(EACCES, buffer, sizeof(buffer));
if(!string) if(!string)
return 1; /* fail */ exit(1); /* fail */
if(!string[0]) if(!string[0])
return 1; /* fail */ exit(1); /* fail */
else else
return 0; exit(0);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -3881,11 +3872,11 @@ AC_DEFUN([CURL_CHECK_FUNC_STRERROR_R], [
buffer[0] = '\0'; buffer[0] = '\0';
error = strerror_r(EACCES, buffer, sizeof(buffer)); error = strerror_r(EACCES, buffer, sizeof(buffer));
if(error) if(error)
return 1; /* fail */ exit(1); /* fail */
if(buffer[0] == '\0') if(buffer[0] == '\0')
return 1; /* fail */ exit(1); /* fail */
else else
return 0; exit(0);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])

View File

@ -48,7 +48,7 @@ int main(int argc, char **argv)
if(argc < 1) { if(argc < 1) {
puts("report_openssl_version filename"); puts("report_openssl_version filename");
return 1; exit(1);
} }
libptr = dlopen(argv[1], 0); libptr = dlopen(argv[1], 0);
@ -65,7 +65,7 @@ int main(int argc, char **argv)
if(!ssl_version) { if(!ssl_version) {
puts("Unable to lookup version of OpenSSL"); puts("Unable to lookup version of OpenSSL");
return 1; exit(1);
} }
version = ssl_version(SSLEAY_VERSION); version = ssl_version(SSLEAY_VERSION);
@ -91,9 +91,9 @@ int main(int argc, char **argv)
status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type); status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type);
if(!$VMS_STATUS_SUCCESS(status)) { if(!$VMS_STATUS_SUCCESS(status)) {
return status; exit(status);
} }
} }
return 0; exit(0);
} }

View File

@ -140,6 +140,12 @@ static int debug_cb(CURL *handle, curl_infotype type,
return 0; return 0;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
exit(2); \
} while(0)
static void usage(const char *msg) static void usage(const char *msg)
{ {
if(msg) if(msg)
@ -190,13 +196,6 @@ static size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
handle->idx, (long)realsize); handle->idx, (long)realsize);
return realsize; return realsize;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
return 2; \
} while(0)
#endif /* !_MSC_VER */ #endif /* !_MSC_VER */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -255,19 +254,19 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
return 1; exit(1);
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
return 1; exit(1);
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
return 1; exit(1);
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
return 1; exit(1);
} }
memset(&resolve, 0, sizeof(resolve)); memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",

View File

@ -138,25 +138,24 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
const char *url; const char *url;
CURLM *multi = NULL; CURLM *multi;
CURL *easy; CURL *easy;
CURLMcode mc; CURLMcode mc;
int running_handles = 0, start_count, numfds; int running_handles = 0, start_count, numfds;
CURLMsg *msg; CURLMsg *msg;
int msgs_in_queue; int msgs_in_queue;
char range[128]; char range[128];
int exitcode = 1;
if(argc != 2) { if(argc != 2) {
fprintf(stderr, "%s URL\n", argv[0]); fprintf(stderr, "%s URL\n", argv[0]);
return 2; exit(2);
} }
url = argv[1]; url = argv[1];
multi = curl_multi_init(); multi = curl_multi_init();
if(!multi) { if(!multi) {
fprintf(stderr, "curl_multi_init failed\n"); fprintf(stderr, "curl_multi_init failed\n");
goto cleanup; exit(1);
} }
start_count = 200; start_count = 200;
@ -165,7 +164,7 @@ int main(int argc, char *argv[])
easy = curl_easy_init(); easy = curl_easy_init();
if(!easy) { if(!easy) {
fprintf(stderr, "curl_easy_init failed\n"); fprintf(stderr, "curl_easy_init failed\n");
goto cleanup; exit(1);
} }
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -188,8 +187,7 @@ int main(int argc, char *argv[])
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n", fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
curl_easy_cleanup(easy); exit(1);
goto cleanup;
} }
--start_count; --start_count;
} }
@ -198,7 +196,7 @@ int main(int argc, char *argv[])
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n", fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
goto cleanup; exit(1);
} }
if(running_handles) { if(running_handles) {
@ -206,7 +204,7 @@ int main(int argc, char *argv[])
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n", fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
goto cleanup; exit(1);
} }
} }
@ -226,12 +224,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) { else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result); ": failed with %d\n", xfer_id, msg->data.result);
goto cleanup; exit(1);
} }
else if(status != 206) { else if(status != 206) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 206)\n", xfer_id, status); ": wrong http status %ld (expected 206)\n", xfer_id, status);
goto cleanup; exit(1);
} }
curl_multi_remove_handle(multi, msg->easy_handle); curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle); curl_easy_cleanup(msg->easy_handle);
@ -246,22 +244,5 @@ int main(int argc, char *argv[])
} while(running_handles > 0 || start_count); } while(running_handles > 0 || start_count);
fprintf(stderr, "exiting\n"); fprintf(stderr, "exiting\n");
exitcode = EXIT_SUCCESS; exit(EXIT_SUCCESS);
cleanup:
if(multi) {
CURL **list = curl_multi_get_handles(multi);
if(list) {
int i;
for(i = 0; list[i]; i++) {
curl_multi_remove_handle(multi, list[i]);
curl_easy_cleanup(list[i]);
}
curl_free(list);
}
curl_multi_cleanup(multi);
}
return exitcode;
} }

View File

@ -136,7 +136,7 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
return size * nmemb; return size * nmemb;
} }
static int add_transfer(CURLM *multi, CURLSH *share, static void add_transfer(CURLM *multi, CURLSH *share,
struct curl_slist *resolve, struct curl_slist *resolve,
const char *url, int http_version) const char *url, int http_version)
{ {
@ -146,7 +146,7 @@ static int add_transfer(CURLM *multi, CURLSH *share,
easy = curl_easy_init(); easy = curl_easy_init();
if(!easy) { if(!easy) {
fprintf(stderr, "curl_easy_init failed\n"); fprintf(stderr, "curl_easy_init failed\n");
return 1; exit(1);
} }
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -168,32 +168,29 @@ static int add_transfer(CURLM *multi, CURLSH *share,
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n", fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
curl_easy_cleanup(easy); exit(1);
return 1;
} }
return 0;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
const char *url; const char *url;
CURLM *multi = NULL; CURLM *multi;
CURLMcode mc; CURLMcode mc;
int running_handles = 0, numfds; int running_handles = 0, numfds;
CURLMsg *msg; CURLMsg *msg;
CURLSH *share = NULL; CURLSH *share;
CURLU *cu; CURLU *cu;
struct curl_slist *resolve = NULL; struct curl_slist resolve;
char resolve_buf[1024]; char resolve_buf[1024];
int msgs_in_queue; int msgs_in_queue;
int add_more, waits, ongoing = 0; int add_more, waits, ongoing = 0;
char *host = NULL, *port = NULL; char *host, *port;
int http_version = CURL_HTTP_VERSION_1_1; int http_version = CURL_HTTP_VERSION_1_1;
int exitcode = 1;
if(argc != 3) { if(argc != 3) {
fprintf(stderr, "%s proto URL\n", argv[0]); fprintf(stderr, "%s proto URL\n", argv[0]);
return 2; exit(2);
} }
if(!strcmp("h2", argv[1])) if(!strcmp("h2", argv[1]))
@ -205,41 +202,41 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
return 1; exit(1);
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
goto cleanup; exit(1);
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
goto cleanup; exit(1);
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
goto cleanup; exit(1);
} }
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
host, port); host, port);
resolve = curl_slist_append(resolve, resolve_buf); curl_slist_append(&resolve, resolve_buf);
multi = curl_multi_init(); multi = curl_multi_init();
if(!multi) { if(!multi) {
fprintf(stderr, "curl_multi_init failed\n"); fprintf(stderr, "curl_multi_init failed\n");
goto cleanup; exit(1);
} }
share = curl_share_init(); share = curl_share_init();
if(!share) { if(!share) {
fprintf(stderr, "curl_share_init failed\n"); fprintf(stderr, "curl_share_init failed\n");
goto cleanup; exit(1);
} }
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
if(add_transfer(multi, share, resolve, url, http_version)) add_transfer(multi, share, &resolve, url, http_version);
goto cleanup;
++ongoing; ++ongoing;
add_more = 6; add_more = 6;
waits = 3; waits = 3;
@ -248,7 +245,7 @@ int main(int argc, char *argv[])
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n", fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
goto cleanup; exit(1);
} }
if(running_handles) { if(running_handles) {
@ -256,7 +253,7 @@ int main(int argc, char *argv[])
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n", fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
goto cleanup; exit(1);
} }
} }
@ -265,8 +262,7 @@ int main(int argc, char *argv[])
} }
else { else {
while(add_more) { while(add_more) {
if(add_transfer(multi, share, resolve, url, http_version)) add_transfer(multi, share, &resolve, url, http_version);
goto cleanup;
++ongoing; ++ongoing;
--add_more; --add_more;
} }
@ -288,12 +284,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) { else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result); ": failed with %d\n", xfer_id, msg->data.result);
goto cleanup; exit(1);
} }
else if(status != 200) { else if(status != 200) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 200)\n", xfer_id, status); ": wrong http status %ld (expected 200)\n", xfer_id, status);
goto cleanup; exit(1);
} }
curl_multi_remove_handle(multi, msg->easy_handle); curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle); curl_easy_cleanup(msg->easy_handle);
@ -309,27 +305,5 @@ int main(int argc, char *argv[])
} while(ongoing || add_more); } while(ongoing || add_more);
fprintf(stderr, "exiting\n"); fprintf(stderr, "exiting\n");
exitcode = EXIT_SUCCESS; exit(EXIT_SUCCESS);
cleanup:
if(multi) {
CURL **list = curl_multi_get_handles(multi);
if(list) {
int i;
for(i = 0; list[i]; i++) {
curl_multi_remove_handle(multi, list[i]);
curl_easy_cleanup(list[i]);
}
curl_free(list);
}
curl_multi_cleanup(multi);
}
curl_share_cleanup(share);
curl_slist_free_all(resolve);
curl_free(host);
curl_free(port);
curl_url_cleanup(cu);
return exitcode;
} }

View File

@ -180,6 +180,12 @@ static int progress_callback(void *clientp,
return 0; return 0;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
exit(2); \
} while(0)
static void usage(const char *msg) static void usage(const char *msg)
{ {
if(msg) if(msg)
@ -190,13 +196,6 @@ static void usage(const char *msg)
" -V http_version (http/1.1, h2, h3) http version to use\n" " -V http_version (http/1.1, h2, h3) http version to use\n"
); );
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
return 2; \
} while(0)
#endif /* !_MSC_VER */ #endif /* !_MSC_VER */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -246,19 +245,19 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
return 1; exit(1);
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
return 1; exit(1);
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
return 1; exit(1);
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
return 1; exit(1);
} }
memset(&resolve, 0, sizeof(resolve)); memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
@ -268,7 +267,7 @@ int main(int argc, char *argv[])
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) { if(!curl) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
return 1; exit(1);
} }
/* We want to use our own read function. */ /* We want to use our own read function. */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

View File

@ -21,7 +21,7 @@
* SPDX-License-Identifier: curl * SPDX-License-Identifier: curl
* *
***************************************************************************/ ***************************************************************************/
/* used for test case 533, 534, 535 and 546 */ /* used for test case 533, 534 and 535 */
#include "test.h" #include "test.h"

View File

@ -1018,8 +1018,8 @@ int main(int argc, char *argv[])
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -99,8 +99,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
#if defined(CURLRES_IPV6) #if defined(CURLRES_IPV6)

View File

@ -1145,8 +1145,8 @@ int main(int argc, char *argv[])
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
install_signal_handlers(false); install_signal_handlers(false);

View File

@ -1507,8 +1507,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -1086,8 +1086,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -1611,7 +1611,7 @@ static void http_connect(curl_socket_t *infdp,
if(!req2) { if(!req2) {
req2 = malloc(sizeof(*req2)); req2 = malloc(sizeof(*req2));
if(!req2) if(!req2)
goto http_connect_cleanup; /* fail */ exit(1);
} }
memset(req2, 0, sizeof(*req2)); memset(req2, 0, sizeof(*req2));
logmsg("====> Client connect DATA"); logmsg("====> Client connect DATA");
@ -2207,8 +2207,8 @@ int main(int argc, char *argv[])
is_proxy ? "-proxy" : "", socket_type); is_proxy ? "-proxy" : "", socket_type);
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
install_signal_handlers(false); install_signal_handlers(false);

View File

@ -644,8 +644,8 @@ int main(int argc, char **argv)
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
if(win32_init()) win32_init();
return 2; atexit(win32_cleanup);
#endif #endif
install_signal_handlers(true); install_signal_handlers(true);

View File

@ -153,17 +153,7 @@ void win32_perror(const char *msg)
fprintf(stderr, "%s\n", buf); fprintf(stderr, "%s\n", buf);
} }
static void win32_cleanup(void) void win32_init(void)
{
#ifdef USE_WINSOCK
WSACleanup();
#endif /* USE_WINSOCK */
/* flush buffers of all streams regardless of their mode */
_flushall();
}
int win32_init(void)
{ {
#ifdef USE_WINSOCK #ifdef USE_WINSOCK
WORD wVersionRequested; WORD wVersionRequested;
@ -176,7 +166,7 @@ int win32_init(void)
if(err) { if(err) {
perror("Winsock init failed"); perror("Winsock init failed");
logmsg("Error initialising Winsock -- aborting"); logmsg("Error initialising Winsock -- aborting");
return 1; exit(1);
} }
if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) || if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
@ -184,11 +174,19 @@ int win32_init(void)
WSACleanup(); WSACleanup();
perror("Winsock init failed"); perror("Winsock init failed");
logmsg("No suitable winsock.dll found -- aborting"); logmsg("No suitable winsock.dll found -- aborting");
return 1; exit(1);
} }
#endif /* USE_WINSOCK */ #endif /* USE_WINSOCK */
atexit(win32_cleanup); }
return 0;
void win32_cleanup(void)
{
#ifdef USE_WINSOCK
WSACleanup();
#endif /* USE_WINSOCK */
/* flush buffers of all streams regardless of their mode */
_flushall();
} }
/* socket-safe strerror (works on Winsock errors, too) */ /* socket-safe strerror (works on Winsock errors, too) */

View File

@ -51,7 +51,8 @@ extern const char *cmdfile;
#define perror(m) win32_perror(m) #define perror(m) win32_perror(m)
void win32_perror(const char *msg); void win32_perror(const char *msg);
int win32_init(void); void win32_init(void);
void win32_cleanup(void);
const char *sstrerror(int err); const char *sstrerror(int err);
#else /* _WIN32 */ #else /* _WIN32 */

View File

@ -57,14 +57,18 @@ CFGSET=true
!ENDIF !ENDIF
DOUBLESPACE=$(subst ',,' ')
SINGLESPACE=$(subst ',,' ')
!INCLUDE "../lib/Makefile.inc" !INCLUDE "../lib/Makefile.inc"
CSOURCES=$(CSOURCES: = ) SRC=$(subst $(DOUBLESPACE),$(SINGLESPACE),$(CSOURCES)))
LIBCURL_OBJS=$(CSOURCES:.c=.obj) LIBCURL_OBJS=$(SRC:.c=.obj)
!INCLUDE "../src/Makefile.inc" !INCLUDE "../src/Makefile.inc"
CURL_CFILES=$(CURL_CFILES: = ) CSRC=$(subst $(DOUBLESPACE),$(SINGLESPACE),$(CURL_CFILES)))
CURL_OBJS=$(CURL_CFILES:.c=.obj)
CSRC=$(subst , ,$(CURL_CFILES))
CURL_OBJS=$(CSRC:.c=.obj)
# backwards compatible check for USE_SSPI # backwards compatible check for USE_SSPI
!IFDEF USE_SSPI !IFDEF USE_SSPI