diff options
-rw-r--r-- | plugins/check_http.c | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/plugins/check_http.c b/plugins/check_http.c index 1b4bae3..306e4a2 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c | |||
@@ -177,15 +177,14 @@ int errcode; | |||
177 | #define HTTP_EXPECT "HTTP/1." | 177 | #define HTTP_EXPECT "HTTP/1." |
178 | #define HTTP_URL "/" | 178 | #define HTTP_URL "/" |
179 | 179 | ||
180 | time_t start_time, end_time; | ||
181 | char timestamp[10] = ""; | 180 | char timestamp[10] = ""; |
182 | int specify_port = FALSE; | 181 | int specify_port = FALSE; |
183 | int server_port = HTTP_PORT; | 182 | int server_port = HTTP_PORT; |
184 | char server_port_text[6] = ""; | 183 | char server_port_text[6] = ""; |
185 | char server_type[6] = "http"; | 184 | char server_type[6] = "http"; |
186 | char *server_address = NULL; | 185 | /*@null@*/ char *server_address = NULL; |
187 | char *host_name = NULL; | 186 | /*@null@*/ char *host_name = NULL; |
188 | char *server_url = NULL; | 187 | /*@null@*/ char *server_url = NULL; |
189 | int server_url_length = 0; | 188 | int server_url_length = 0; |
190 | int server_expect_yn = 0; | 189 | int server_expect_yn = 0; |
191 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; | 190 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; |
@@ -200,8 +199,8 @@ int onredirect = STATE_OK; | |||
200 | int use_ssl = FALSE; | 199 | int use_ssl = FALSE; |
201 | int verbose = FALSE; | 200 | int verbose = FALSE; |
202 | int sd; | 201 | int sd; |
203 | char *http_method = NULL; | 202 | /*@null@*/ char *http_method = NULL; |
204 | char *http_post_data = NULL; | 203 | /*@null@*/ char *http_post_data = NULL; |
205 | char buffer[MAX_INPUT_BUFFER]; | 204 | char buffer[MAX_INPUT_BUFFER]; |
206 | 205 | ||
207 | void print_usage (void); | 206 | void print_usage (void); |
@@ -223,9 +222,9 @@ main (int argc, char **argv) | |||
223 | 222 | ||
224 | if (strstr (timestamp, ":")) { | 223 | if (strstr (timestamp, ":")) { |
225 | if (strstr (server_url, "?")) | 224 | if (strstr (server_url, "?")) |
226 | sprintf (server_url, "%s&%s", server_url, timestamp); | 225 | server_url = ssprintf (server_url, "%s&%s", server_url, timestamp); |
227 | else | 226 | else |
228 | sprintf (server_url, "%s?%s", server_url, timestamp); | 227 | server_url = ssprintf (server_url, "%s?%s", server_url, timestamp); |
229 | } | 228 | } |
230 | 229 | ||
231 | if (display_html == TRUE) | 230 | if (display_html == TRUE) |
@@ -233,9 +232,9 @@ main (int argc, char **argv) | |||
233 | host_name, server_port, server_url); | 232 | host_name, server_port, server_url); |
234 | 233 | ||
235 | /* initialize alarm signal handling, set socket timeout, start timer */ | 234 | /* initialize alarm signal handling, set socket timeout, start timer */ |
236 | signal (SIGALRM, socket_timeout_alarm_handler); | 235 | (void) signal (SIGALRM, socket_timeout_alarm_handler); |
237 | alarm (socket_timeout); | 236 | (void) alarm (socket_timeout); |
238 | time (&start_time); | 237 | (void) time (&start_time); |
239 | 238 | ||
240 | #ifdef HAVE_SSL | 239 | #ifdef HAVE_SSL |
241 | if (use_ssl && check_cert == TRUE) { | 240 | if (use_ssl && check_cert == TRUE) { |
@@ -431,8 +430,8 @@ process_arguments (int argc, char **argv) | |||
431 | case 'r': /* regex */ | 430 | case 'r': /* regex */ |
432 | #ifdef HAVE_REGEX_H | 431 | #ifdef HAVE_REGEX_H |
433 | cflags |= REG_EXTENDED | REG_NOSUB | REG_NEWLINE; | 432 | cflags |= REG_EXTENDED | REG_NOSUB | REG_NEWLINE; |
434 | strncpy (regexp, optarg, MAX_INPUT_BUFFER - 1); | 433 | strncpy (regexp, optarg, MAX_RE_SIZE - 1); |
435 | regexp[MAX_INPUT_BUFFER - 1] = 0; | 434 | regexp[MAX_RE_SIZE - 1] = 0; |
436 | errcode = regcomp (&preg, regexp, cflags); | 435 | errcode = regcomp (&preg, regexp, cflags); |
437 | if (errcode != 0) { | 436 | if (errcode != 0) { |
438 | regerror (errcode, &preg, errbuf, MAX_INPUT_BUFFER); | 437 | regerror (errcode, &preg, errbuf, MAX_INPUT_BUFFER); |
@@ -487,9 +486,7 @@ base64 (char *bin, int len) | |||
487 | int i = 0, j = 0; | 486 | int i = 0, j = 0; |
488 | 487 | ||
489 | char BASE64_END = '='; | 488 | char BASE64_END = '='; |
490 | char base64_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | 489 | char base64_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
491 | "abcdefghijklmnopqrstuvwxyz" | ||
492 | "0123456789+/"; | ||
493 | 490 | ||
494 | while (j < len - 2) { | 491 | while (j < len - 2) { |
495 | buf[i++] = base64_table[bin[j] >> 2]; | 492 | buf[i++] = base64_table[bin[j] >> 2]; |
@@ -552,7 +549,7 @@ check_http (void) | |||
552 | return STATE_CRITICAL; | 549 | return STATE_CRITICAL; |
553 | } | 550 | } |
554 | 551 | ||
555 | sprintf (buffer, "%s %s HTTP/1.0\r\n", http_method, server_url); | 552 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "%s %s HTTP/1.0\r\n", http_method, server_url); |
556 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 553 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
557 | ERR_print_errors_fp (stderr); | 554 | ERR_print_errors_fp (stderr); |
558 | return STATE_CRITICAL; | 555 | return STATE_CRITICAL; |
@@ -560,7 +557,7 @@ check_http (void) | |||
560 | 557 | ||
561 | /* optionally send the host header info (not clear if it's usable) */ | 558 | /* optionally send the host header info (not clear if it's usable) */ |
562 | if (strcmp (host_name, "")) { | 559 | if (strcmp (host_name, "")) { |
563 | sprintf (buffer, "Host: %s\r\n", host_name); | 560 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Host: %s\r\n", host_name); |
564 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 561 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
565 | ERR_print_errors_fp (stderr); | 562 | ERR_print_errors_fp (stderr); |
566 | return STATE_CRITICAL; | 563 | return STATE_CRITICAL; |
@@ -568,7 +565,7 @@ check_http (void) | |||
568 | } | 565 | } |
569 | 566 | ||
570 | /* send user agent */ | 567 | /* send user agent */ |
571 | sprintf (buffer, "User-Agent: check_http/%s (nagios-plugins %s)\r\n", | 568 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "User-Agent: check_http/%s (nagios-plugins %s)\r\n", |
572 | clean_revstring (REVISION), PACKAGE_VERSION); | 569 | clean_revstring (REVISION), PACKAGE_VERSION); |
573 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 570 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
574 | ERR_print_errors_fp (stderr); | 571 | ERR_print_errors_fp (stderr); |
@@ -578,7 +575,7 @@ check_http (void) | |||
578 | /* optionally send the authentication info */ | 575 | /* optionally send the authentication info */ |
579 | if (strcmp (user_auth, "")) { | 576 | if (strcmp (user_auth, "")) { |
580 | auth = base64 (user_auth, strlen (user_auth)); | 577 | auth = base64 (user_auth, strlen (user_auth)); |
581 | sprintf (buffer, "Authorization: Basic %s\r\n", auth); | 578 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Authorization: Basic %s\r\n", auth); |
582 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 579 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
583 | ERR_print_errors_fp (stderr); | 580 | ERR_print_errors_fp (stderr); |
584 | return STATE_CRITICAL; | 581 | return STATE_CRITICAL; |
@@ -587,12 +584,12 @@ check_http (void) | |||
587 | 584 | ||
588 | /* optionally send http POST data */ | 585 | /* optionally send http POST data */ |
589 | if (http_post_data) { | 586 | if (http_post_data) { |
590 | sprintf (buffer, "Content-Type: application/x-www-form-urlencoded\r\n"); | 587 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Content-Type: application/x-www-form-urlencoded\r\n"); |
591 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 588 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
592 | ERR_print_errors_fp (stderr); | 589 | ERR_print_errors_fp (stderr); |
593 | return STATE_CRITICAL; | 590 | return STATE_CRITICAL; |
594 | } | 591 | } |
595 | sprintf (buffer, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); | 592 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); |
596 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 593 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
597 | ERR_print_errors_fp (stderr); | 594 | ERR_print_errors_fp (stderr); |
598 | return STATE_CRITICAL; | 595 | return STATE_CRITICAL; |
@@ -605,7 +602,7 @@ check_http (void) | |||
605 | } | 602 | } |
606 | 603 | ||
607 | /* send a newline so the server knows we're done with the request */ | 604 | /* send a newline so the server knows we're done with the request */ |
608 | sprintf (buffer, "\r\n\r\n"); | 605 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "\r\n\r\n"); |
609 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { | 606 | if (SSL_write (ssl, buffer, strlen (buffer)) == -1) { |
610 | ERR_print_errors_fp (stderr); | 607 | ERR_print_errors_fp (stderr); |
611 | return STATE_CRITICAL; | 608 | return STATE_CRITICAL; |
@@ -618,19 +615,19 @@ check_http (void) | |||
618 | msg = ssprintf (msg, "Unable to open TCP socket"); | 615 | msg = ssprintf (msg, "Unable to open TCP socket"); |
619 | terminate (STATE_CRITICAL, msg); | 616 | terminate (STATE_CRITICAL, msg); |
620 | } | 617 | } |
621 | sprintf (buffer, "%s %s HTTP/1.0\r\n", http_method, server_url); | 618 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "%s %s HTTP/1.0\r\n", http_method, server_url); |
622 | send (sd, buffer, strlen (buffer), 0); | 619 | send (sd, buffer, strlen (buffer), 0); |
623 | 620 | ||
624 | 621 | ||
625 | 622 | ||
626 | /* optionally send the host header info */ | 623 | /* optionally send the host header info */ |
627 | if (strcmp (host_name, "")) { | 624 | if (strcmp (host_name, "")) { |
628 | sprintf (buffer, "Host: %s\r\n", host_name); | 625 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Host: %s\r\n", host_name); |
629 | send (sd, buffer, strlen (buffer), 0); | 626 | send (sd, buffer, strlen (buffer), 0); |
630 | } | 627 | } |
631 | 628 | ||
632 | /* send user agent */ | 629 | /* send user agent */ |
633 | sprintf (buffer, | 630 | snprintf (buffer, MAX_INPUT_BUFFER - 1, |
634 | "User-Agent: check_http/%s (nagios-plugins %s)\r\n", | 631 | "User-Agent: check_http/%s (nagios-plugins %s)\r\n", |
635 | clean_revstring (REVISION), PACKAGE_VERSION); | 632 | clean_revstring (REVISION), PACKAGE_VERSION); |
636 | send (sd, buffer, strlen (buffer), 0); | 633 | send (sd, buffer, strlen (buffer), 0); |
@@ -638,23 +635,23 @@ check_http (void) | |||
638 | /* optionally send the authentication info */ | 635 | /* optionally send the authentication info */ |
639 | if (strcmp (user_auth, "")) { | 636 | if (strcmp (user_auth, "")) { |
640 | auth = base64 (user_auth, strlen (user_auth)); | 637 | auth = base64 (user_auth, strlen (user_auth)); |
641 | sprintf (buffer, "Authorization: Basic %s\r\n", auth); | 638 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Authorization: Basic %s\r\n", auth); |
642 | send (sd, buffer, strlen (buffer), 0); | 639 | send (sd, buffer, strlen (buffer), 0); |
643 | } | 640 | } |
644 | 641 | ||
645 | /* optionally send http POST data */ | 642 | /* optionally send http POST data */ |
646 | /* written by Chris Henesy <lurker@shadowtech.org> */ | 643 | /* written by Chris Henesy <lurker@shadowtech.org> */ |
647 | if (http_post_data) { | 644 | if (http_post_data) { |
648 | sprintf (buffer, "Content-Type: application/x-www-form-urlencoded\r\n"); | 645 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Content-Type: application/x-www-form-urlencoded\r\n"); |
649 | send (sd, buffer, strlen (buffer), 0); | 646 | send (sd, buffer, strlen (buffer), 0); |
650 | sprintf (buffer, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); | 647 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); |
651 | send (sd, buffer, strlen (buffer), 0); | 648 | send (sd, buffer, strlen (buffer), 0); |
652 | http_post_data = strscat (http_post_data, "\r\n"); | 649 | http_post_data = strscat (http_post_data, "\r\n"); |
653 | send (sd, http_post_data, strlen (http_post_data), 0); | 650 | send (sd, http_post_data, strlen (http_post_data), 0); |
654 | } | 651 | } |
655 | 652 | ||
656 | /* send a newline so the server knows we're done with the request */ | 653 | /* send a newline so the server knows we're done with the request */ |
657 | sprintf (buffer, "\r\n\r\n"); | 654 | snprintf (buffer, MAX_INPUT_BUFFER - 1, "\r\n\r\n"); |
658 | send (sd, buffer, strlen (buffer), 0); | 655 | send (sd, buffer, strlen (buffer), 0); |
659 | #ifdef HAVE_SSL | 656 | #ifdef HAVE_SSL |
660 | } | 657 | } |
@@ -993,8 +990,8 @@ check_certificate (X509 ** certificate) | |||
993 | stamp.tm_isdst = -1; | 990 | stamp.tm_isdst = -1; |
994 | 991 | ||
995 | days_left = (mktime (&stamp) - time (NULL)) / 86400; | 992 | days_left = (mktime (&stamp) - time (NULL)) / 86400; |
996 | sprintf | 993 | snprintf |
997 | (timestamp, "%02d/%02d/%04d %02d:%02d", | 994 | (timestamp, MAX_INPUT_BUFFER - 1, "%02d/%02d/%04d %02d:%02d", |
998 | stamp.tm_mon + 1, | 995 | stamp.tm_mon + 1, |
999 | stamp.tm_mday, stamp.tm_year + 1900, stamp.tm_hour, stamp.tm_min); | 996 | stamp.tm_mday, stamp.tm_year + 1900, stamp.tm_hour, stamp.tm_min); |
1000 | 997 | ||