1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
9: *
10: * This software is licensed as described in the file COPYING, which
11: * you should have received as part of this distribution. The terms
12: * are also available at https://curl.haxx.se/docs/copyright.html.
13: *
14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: * copies of the Software, and permit persons to whom the Software is
16: * furnished to do so, under the terms of the COPYING file.
17: *
18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: * KIND, either express or implied.
20: *
21: ***************************************************************************/
22: /*
23: * This source code is used for lib1502, lib1503, lib1504 and lib1505 with
24: * only #ifdefs controlling the cleanup sequence.
25: *
26: * Test case 1502 converted from bug report #3575448, identifying a memory
27: * leak in the CURLOPT_RESOLVE handling with the multi interface.
28: */
29:
30: #include "test.h"
31:
32: #include <limits.h>
33:
34: #include "testutil.h"
35: #include "warnless.h"
36: #include "memdebug.h"
37:
38: #define TEST_HANG_TIMEOUT 60 * 1000
39:
40: int test(char *URL)
41: {
42: CURL *easy = NULL;
43: CURL *dup;
44: CURLM *multi = NULL;
45: int still_running;
46: int res = 0;
47:
48: char redirect[160];
49:
50: /* DNS cache injection */
51: struct curl_slist *dns_cache_list;
52:
53: msnprintf(redirect, sizeof(redirect), "google.com:%s:%s", libtest_arg2,
54: libtest_arg3);
55:
56: start_test_timing();
57:
58: dns_cache_list = curl_slist_append(NULL, redirect);
59: if(!dns_cache_list) {
60: fprintf(stderr, "curl_slist_append() failed\n");
61: return TEST_ERR_MAJOR_BAD;
62: }
63:
64: res_global_init(CURL_GLOBAL_ALL);
65: if(res) {
66: curl_slist_free_all(dns_cache_list);
67: return res;
68: }
69:
70: easy_init(easy);
71:
72: easy_setopt(easy, CURLOPT_URL, URL);
73: easy_setopt(easy, CURLOPT_HEADER, 1L);
74: easy_setopt(easy, CURLOPT_RESOLVE, dns_cache_list);
75:
76: dup = curl_easy_duphandle(easy);
77: if(dup) {
78: curl_easy_cleanup(easy);
79: easy = dup;
80: }
81: else {
82: curl_slist_free_all(dns_cache_list);
83: curl_easy_cleanup(easy);
84: return CURLE_OUT_OF_MEMORY;
85: }
86:
87: multi_init(multi);
88:
89: multi_add_handle(multi, easy);
90:
91: multi_perform(multi, &still_running);
92:
93: abort_on_test_timeout();
94:
95: while(still_running) {
96: struct timeval timeout;
97: fd_set fdread;
98: fd_set fdwrite;
99: fd_set fdexcep;
100: int maxfd = -99;
101:
102: FD_ZERO(&fdread);
103: FD_ZERO(&fdwrite);
104: FD_ZERO(&fdexcep);
105: timeout.tv_sec = 1;
106: timeout.tv_usec = 0;
107:
108: multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
109:
110: /* At this point, maxfd is guaranteed to be greater or equal than -1. */
111:
112: select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
113:
114: abort_on_test_timeout();
115:
116: multi_perform(multi, &still_running);
117:
118: abort_on_test_timeout();
119: }
120:
121: test_cleanup:
122:
123: #ifdef LIB1502
124: /* undocumented cleanup sequence - type UA */
125: curl_multi_cleanup(multi);
126: curl_easy_cleanup(easy);
127: curl_global_cleanup();
128: #endif
129:
130: #ifdef LIB1503
131: /* proper cleanup sequence - type PA */
132: curl_multi_remove_handle(multi, easy);
133: curl_multi_cleanup(multi);
134: curl_easy_cleanup(easy);
135: curl_global_cleanup();
136: #endif
137:
138: #ifdef LIB1504
139: /* undocumented cleanup sequence - type UB */
140: curl_easy_cleanup(easy);
141: curl_multi_cleanup(multi);
142: curl_global_cleanup();
143: #endif
144:
145: #ifdef LIB1505
146: /* proper cleanup sequence - type PB */
147: curl_multi_remove_handle(multi, easy);
148: curl_easy_cleanup(easy);
149: curl_multi_cleanup(multi);
150: curl_global_cleanup();
151: #endif
152:
153: curl_slist_free_all(dns_cache_list);
154:
155: return res;
156: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>