aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2012-12-19 19:51:20 +0100
committerYang Tse <yangsita@gmail.com>2012-12-19 19:53:16 +0100
commitb7a1eccce8daeb69c9ffedfabc89c353c8be4969 (patch)
tree38d5392e629d3db3186ff022cdc5f84b3249b56a
parentc91a6cd78f86606cb9313db2d5a66957ac2c5609 (diff)
libntlmconnect.c: fix compiler warnings and OOM handling
-rw-r--r--tests/libtest/libntlmconnect.c96
1 files changed, 48 insertions, 48 deletions
diff --git a/tests/libtest/libntlmconnect.c b/tests/libtest/libntlmconnect.c
index 66d09e936..b540ebf58 100644
--- a/tests/libtest/libntlmconnect.c
+++ b/tests/libtest/libntlmconnect.c
@@ -33,51 +33,58 @@
#define TEST_HANG_TIMEOUT 5 * 1000
#define MAX_EASY_HANDLES 3
-/* On Windows INVALID_SOCKET represents an invalid socket, not -1:
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms740516.aspx */
-#ifndef INVALID_SOCKET
-#define INVALID_SOCKET -1
-#endif
-
-CURL *easy[MAX_EASY_HANDLES];
-curl_socket_t sockets[MAX_EASY_HANDLES];
-int res = 0;
+static CURL *easy[MAX_EASY_HANDLES];
+static curl_socket_t sockets[MAX_EASY_HANDLES];
+static int res = 0;
static size_t callback(char* ptr, size_t size, size_t nmemb, void* data)
{
ssize_t idx = ((CURL **) data) - easy;
curl_socket_t sock;
- long lastsock;
+ long longdata;
+ CURLcode code;
+
+ const size_t failure = (size * nmemb) ? 0 : 1;
char *output = malloc(size * nmemb + 1);
+ if (!output) {
+ fprintf(stderr, "output, malloc() failed\n");
+ res = TEST_ERR_MAJOR_BAD;
+ return failure;
+ }
+
memcpy(output, ptr, size * nmemb);
output[size * nmemb] = '\0';
fprintf(stdout, "%s", output);
free(output);
- res = curl_easy_getinfo(easy[idx], CURLINFO_LASTSOCKET, &lastsock);
- if (CURLE_OK != res) {
- fprintf(stderr, "Error reading CURLINFO_LASTSOCKET\n");
- return 0;
- }
- if (lastsock == -1) {
- sock = INVALID_SOCKET;
- }
- else {
- sock = (curl_socket_t)lastsock;
+ /* Get socket being used for this easy handle, otherwise CURL_SOCKET_BAD */
+ code = curl_easy_getinfo(easy[idx], CURLINFO_LASTSOCKET, &longdata);
+ if (CURLE_OK != code) {
+ fprintf(stderr, "%s:%d curl_easy_getinfo() failed, "
+ "with code %d (%s)\n",
+ __FILE__, __LINE__, (int)code, curl_easy_strerror(code));
+ res = TEST_ERR_MAJOR_BAD;
+ return failure;
}
- /* sock will only be set for NTLM requests; for others it is -1 */
- if (sock != INVALID_SOCKET) {
- if (sockets[idx] == INVALID_SOCKET) {
- /* Data was written for this request before the socket was detected by
- multi_fdset. Record the socket now. */
+ if (longdata == -1L)
+ sock = CURL_SOCKET_BAD;
+ else
+ sock = (curl_socket_t)longdata;
+
+ if (sock != CURL_SOCKET_BAD) {
+ /* Track relationship between this easy handle and the socket. */
+ if (sockets[idx] == CURL_SOCKET_BAD) {
+ /* An easy handle without previous socket, record the socket. */
sockets[idx] = sock;
}
else if (sock != sockets[idx]) {
+ /* An easy handle with a socket different to previously
+ tracked one, log and fail right away. Known bug #37. */
fprintf(stderr, "Handle %d started on socket %d and moved to %d\n",
curlx_sztosi(idx), (int)sockets[idx], (int)sock);
res = TEST_ERR_MAJOR_BAD;
- return 0;
+ return failure;
}
}
return size * nmemb;
@@ -102,17 +109,17 @@ int test(char *url)
if (!full_url) {
fprintf(stderr, "Not enough memory for full url\n");
- return CURLE_OUT_OF_MEMORY;
+ return TEST_ERR_MAJOR_BAD;
}
for (i = 0; i < MAX_EASY_HANDLES; ++i) {
easy[i] = NULL;
- sockets[i] = -1;
+ sockets[i] = CURL_SOCKET_BAD;
}
- res = 0;
res_global_init(CURL_GLOBAL_ALL);
if(res) {
+ free(full_url);
return res;
}
@@ -124,7 +131,7 @@ int test(char *url)
fd_set fdwrite;
fd_set fdexcep;
long timeout = -99;
- curl_socket_t curfd, maxfd = INVALID_SOCKET;
+ int maxfd = -99;
bool found_new_socket = FALSE;
/* Start a new handle if we aren't at the max */
@@ -153,8 +160,6 @@ int test(char *url)
}
multi_perform(multi, &running);
- if (0 != res)
- break;
abort_on_test_timeout();
@@ -165,13 +170,15 @@ int test(char *url)
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
- multi_fdset(multi, &fdread, &fdwrite, &fdexcep, (int *)&maxfd);
+ multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
/* Any socket which is new in fdread is associated with the new handle */
- for (curfd = 0; curfd <= maxfd; ++curfd) {
+ for (i = 0; i <= maxfd; ++i) {
bool socket_exists = FALSE;
+ curl_socket_t curfd = (curl_socket_t)i;
+
if (!FD_ISSET(curfd, &fdread)) {
continue;
}
@@ -195,7 +202,7 @@ int test(char *url)
}
/* Now we know the socket is for the most recent handle, num_handles-1 */
- if (sockets[num_handles-1] != INVALID_SOCKET) {
+ if (sockets[num_handles-1] != CURL_SOCKET_BAD) {
/* A socket for this handle was already detected in the callback; if it
matched socket_exists should be true and we would never get here */
assert(curfd != sockets[num_handles-1]);
@@ -252,24 +259,17 @@ int test(char *url)
test_cleanup:
- for (i = 0; i < MAX_EASY_HANDLES; ++i) {
- if (easy[i]) {
- if (multi) {
- curl_multi_remove_handle(multi, easy[i]);
- }
- curl_easy_cleanup(easy[i]);
- }
- }
+ /* proper cleanup sequence - type PB */
- if (multi) {
- curl_multi_cleanup(multi);
+ for(i = 0; i < MAX_EASY_HANDLES; i++) {
+ curl_multi_remove_handle(multi, easy[i]);
+ curl_easy_cleanup(easy[i]);
}
+ curl_multi_cleanup(multi);
curl_global_cleanup();
- if (full_url) {
- free(full_url);
- }
+ free(full_url);
return res;
}