Loading CHANGES +5 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,11 @@ Changelog Daniel (22 November 2004) - David Phillips enhanced test 518. I made it depend on a "feature" so that systems without getrlimit() won't attempt to test 518. configure now checks for getrlimit() and setrlimit() for this test case. Daniel (18 November 2004) - David Phillips fixed libcurl to not crash anymore when more than FD_SETSIZE file descriptors are in use. Test case 518 added to verify. Loading configure.ac +4 −1 Original line number Diff line number Diff line Loading @@ -1138,6 +1138,7 @@ AC_CHECK_HEADERS( utime.h \ sys/utime.h \ sys/poll.h \ sys/resource.h \ libgen.h \ locale.h \ setjmp.h, Loading Loading @@ -1240,7 +1241,9 @@ AC_CHECK_FUNCS( strtoll \ setlocale \ ftruncate \ pipe \ poll, poll \ getrlimit \ setrlimit, dnl if found [], dnl if not found, $ac_func is the name we check for Loading tests/FILEFORMAT +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ SSL netrc_debug large_file idn getrlimit </features> <killserver> Loading tests/data/test518 +10 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ Funny-head: yesyes <server> http </server> <features> getrlimit </features> # tool is what to use instead of 'curl' <tool> lib518 Loading @@ -38,8 +41,11 @@ http://%HOSTIP:%HTTPPORT/518 # # Verify data after the test has been "shot" <verify> # CURLE_FAILED_INIT (2) <errorcode> 2 </errorcode> <protocol> GET /518 HTTP/1.1 Host: 127.0.0.1:%HTTPPORT Pragma: no-cache Accept: */* </protocol> </verify> tests/libtest/lib518.c +63 −6 Original line number Diff line number Diff line #include "test.h" #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif #ifdef HAVE_SYS_RESOURCE_H #include <sys/resource.h> #endif #ifdef HAVE_FCNTL_H #include <fcntl.h> #endif #ifdef UNISTD_H #include <unistd.h> #endif #include <mprintf.h> Loading @@ -15,6 +30,7 @@ #endif #define NUM_OPEN (FD_SETSIZE + 10) #define NUM_NEEDED (NUM_OPEN + 16) #if defined(WIN32) || defined(_WIN32) || defined(MSDOS) #define DEV_NULL "NUL" Loading @@ -22,24 +38,56 @@ #define DEV_NULL "/dev/null" #endif #if defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) int test(char *URL) { CURLcode res; CURL *curl; struct rlimit rl; int fd[NUM_OPEN]; int i; CURLcode res; CURL *curl; /* get open file limits */ if (getrlimit(RLIMIT_NOFILE, &rl) == -1) { fprintf(stderr, "warning: getrlimit: failed to get RLIMIT_NOFILE\n"); goto skip_open; } /* check that hard limit is high enough */ if (rl.rlim_max < NUM_NEEDED) { fprintf(stderr, "warning: RLIMIT_NOFILE hard limit is too low\n"); goto skip_open; } /* increase soft limit if needed */ if (rl.rlim_cur < NUM_NEEDED) { rl.rlim_cur = NUM_NEEDED; if (setrlimit(RLIMIT_NOFILE, &rl) == -1) { fprintf(stderr, "warning: setrlimit: failed to set RLIMIT_NOFILE\n"); goto skip_open; } } /* open a dummy descriptor */ fd[0] = open(DEV_NULL, O_RDONLY); if (fd[0] == -1) { fprintf(stderr, "open: failed to open %s\n", DEV_NULL); return CURLE_FAILED_INIT; } /* open a lot of file descriptors */ for (i = 0; i < NUM_OPEN; i++) { fd[i] = open(DEV_NULL, O_RDONLY); /* create a bunch of file descriptors */ for (i = 1; i < NUM_OPEN; i++) { fd[i] = dup(fd[0]); if (fd[i] == -1) { fprintf(stderr, "open: attempt #%i: failed to open %s\n", i, DEV_NULL); fprintf(stderr, "dup: attempt #%i failed\n", i); for (i--; i >= 0; i--) close(fd[i]); return CURLE_FAILED_INIT; } } skip_open: curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, URL); curl_easy_setopt(curl, CURLOPT_HEADER, TRUE); Loading @@ -51,3 +99,12 @@ int test(char *URL) return (int)res; } #else /* system lacks getrlimit() and/or setrlimit() */ int test(char *URL) { (void)URL; fprintf(stderr, "system lacks necessary system function(s)"); return 1; } #endif Loading
CHANGES +5 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,11 @@ Changelog Daniel (22 November 2004) - David Phillips enhanced test 518. I made it depend on a "feature" so that systems without getrlimit() won't attempt to test 518. configure now checks for getrlimit() and setrlimit() for this test case. Daniel (18 November 2004) - David Phillips fixed libcurl to not crash anymore when more than FD_SETSIZE file descriptors are in use. Test case 518 added to verify. Loading
configure.ac +4 −1 Original line number Diff line number Diff line Loading @@ -1138,6 +1138,7 @@ AC_CHECK_HEADERS( utime.h \ sys/utime.h \ sys/poll.h \ sys/resource.h \ libgen.h \ locale.h \ setjmp.h, Loading Loading @@ -1240,7 +1241,9 @@ AC_CHECK_FUNCS( strtoll \ setlocale \ ftruncate \ pipe \ poll, poll \ getrlimit \ setrlimit, dnl if found [], dnl if not found, $ac_func is the name we check for Loading
tests/FILEFORMAT +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ SSL netrc_debug large_file idn getrlimit </features> <killserver> Loading
tests/data/test518 +10 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ Funny-head: yesyes <server> http </server> <features> getrlimit </features> # tool is what to use instead of 'curl' <tool> lib518 Loading @@ -38,8 +41,11 @@ http://%HOSTIP:%HTTPPORT/518 # # Verify data after the test has been "shot" <verify> # CURLE_FAILED_INIT (2) <errorcode> 2 </errorcode> <protocol> GET /518 HTTP/1.1 Host: 127.0.0.1:%HTTPPORT Pragma: no-cache Accept: */* </protocol> </verify>
tests/libtest/lib518.c +63 −6 Original line number Diff line number Diff line #include "test.h" #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif #ifdef HAVE_SYS_RESOURCE_H #include <sys/resource.h> #endif #ifdef HAVE_FCNTL_H #include <fcntl.h> #endif #ifdef UNISTD_H #include <unistd.h> #endif #include <mprintf.h> Loading @@ -15,6 +30,7 @@ #endif #define NUM_OPEN (FD_SETSIZE + 10) #define NUM_NEEDED (NUM_OPEN + 16) #if defined(WIN32) || defined(_WIN32) || defined(MSDOS) #define DEV_NULL "NUL" Loading @@ -22,24 +38,56 @@ #define DEV_NULL "/dev/null" #endif #if defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) int test(char *URL) { CURLcode res; CURL *curl; struct rlimit rl; int fd[NUM_OPEN]; int i; CURLcode res; CURL *curl; /* get open file limits */ if (getrlimit(RLIMIT_NOFILE, &rl) == -1) { fprintf(stderr, "warning: getrlimit: failed to get RLIMIT_NOFILE\n"); goto skip_open; } /* check that hard limit is high enough */ if (rl.rlim_max < NUM_NEEDED) { fprintf(stderr, "warning: RLIMIT_NOFILE hard limit is too low\n"); goto skip_open; } /* increase soft limit if needed */ if (rl.rlim_cur < NUM_NEEDED) { rl.rlim_cur = NUM_NEEDED; if (setrlimit(RLIMIT_NOFILE, &rl) == -1) { fprintf(stderr, "warning: setrlimit: failed to set RLIMIT_NOFILE\n"); goto skip_open; } } /* open a dummy descriptor */ fd[0] = open(DEV_NULL, O_RDONLY); if (fd[0] == -1) { fprintf(stderr, "open: failed to open %s\n", DEV_NULL); return CURLE_FAILED_INIT; } /* open a lot of file descriptors */ for (i = 0; i < NUM_OPEN; i++) { fd[i] = open(DEV_NULL, O_RDONLY); /* create a bunch of file descriptors */ for (i = 1; i < NUM_OPEN; i++) { fd[i] = dup(fd[0]); if (fd[i] == -1) { fprintf(stderr, "open: attempt #%i: failed to open %s\n", i, DEV_NULL); fprintf(stderr, "dup: attempt #%i failed\n", i); for (i--; i >= 0; i--) close(fd[i]); return CURLE_FAILED_INIT; } } skip_open: curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, URL); curl_easy_setopt(curl, CURLOPT_HEADER, TRUE); Loading @@ -51,3 +99,12 @@ int test(char *URL) return (int)res; } #else /* system lacks getrlimit() and/or setrlimit() */ int test(char *URL) { (void)URL; fprintf(stderr, "system lacks necessary system function(s)"); return 1; } #endif