Compare commits

...

14 Commits

Author SHA1 Message Date
Viktor Szakats
b4834a7d6d
examples: prefer return over exit() (cont.)
Some of these calls were not in callbacks. These examples may leak
handles.

Also fix some whitespace.

Follow-up to 08c7c937dc #16507
Closes #16524
2025-03-01 02:09:02 +01:00
Viktor Szakats
5693342ec2
winbuild: reduce command-line length by dropping whitespace
Keep the `@for %%i in [...]` lines within limits by stripping whitespace
from the input `.c` source lists read from `Makefile.inc`. To avoid this
error after adding a new `.c` source:
```
configuration name: libcurl-vc14-x64-release-dll-ssl-dll-ipv6-sspi
NMAKE : fatal error U1095: expanded command line 'for %i in (altsvc.obj            amigaos.obj
           asyn-ares.obj         asyn-thread.obj       base64.obj            bufq.obj
              bufref.obj            cf-h1-proxy.obj       cf-h2-proxy.obj       cf-haproxy.obj [...]
  vssh/wolfssh.obj) do @echo ..\builds\libcurl-vc14-x64-release-dll-ssl-dll-ipv6-sspi-obj-lib/%i \
                   ' too long
Stop.
Command exited with code 2
```
Ref: https://ci.appveyor.com/project/curlorg/curl/builds/51605338/job/dqg6qtebtscb279g#L44

Reported-by: Stefan Eissing
Bug: https://github.com/curl/curl/pull/16508#issuecomment-2690443409
Fixes #16521
Closes #16528
2025-03-01 02:04:42 +01:00
Dan Fandrich
c693cc02b0 docs: vulnerabilities in debug code are not eligible for a bounty
This is code that is off by default and is therefore treated as a
regular bug.

Ref: #16526
Closes #16527
2025-02-28 14:21:46 -08:00
Viktor Szakats
e7751571eb
GHA/macos: use quictls in some jobs, other small improvements
- enable quictls in autotools and cmake jobs. autotools requires
  a workaround due to wrong libpath in the quictls pkg-config.
  nghttp3 is offered by Homebrew, but not ngtcp2, to enable H3.

- install `libnghttp2` rather than `nghttp2`.
  `libnghttp2` is preinstalled and smaller. It also avoids detecting
  `nghttpx`, which confuses `pytest`.

- limit `brew unlink openssl` to libressl/quictls jobs.

Closes #16517
2025-02-28 16:58:12 +01:00
Zhaoming Luo
7211576442
tests: fix comment in lib533
Closes #16523
2025-02-28 16:12:20 +01:00
Stefan Eissing
794dfe7fc4
gnutls: fix use of pkcs11 urls for keys/certs
Fixes #16249
Forwarded-to-us-by: Carlos Henrique Lima Melara

Always use `gnutls_certificate_set_x509_key_file2()` for loading keys
and certificates, even without a password, since this function support
pkcs11 urls.

Thanks to @tatsuhiro-t for finding this out.
Help-by: Tatsuhiro Tsujikawa

Closes #16472
2025-02-28 16:08:10 +01:00
Viktor Szakats
049352dd80
cmake: allow CURL_STATIC_CRT with shared libcurl and no curl exe
Follow-up to edfa537100 #16456

Closes #16516
2025-02-28 13:11:41 +01:00
Viktor Szakats
08c7c937dc
tidy-up: prefer return over exit(), fix fallouts
To avoid breaking the control flow and align to majority of code
already using `return`.

`exit()` has the side-effect of suppressing leak detection in cases.
Fix fallouts detected after switching to `return`.

- configure:
  - fix `getaddrinfo` run test to call `freeaddrinfo()` to pacify ASAN,
    and call `WSACleanup()` to deinit winsock2.
  - fix `getifaddrs` run test to call `freeifaddrs()` to pacify ASAN.
- tests/server:
  - setup `atexit(win32_cleanup)` via `win32_init()`.
  - return 2 instead of 1 on winsock2 init failures.
  - sws: goto cleanup instead of `exit()` in `http_connect()`.
    Follow-up to 02dfe71937 #7235
- tests/client/http:
  - cleanup memory to pacify ASAN in `h2-upgrade-extreme`,
    `tls-session-reuse`.
- examples:
  - block_ip: fix memory leak reported by CI.
  - http2-upload: avoid handle leaks.

Untouched `exit()` calls, made from callbacks:
- docs/examples: ephiperfifo.c, ghiper.c, hiperfifo.c
- tests/libtest: lib582.c, lib655.c, lib670.c
- tests/server: tftpd.c

Closes #16507
2025-02-28 13:11:41 +01:00
Stefan Eissing
2e585f5640
test488: set --output-dir
Otherwise the downloaded files land in the `tests` directory and
show up in git status.

Closes #16519
2025-02-28 12:47:31 +01:00
Viktor Szakats
399cb7130a
cmake: drop HAVE_C_FLAG_Wno_long_double logic for ancient Apple gcc
The initial curl CMake commit introduced it in 2009-04-02 via
4c5307b456. Suppressing a stray
`-Wlong-double` warning in `mprintf.c`. This was before Apple switched
to clang, and likely affected the Apple distributed GCC, version 4.2.1
at the time. It applied the workaround to CMake builds only, though
the issue seems build-tool agnostic. Yet, it was not suppressed or
reported for autotools builds.

For these reasons this logic seems obsolete and this patch drops it with
no replacement. It saves a feature detection for GCC builds for macOS.

In PR sub-commits I added (and reverted) in-source suppression. In case
it becomes necessary, that should fix it for all build tools.

Closes #16513
2025-02-28 03:40:40 +01:00
Viktor Szakats
5a021aba41
cmake: improve httpd detection for pytest
Look for `httpd` in addition to `apache2`, like `./configure` does.
It fixes detection with macOS Homebrew for example.

Closes #16515
2025-02-28 03:40:40 +01:00
Viktor Szakats
6913c9b6ab
GHA/linux: improve 'test configs' step, don't set TFLAGS for pytest
- omit comments from th config dump, show filenames for each line.
- `TFLAGS` is not used by pytest, don't set it.

Closes #16514
2025-02-28 03:40:40 +01:00
Daniel Stenberg
953cd694dc
asyn-ares: use the correct port number
Only triggers with old c-ares versions.

Follow-up to 8ded8e5f3f

Closes #16511
2025-02-27 22:18:43 +01:00
Viktor Szakats
af6172c8f2
GHA/linux: merge two package install steps
Merge pytest prereq package install step into the main package install
step, to save install time.

Closes #16509
2025-02-27 20:32:50 +01:00
38 changed files with 283 additions and 239 deletions

View File

@ -454,9 +454,7 @@ jobs:
grep -F '#define' bld/lib/curl_config.h | sort || true
- name: 'test configs'
run: |
cat bld/tests/config || true
cat bld/tests/http/config.ini || true
run: grep -H -v '^#' bld/tests/config bld/tests/http/config.ini || true
- name: 'build'
run: |
@ -500,7 +498,6 @@ jobs:
- name: 'run pytest event based'
env:
TFLAGS: '${{ matrix.build.tflags }}'
CURL_TEST_EVENT: 1
CURL_CI: github
PYTEST_ADDOPTS: '--color=yes'

View File

@ -304,7 +304,8 @@ jobs:
libtool autoconf automake pkgconf ninja-build \
${{ matrix.build.install_steps != 'skipall' && matrix.build.install_steps != 'skiprun' && 'stunnel4' || '' }} \
libpsl-dev libbrotli-dev libzstd-dev \
${{ matrix.build.install_packages }}
${{ matrix.build.install_packages }} \
${{ contains(matrix.build.install_steps, 'pytest') && 'apache2 apache2-dev libnghttp2-dev vsftpd' || '' }}
python3 -m venv $HOME/venv
- name: 'install prereqs'
@ -319,11 +320,6 @@ jobs:
${{ matrix.build.install_packages }}
python3 -m venv $HOME/venv
- name: 'install prereqs for pytest'
if: contains(matrix.build.install_steps, 'pytest')
run: |
sudo apt-get -o Dpkg::Use-Pty=0 install apache2 apache2-dev libnghttp2-dev vsftpd
- name: 'install dependencies'
if: startsWith(matrix.build.container, 'alpine')
run: |
@ -616,9 +612,7 @@ jobs:
grep -F '#define' bld/lib/curl_config.h | sort || true
- name: 'test configs'
run: |
cat bld/tests/config || true
cat bld/tests/http/config.ini || true
run: grep -H -v '^#' bld/tests/config bld/tests/http/config.ini || true
- name: 'build'
run: |
@ -694,7 +688,6 @@ jobs:
- name: 'run pytest'
if: contains(matrix.build.install_steps, 'pytest')
env:
TFLAGS: '${{ matrix.build.tflags }}'
CURL_CI: github
PYTEST_ADDOPTS: '--color=yes'
run: |

View File

@ -123,9 +123,10 @@ jobs:
compiler: clang
configure: --enable-debug --with-openssl=$(brew --prefix openssl)
tflags: --test-event
- name: 'OpenSSL libssh2 !ldap 10.15'
- name: 'quictls libssh2 !ldap 10.15'
compiler: clang
configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix openssl)
install: quictls
configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix quictls) LDFLAGS="${LDFLAGS} -L$(brew --prefix quictls)/lib"
macos-version-min: '10.15'
# cmake
- name: 'OpenSSL gsasl rtmp AppleIDN'
@ -136,9 +137,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
clang-tidy: true
chkprefill: _chkprefill
- name: 'OpenSSL +static libssh +examples'
install: libssh
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON
- name: 'quictls +static libssh +examples'
install: quictls libssh
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix quictls) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON
- name: 'SecureTransport debug'
generate: -DCURL_USE_SECTRANSP=ON -DENABLE_DEBUG=ON
macos-version-min: '10.8'
@ -184,11 +185,12 @@ jobs:
run: |
echo ${{ matrix.build.generate && 'ninja' || 'automake libtool' }} \
pkgconf libpsl libssh2 \
${{ !matrix.build.clang-tidy && 'nghttp2 stunnel' || '' }} \
${{ !matrix.build.clang-tidy && 'libnghttp2 stunnel' || '' }} \
${{ 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
- name: 'brew unlink openssl'
if: ${{ contains(matrix.build.install, 'libressl') || contains(matrix.build.install, 'quictls') }}
run: |
if test -d $(brew --prefix)/include/openssl; then
brew unlink openssl
@ -343,7 +345,7 @@ jobs:
if: ${{ contains(matrix.build.name, '+examples') }}
run: |
if [ -n '${{ matrix.build.generate }}' ]; then
cmake --build bld --target curl-examples --verbose
cmake --build bld --verbose --target curl-examples
else
make -C bld examples V=1
fi

View File

@ -352,13 +352,12 @@ endif()
if(WIN32)
option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF)
if(CURL_STATIC_CRT AND MSVC)
if(BUILD_STATIC_CURL)
if(BUILD_STATIC_CURL OR NOT BUILD_CURL_EXE)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
string(APPEND CMAKE_C_FLAGS_RELEASE " -MT")
string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd")
else()
message(WARNING "Static CRT requires curl executable built with static libcurl "
"(BUILD_STATIC_LIBS=ON and BUILD_STATIC_CURL=ON).")
message(WARNING "Static CRT requires static or no curl executable.")
endif()
endif()
endif()
@ -1954,22 +1953,6 @@ endif()
# Some other minor tests
if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
include(CheckCCompilerFlag)
check_c_compiler_flag("-Wno-long-double" HAVE_C_FLAG_Wno_long_double)
if(HAVE_C_FLAG_Wno_long_double)
# The Mac version of GCC warns about use of long double. Disable it.
get_source_file_property(_mprintf_compile_flags "mprintf.c" COMPILE_FLAGS)
if(_mprintf_compile_flags)
string(APPEND _mprintf_compile_flags " -Wno-long-double")
else()
set(_mprintf_compile_flags "-Wno-long-double")
endif()
set_source_files_properties("mprintf.c" PROPERTIES
COMPILE_FLAGS ${_mprintf_compile_flags})
endif()
endif()
if(_cmake_try_compile_target_type_save)
set(CMAKE_TRY_COMPILE_TARGET_TYPE ${_cmake_try_compile_target_type_save})
unset(_cmake_try_compile_target_type_save)

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_PREFIX`: Override default versioned symbol prefix. Default: `<TLS-BACKEND>_` or `MULTISSL_`
- `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF`
- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static curl executable). Default: `OFF`
- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static or no curl executable). Default: `OFF`
- `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_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
already do much worse harm and the problem is not really in curl.
## Experiments
## Debug & Experiments
Vulnerabilities in features which are off by default (in the build) and
documented as experimental, are not eligible for a reward and we do not
consider them security problems.
documented as experimental, or exist only in debug mode, are not eligible for a
reward and we do not consider them security problems.
## URL inconsistencies

View File

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

View File

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

View File

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

View File

@ -418,22 +418,22 @@ static int init_fifo(GlobalInfo *g)
struct epoll_event epev;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) {
if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST;
perror("lstat");
exit(1);
return 1;
}
}
unlink(fifo);
if(mkfifo (fifo, 0600) == -1) {
if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo");
exit(1);
return 1;
}
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) {
perror("open");
exit(1);
return 1;
}
g->fifofd = sockfd;
@ -449,9 +449,9 @@ static int init_fifo(GlobalInfo *g)
static void clean_fifo(GlobalInfo *g)
{
epoll_ctl(g->epfd, EPOLL_CTL_DEL, g->fifofd, NULL);
fclose(g->input);
unlink(fifo);
epoll_ctl(g->epfd, EPOLL_CTL_DEL, g->fifofd, NULL);
fclose(g->input);
unlink(fifo);
}
@ -478,13 +478,13 @@ int main(int argc, char **argv)
g.epfd = epoll_create1(EPOLL_CLOEXEC);
if(g.epfd == -1) {
perror("epoll_create1 failed");
exit(1);
return 1;
}
g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
if(g.tfd == -1) {
perror("timerfd_create failed");
exit(1);
return 1;
}
memset(&its, 0, sizeof(struct itimerspec));
@ -496,7 +496,8 @@ int main(int argc, char **argv)
ev.data.fd = g.tfd;
epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev);
init_fifo(&g);
if(init_fifo(&g))
return 1;
g.multi = curl_multi_init();
/* setup the generic multi interface options we want */
@ -521,7 +522,7 @@ int main(int argc, char **argv)
}
else {
perror("epoll_wait");
exit(1);
return 1;
}
}

View File

@ -402,22 +402,22 @@ static int init_fifo(GlobalInfo *g)
curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) {
if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST;
perror("lstat");
exit(1);
return 1;
}
}
unlink(fifo);
if(mkfifo (fifo, 0600) == -1) {
if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo");
exit(1);
return 1;
}
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) {
perror("open");
exit(1);
return 1;
}
g->input = fdopen(sockfd, "r");
@ -436,7 +436,8 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo));
g.loop = ev_default_loop(0);
init_fifo(&g);
if(init_fifo(&g))
return 1;
g.multi = curl_multi_init();
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) {
errno = EEXIST;
perror("lstat");
exit(1);
return CURL_SOCKET_BAD;
}
}
unlink(fifo);
if(mkfifo (fifo, 0600) == -1) {
if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo");
exit(1);
return CURL_SOCKET_BAD;
}
socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(socket == -1) {
if(socket == CURL_SOCKET_BAD) {
perror("open");
exit(1);
return socket;
}
MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
@ -421,6 +421,8 @@ int main(void)
GIOChannel* ch;
fd = init_fifo();
if(fd == CURL_SOCKET_BAD)
return 1;
ch = g_io_channel_unix_new(fd);
g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
gmain = g_main_loop_new(NULL, FALSE);

View File

@ -399,22 +399,22 @@ static int init_fifo(GlobalInfo *g)
curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) {
if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST;
perror("lstat");
exit(1);
return 1;
}
}
unlink(fifo);
if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo");
exit(1);
return 1;
}
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) {
perror("open");
exit(1);
return 1;
}
g->input = fdopen(sockfd, "r");
@ -440,7 +440,8 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo));
g.evbase = event_base_new();
init_fifo(&g);
if(init_fifo(&g))
return 1;
g.multi = curl_multi_init();
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) {
fprintf(stderr, "Failed to create CURL connection\n");
exit(EXIT_FAILURE);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
@ -270,7 +270,7 @@ int main(int argc, char *argv[])
if(argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]);
exit(EXIT_FAILURE);
return EXIT_FAILURE;
}
curl_global_init(CURL_GLOBAL_DEFAULT);
@ -279,7 +279,7 @@ int main(int argc, char *argv[])
if(!init(conn, argv[1])) {
fprintf(stderr, "Connection initialization failed\n");
exit(EXIT_FAILURE);
return EXIT_FAILURE;
}
// Retrieve content for the URL
@ -289,7 +289,7 @@ int main(int argc, char *argv[])
if(code != CURLE_OK) {
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
exit(EXIT_FAILURE);
return EXIT_FAILURE;
}
// Parse the (assumed) HTML code

View File

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

View File

@ -592,7 +592,7 @@ static void query_completed_cb(void *arg, /* (struct connectdata *) */
res->num_pending--;
if(CURL_ASYNC_SUCCESS == status) {
struct Curl_addrinfo *ai = Curl_he2ai(hostent, data->conn->localport);
struct Curl_addrinfo *ai = Curl_he2ai(hostent, data->conn->remote_port);
if(ai) {
compound_results(res, ai);
}

View File

@ -959,7 +959,7 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
return CURLE_SSL_CONNECT_ERROR;
}
}
else if(ssl_config->key_passwd) {
else {
const unsigned int supported_key_encryption_algorithms =
GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR |
GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES |
@ -974,22 +974,12 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
supported_key_encryption_algorithms);
if(rc != GNUTLS_E_SUCCESS) {
failf(data,
"error reading X.509 potentially-encrypted key file: %s",
"error reading X.509 %skey file: %s",
ssl_config->key_passwd ? "potentially-encrypted " : "",
gnutls_strerror(rc));
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

View File

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

View File

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

View File

@ -48,7 +48,7 @@ int main(int argc, char **argv)
if(argc < 1) {
puts("report_openssl_version filename");
exit(1);
return 1;
}
libptr = dlopen(argv[1], 0);
@ -65,7 +65,7 @@ int main(int argc, char **argv)
if(!ssl_version) {
puts("Unable to lookup version of OpenSSL");
exit(1);
return 1;
}
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);
if(!$VMS_STATUS_SUCCESS(status)) {
exit(status);
return status;
}
}
exit(0);
return 0;
}

View File

@ -36,7 +36,7 @@ http
Download two URLs provided on stdin
</name>
<command>
--url @-
--output-dir %LOGDIR --url @-
</command>
<stdin>
http://%HOSTIP:%HTTPPORT/a

View File

@ -34,7 +34,7 @@ if(NOT VSFTPD)
endif()
mark_as_advanced(VSFTPD)
find_program(HTTPD "apache2") # /usr/sbin/apache2
find_program(HTTPD NAMES "/usr/sbin/apache2" "httpd" "apache2")
if(NOT HTTPD)
set(HTTPD "")
endif()

View File

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

View File

@ -138,24 +138,25 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
int main(int argc, char *argv[])
{
const char *url;
CURLM *multi;
CURLM *multi = NULL;
CURL *easy;
CURLMcode mc;
int running_handles = 0, start_count, numfds;
CURLMsg *msg;
int msgs_in_queue;
char range[128];
int exitcode = 1;
if(argc != 2) {
fprintf(stderr, "%s URL\n", argv[0]);
exit(2);
return 2;
}
url = argv[1];
multi = curl_multi_init();
if(!multi) {
fprintf(stderr, "curl_multi_init failed\n");
exit(1);
goto cleanup;
}
start_count = 200;
@ -164,7 +165,7 @@ int main(int argc, char *argv[])
easy = curl_easy_init();
if(!easy) {
fprintf(stderr, "curl_easy_init failed\n");
exit(1);
goto cleanup;
}
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -186,8 +187,9 @@ int main(int argc, char *argv[])
mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
curl_easy_cleanup(easy);
goto cleanup;
}
--start_count;
}
@ -195,16 +197,16 @@ int main(int argc, char *argv[])
mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
goto cleanup;
}
if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
goto cleanup;
}
}
@ -224,12 +226,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result);
exit(1);
goto cleanup;
}
else if(status != 206) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 206)\n", xfer_id, status);
exit(1);
goto cleanup;
}
curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle);
@ -244,5 +246,22 @@ int main(int argc, char *argv[])
} while(running_handles > 0 || start_count);
fprintf(stderr, "exiting\n");
exit(EXIT_SUCCESS);
exitcode = 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,9 +136,9 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
return size * nmemb;
}
static void add_transfer(CURLM *multi, CURLSH *share,
struct curl_slist *resolve,
const char *url, int http_version)
static int add_transfer(CURLM *multi, CURLSH *share,
struct curl_slist *resolve,
const char *url, int http_version)
{
CURL *easy;
CURLMcode mc;
@ -146,7 +146,7 @@ static void add_transfer(CURLM *multi, CURLSH *share,
easy = curl_easy_init();
if(!easy) {
fprintf(stderr, "curl_easy_init failed\n");
exit(1);
return 1;
}
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -167,30 +167,33 @@ static void add_transfer(CURLM *multi, CURLSH *share,
mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
curl_easy_cleanup(easy);
return 1;
}
return 0;
}
int main(int argc, char *argv[])
{
const char *url;
CURLM *multi;
CURLM *multi = NULL;
CURLMcode mc;
int running_handles = 0, numfds;
CURLMsg *msg;
CURLSH *share;
CURLSH *share = NULL;
CURLU *cu;
struct curl_slist resolve;
struct curl_slist *resolve = NULL;
char resolve_buf[1024];
int msgs_in_queue;
int add_more, waits, ongoing = 0;
char *host, *port;
char *host = NULL, *port = NULL;
int http_version = CURL_HTTP_VERSION_1_1;
int exitcode = 1;
if(argc != 3) {
fprintf(stderr, "%s proto URL\n", argv[0]);
exit(2);
return 2;
}
if(!strcmp("h2", argv[1]))
@ -202,41 +205,41 @@ int main(int argc, char *argv[])
cu = curl_url();
if(!cu) {
fprintf(stderr, "out of memory\n");
exit(1);
return 1;
}
if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url);
exit(1);
goto cleanup;
}
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url);
exit(1);
goto cleanup;
}
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url);
exit(1);
goto cleanup;
}
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
host, port);
curl_slist_append(&resolve, resolve_buf);
resolve = curl_slist_append(resolve, resolve_buf);
multi = curl_multi_init();
if(!multi) {
fprintf(stderr, "curl_multi_init failed\n");
exit(1);
goto cleanup;
}
share = curl_share_init();
if(!share) {
fprintf(stderr, "curl_share_init failed\n");
exit(1);
goto cleanup;
}
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
add_transfer(multi, share, &resolve, url, http_version);
if(add_transfer(multi, share, resolve, url, http_version))
goto cleanup;
++ongoing;
add_more = 6;
waits = 3;
@ -244,16 +247,16 @@ int main(int argc, char *argv[])
mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
goto cleanup;
}
if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc));
exit(1);
curl_multi_strerror(mc));
goto cleanup;
}
}
@ -262,7 +265,8 @@ int main(int argc, char *argv[])
}
else {
while(add_more) {
add_transfer(multi, share, &resolve, url, http_version);
if(add_transfer(multi, share, resolve, url, http_version))
goto cleanup;
++ongoing;
--add_more;
}
@ -284,12 +288,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result);
exit(1);
goto cleanup;
}
else if(status != 200) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 200)\n", xfer_id, status);
exit(1);
goto cleanup;
}
curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle);
@ -305,5 +309,27 @@ int main(int argc, char *argv[])
} while(ongoing || add_more);
fprintf(stderr, "exiting\n");
exit(EXIT_SUCCESS);
exitcode = 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,12 +180,6 @@ static int progress_callback(void *clientp,
return 0;
}
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
exit(2); \
} while(0)
static void usage(const char *msg)
{
if(msg)
@ -196,6 +190,13 @@ static void usage(const char *msg)
" -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 */
int main(int argc, char *argv[])
@ -245,19 +246,19 @@ int main(int argc, char *argv[])
cu = curl_url();
if(!cu) {
fprintf(stderr, "out of memory\n");
exit(1);
return 1;
}
if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url);
exit(1);
return 1;
}
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url);
exit(1);
return 1;
}
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url);
exit(1);
return 1;
}
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
@ -267,7 +268,7 @@ int main(int argc, char *argv[])
curl = curl_easy_init();
if(!curl) {
fprintf(stderr, "out of memory\n");
exit(1);
return 1;
}
/* We want to use our own read function. */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -58,9 +58,11 @@ CFGSET=true
!ENDIF
!INCLUDE "../lib/Makefile.inc"
CSOURCES=$(CSOURCES: = )
LIBCURL_OBJS=$(CSOURCES:.c=.obj)
!INCLUDE "../src/Makefile.inc"
CURL_CFILES=$(CURL_CFILES: = )
CURL_OBJS=$(CURL_CFILES:.c=.obj)