lib582.c: fix segfault triggered when torture testing test case 582
This commit is contained in:
parent
2147492050
commit
28d09cb0f5
@ -31,8 +31,9 @@
|
||||
|
||||
struct Sockets
|
||||
{
|
||||
curl_socket_t* sockets;
|
||||
int count;
|
||||
curl_socket_t *sockets;
|
||||
int count; /* number of sockets actually stored in array */
|
||||
int max_count; /* max number of sockets that fit in allocated array */
|
||||
};
|
||||
|
||||
struct ReadWriteSockets
|
||||
@ -52,8 +53,9 @@ static void removeFd(struct Sockets* sockets, curl_socket_t fd, int mention)
|
||||
|
||||
for (i = 0; i < sockets->count; ++i) {
|
||||
if (sockets->sockets[i] == fd) {
|
||||
memmove(&sockets->sockets[i], &sockets->sockets[i + 1],
|
||||
sizeof(curl_socket_t) * (sockets->count - i - 1));
|
||||
if (i < sockets->count - 1)
|
||||
memmove(&sockets->sockets[i], &sockets->sockets[i + 1],
|
||||
sizeof(curl_socket_t) * (sockets->count - (i + 1)));
|
||||
--sockets->count;
|
||||
}
|
||||
}
|
||||
@ -70,8 +72,29 @@ static void addFd(struct Sockets* sockets, curl_socket_t fd, const char *what)
|
||||
*/
|
||||
fprintf(stderr, "Add socket fd %d for %s\n", (int) fd, what);
|
||||
removeFd(sockets, fd, 0);
|
||||
sockets->sockets = realloc(sockets->sockets,
|
||||
sizeof(curl_socket_t) * (sockets->count + 1));
|
||||
/*
|
||||
* Allocate array storage when required.
|
||||
*/
|
||||
if(!sockets->sockets) {
|
||||
sockets->sockets = malloc(sizeof(curl_socket_t) * 20U);
|
||||
if(!sockets->sockets)
|
||||
return;
|
||||
sockets->max_count = 20;
|
||||
}
|
||||
else if(sockets->count + 1 > sockets->max_count) {
|
||||
curl_socket_t *oldptr = sockets->sockets;
|
||||
sockets->sockets = realloc(oldptr, sizeof(curl_socket_t) *
|
||||
(sockets->max_count + 20));
|
||||
if(!sockets->sockets) {
|
||||
/* cleanup in test_cleanup */
|
||||
sockets->sockets = oldptr;
|
||||
return;
|
||||
}
|
||||
sockets->max_count += 20;
|
||||
}
|
||||
/*
|
||||
* Add file descriptor to array.
|
||||
*/
|
||||
sockets->sockets[sockets->count] = fd;
|
||||
++sockets->count;
|
||||
}
|
||||
@ -175,8 +198,8 @@ static void updateFdSet(struct Sockets* sockets, fd_set* fdset,
|
||||
}
|
||||
}
|
||||
|
||||
static void notifyCurl(CURL* curl, curl_socket_t s, int evBitmask,
|
||||
const char* info)
|
||||
static void notifyCurl(CURLM *curl, curl_socket_t s, int evBitmask,
|
||||
const char *info)
|
||||
{
|
||||
int numhandles = 0;
|
||||
CURLMcode result = curl_multi_socket_action(curl, s, evBitmask, &numhandles);
|
||||
@ -189,8 +212,8 @@ static void notifyCurl(CURL* curl, curl_socket_t s, int evBitmask,
|
||||
/**
|
||||
* Invoke curl when a file descriptor is set.
|
||||
*/
|
||||
static void checkFdSet(CURL* curl, struct Sockets* sockets, fd_set* fdset,
|
||||
int evBitmask, const char* name)
|
||||
static void checkFdSet(CURLM *curl, struct Sockets *sockets, fd_set *fdset,
|
||||
int evBitmask, const char *name)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sockets->count; ++i) {
|
||||
@ -211,7 +234,7 @@ int test(char *URL)
|
||||
CURLM *m = NULL;
|
||||
struct timeval ml_start;
|
||||
char ml_timedout = FALSE;
|
||||
struct ReadWriteSockets sockets = {{0, 0}, {0, 0}};
|
||||
struct ReadWriteSockets sockets = {{NULL, 0, 0}, {NULL, 0, 0}};
|
||||
struct timeval timeout = {-1, 0};
|
||||
int success = 0;
|
||||
|
||||
@ -364,9 +387,9 @@ test_cleanup:
|
||||
}
|
||||
|
||||
fclose(hd_src); /* close the local file */
|
||||
if (sockets.read.sockets != 0)
|
||||
if (sockets.read.sockets)
|
||||
free(sockets.read.sockets);
|
||||
if (sockets.write.sockets != 0)
|
||||
if (sockets.write.sockets)
|
||||
free(sockets.write.sockets);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
Loading…
Reference in New Issue
Block a user