diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-12 12:11:38 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-12 12:11:38 +0100 |
commit | 40da85e6913ba4898f5a80772c7b3ea0cba0d3eb (patch) | |
tree | a278b550cdb02baebfbc28a46b43fdc33c6fa1ef | |
parent | f6978deaa1bf7c6a7196363104ebfcef143080ab (diff) | |
download | monitoring-plugins-40da85e6913ba4898f5a80772c7b3ea0cba0d3eb.tar.gz |
better cleanup of curl structures and buffers
-rw-r--r-- | plugins/check_curl.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/plugins/check_curl.c b/plugins/check_curl.c index 35d1237b..a49cac8a 100644 --- a/plugins/check_curl.c +++ b/plugins/check_curl.c | |||
@@ -161,9 +161,13 @@ char *http_post_data = NULL; | |||
161 | char *http_content_type = NULL; | 161 | char *http_content_type = NULL; |
162 | CURL *curl; | 162 | CURL *curl; |
163 | struct curl_slist *header_list = NULL; | 163 | struct curl_slist *header_list = NULL; |
164 | int body_buf_initialized = 0; | ||
164 | curlhelp_write_curlbuf body_buf; | 165 | curlhelp_write_curlbuf body_buf; |
166 | int header_buf_initialized = 0; | ||
165 | curlhelp_write_curlbuf header_buf; | 167 | curlhelp_write_curlbuf header_buf; |
168 | int status_line_initialized = 0; | ||
166 | curlhelp_statusline status_line; | 169 | curlhelp_statusline status_line; |
170 | int put_buf_initialized = 0; | ||
167 | curlhelp_read_curlbuf put_buf; | 171 | curlhelp_read_curlbuf put_buf; |
168 | char http_header[DEFAULT_BUFFER_SIZE]; | 172 | char http_header[DEFAULT_BUFFER_SIZE]; |
169 | long code; | 173 | long code; |
@@ -416,14 +420,12 @@ lookup_host (const char *host, char *buf, size_t buflen) | |||
416 | static void | 420 | static void |
417 | cleanup (void) | 421 | cleanup (void) |
418 | { | 422 | { |
419 | curlhelp_free_statusline(&status_line); | 423 | if (status_line_initialized) curlhelp_free_statusline(&status_line); |
420 | curl_easy_cleanup (curl); | 424 | curl_easy_cleanup (curl); |
421 | curl_global_cleanup (); | 425 | curl_global_cleanup (); |
422 | curlhelp_freewritebuffer (&body_buf); | 426 | if (body_buf_initialized) curlhelp_freewritebuffer (&body_buf); |
423 | curlhelp_freewritebuffer (&header_buf); | 427 | if (header_buf_initialized) curlhelp_freewritebuffer (&header_buf); |
424 | if (!strcmp (http_method, "PUT")) { | 428 | if (put_buf_initialized) curlhelp_freereadbuffer (&put_buf); |
425 | curlhelp_freereadbuffer (&put_buf); | ||
426 | } | ||
427 | } | 429 | } |
428 | 430 | ||
429 | int | 431 | int |
@@ -441,9 +443,14 @@ check_http (void) | |||
441 | if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK) | 443 | if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK) |
442 | die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n"); | 444 | die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n"); |
443 | 445 | ||
444 | if ((curl = curl_easy_init()) == NULL) | 446 | if ((curl = curl_easy_init()) == NULL) { |
447 | curl_global_cleanup (); | ||
445 | die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n"); | 448 | die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n"); |
449 | } | ||
446 | 450 | ||
451 | /* register cleanup function to shut down libcurl properly */ | ||
452 | atexit (cleanup); | ||
453 | |||
447 | if (verbose >= 1) | 454 | if (verbose >= 1) |
448 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE), "CURLOPT_VERBOSE"); | 455 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE), "CURLOPT_VERBOSE"); |
449 | 456 | ||
@@ -460,12 +467,14 @@ check_http (void) | |||
460 | /* initialize buffer for body of the answer */ | 467 | /* initialize buffer for body of the answer */ |
461 | if (curlhelp_initwritebuffer(&body_buf) < 0) | 468 | if (curlhelp_initwritebuffer(&body_buf) < 0) |
462 | die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n"); | 469 | die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n"); |
470 | body_buf_initialized = 1; | ||
463 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_WRITEFUNCTION"); | 471 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_WRITEFUNCTION"); |
464 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf), "CURLOPT_WRITEDATA"); | 472 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf), "CURLOPT_WRITEDATA"); |
465 | 473 | ||
466 | /* initialize buffer for header of the answer */ | 474 | /* initialize buffer for header of the answer */ |
467 | if (curlhelp_initwritebuffer( &header_buf ) < 0) | 475 | if (curlhelp_initwritebuffer( &header_buf ) < 0) |
468 | die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" ); | 476 | die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" ); |
477 | header_buf_initialized = 1; | ||
469 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_HEADERFUNCTION"); | 478 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_HEADERFUNCTION"); |
470 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf), "CURLOPT_WRITEHEADER"); | 479 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf), "CURLOPT_WRITEHEADER"); |
471 | 480 | ||
@@ -752,7 +761,9 @@ check_http (void) | |||
752 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_POSTFIELDS, http_post_data), "CURLOPT_POSTFIELDS"); | 761 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_POSTFIELDS, http_post_data), "CURLOPT_POSTFIELDS"); |
753 | } else if (!strcmp(http_method, "PUT")) { | 762 | } else if (!strcmp(http_method, "PUT")) { |
754 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READFUNCTION, (curl_read_callback)curlhelp_buffer_read_callback), "CURLOPT_READFUNCTION"); | 763 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READFUNCTION, (curl_read_callback)curlhelp_buffer_read_callback), "CURLOPT_READFUNCTION"); |
755 | curlhelp_initreadbuffer (&put_buf, http_post_data, strlen (http_post_data)); | 764 | if (curlhelp_initreadbuffer (&put_buf, http_post_data, strlen (http_post_data)) < 0) |
765 | die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating read buffer for PUT\n"); | ||
766 | put_buf_initialized = 1; | ||
756 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READDATA, (void *)&put_buf), "CURLOPT_READDATA"); | 767 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READDATA, (void *)&put_buf), "CURLOPT_READDATA"); |
757 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE"); | 768 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE"); |
758 | } | 769 | } |
@@ -764,9 +775,6 @@ check_http (void) | |||
764 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEFILE, cookie_jar_file), "CURLOPT_COOKIEFILE"); | 775 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEFILE, cookie_jar_file), "CURLOPT_COOKIEFILE"); |
765 | } | 776 | } |
766 | 777 | ||
767 | /* register cleanup function to shut down libcurl properly */ | ||
768 | atexit (cleanup); | ||
769 | |||
770 | /* do the request */ | 778 | /* do the request */ |
771 | res = curl_easy_perform(curl); | 779 | res = curl_easy_perform(curl); |
772 | 780 | ||
@@ -2159,6 +2167,7 @@ curlhelp_parse_statusline (const char *buf, curlhelp_statusline *status_line) | |||
2159 | 2167 | ||
2160 | first_line_len = (size_t)(first_line_end - buf); | 2168 | first_line_len = (size_t)(first_line_end - buf); |
2161 | status_line->first_line = (char *)malloc (first_line_len + 1); | 2169 | status_line->first_line = (char *)malloc (first_line_len + 1); |
2170 | status_line_initialized = 1; | ||
2162 | if (status_line->first_line == NULL) return -1; | 2171 | if (status_line->first_line == NULL) return -1; |
2163 | memcpy (status_line->first_line, buf, first_line_len); | 2172 | memcpy (status_line->first_line, buf, first_line_len); |
2164 | status_line->first_line[first_line_len] = '\0'; | 2173 | status_line->first_line[first_line_len] = '\0'; |