[monitoring-plugins] check_curl fix: populate the dns cache when ...
GitHub
git at monitoring-plugins.org
Wed Jun 17 23:30:12 CEST 2026
Module: monitoring-plugins
Branch: master
Commit: 605d59f957bc32e57adc0cd40f449ebe41c782ab
Author: inqrphl <32687873+inqrphl at users.noreply.github.com>
Committer: GitHub <noreply at github.com>
Date: Wed Jun 17 23:26:04 2026 +0200
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=605d59f9
check_curl fix: populate the dns cache when hostname gets resolved locally (#2280)
* check_curl fix: populate the dns cache when hostname gets resolved locally
due to a previous refactor, it would populate it when hostname wasnt getting resolved locally
hostname_gets_resolved locally now assumes that resolving is local if proxy was unknown. previously was returning 0 instead of true, contradicting what it says
fix a memory leak. server_address_clean was being assigned to another strndup result before being freed
fix another memory leak, one path to return in hostname_gets_resolved_locally was not freeing up two variables
improve logs and comments around hostname_gets_resolved_locally
clang-format is applied
* check_curl: fix typo in comment
---------
Co-authored-by: Ahmet Oeztuerk <Ahmet.Oeztuerk at consol.de>
---
plugins/check_curl.d/check_curl_helpers.c | 32 ++++++++++++++++++++-----------
plugins/check_curl.d/check_curl_helpers.h | 7 ++++---
2 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/plugins/check_curl.d/check_curl_helpers.c b/plugins/check_curl.d/check_curl_helpers.c
index 4edd0bbf..f58e6663 100644
--- a/plugins/check_curl.d/check_curl_helpers.c
+++ b/plugins/check_curl.d/check_curl_helpers.c
@@ -236,7 +236,7 @@ check_curl_configure_curl(const check_curl_static_curl_config config,
/* host_name, only required for ssl, because we use the host_name later on to make SNI happy */
char dnscache[DEFAULT_BUFFER_SIZE];
char addrstr[DEFAULT_BUFFER_SIZE / 2];
- if (working_state.use_ssl && working_state.host_name != NULL && !have_local_resolution) {
+ if (working_state.use_ssl && working_state.host_name != NULL && have_local_resolution) {
char *tmp_mod_address;
/* lookup_host() requires an IPv6 address without the brackets. */
@@ -1418,17 +1418,18 @@ bool hostname_gets_resolved_locally(const check_curl_working_state working_state
host_name_display = working_state.host_name;
}
- /* IPv4 or IPv6 version of the address */
+ /* IPv4 or IPv6 version of the address, this variable saves both */
char *server_address_clean = strdup(working_state.server_address);
/* server address might be a full length ipv6 address encapsulated in square brackets */
if ((strnlen(working_state.server_address, MAX_IPV4_HOSTLENGTH) > 2) &&
(working_state.server_address[0] == '[') &&
(working_state.server_address[strlen(working_state.server_address) - 1] == ']')) {
+ free(server_address_clean);
server_address_clean =
strndup(working_state.server_address + 1, strlen(working_state.server_address) - 2);
}
- /* check curlopt_noproxy option first */
+ /* check curlopt_noproxy option before trying to understand this function */
/* https://curl.se/libcurl/c/CURLOPT_NOPROXY.html */
/* curlopt_noproxy is specified as a comma separated list of
@@ -1448,9 +1449,10 @@ bool hostname_gets_resolved_locally(const check_curl_working_state working_state
* effectively disables the proxy. */
if (strlen(noproxy_item) == 1 && noproxy_item[0] == '*') {
if (verbose >= 1) {
- printf("* noproxy includes '*' which disables proxy for all host name incl. : "
- "%s / server address incl. : %s\n",
- host_name_display, server_address_clean);
+ printf(
+ "* noproxy includes '*' which disables proxy for all host name including : "
+ "%s / server address including : %s\n",
+ host_name_display, server_address_clean);
}
free(curlopt_noproxy_copy);
free(server_address_clean);
@@ -1507,17 +1509,19 @@ bool hostname_gets_resolved_locally(const check_curl_working_state working_state
if (ip_addr_inside_cidr_ret.error == NO_ERROR) {
if (ip_addr_inside_cidr_ret.inside) {
+ free(curlopt_noproxy_copy);
+ free(server_address_clean);
return true;
} else {
if (verbose >= 1) {
- printf("server address: %s is not inside IP cidr: %s\n",
+ printf("server address: %s is not inside IP CIDR: %s\n",
server_address_clean, noproxy_item);
}
}
} else {
if (verbose >= 1) {
printf("could not fully determine if server address: %s is inside the IP "
- "cidr: %s\n",
+ "CIDR: %s\n",
server_address_clean, noproxy_item);
}
}
@@ -1602,17 +1606,23 @@ bool hostname_gets_resolved_locally(const check_curl_working_state working_state
// string identifies. We do not set this value Without a scheme, it is treated as an http
// proxy
+ if (verbose >= 1) {
+ printf("* proxy scheme is unspecified, and therefore taken as http, proxy: %s resolves "
+ "host: %s or server_address: %s\n",
+ working_state.curlopt_proxy, host_name_display, server_address_clean);
+ }
+
return false;
}
if (verbose >= 1) {
- printf("* proxy scheme is unknown/unavailable, no proxy is assumed for host: %s or "
+ printf("* proxy is unknown/unavailable, no proxy is assumed for host: %s or "
"server_address: %s\n",
host_name_display, server_address_clean);
}
free(server_address_clean);
- return 0;
+ return true;
}
ip_addr_inside ip_addr_inside_cidr(const char *cidr_region_or_ip_addr, const char *target_ip) {
@@ -1659,7 +1669,7 @@ ip_addr_inside ip_addr_inside_cidr(const char *cidr_region_or_ip_addr, const cha
prefix_length = (int)tmp;
} else {
if (verbose >= 1) {
- printf("cidr_region_or_ip: %s , has %d number of '/' characters, is not a valid "
+ printf("cidr_region_or_ip: %s , has %u number of '/' characters, is not a valid "
"cidr_region or IP\n",
cidr_region_or_ip_addr, slash_count);
}
diff --git a/plugins/check_curl.d/check_curl_helpers.h b/plugins/check_curl.d/check_curl_helpers.h
index 55df9bc1..2f9b0d1c 100644
--- a/plugins/check_curl.d/check_curl_helpers.h
+++ b/plugins/check_curl.d/check_curl_helpers.h
@@ -127,9 +127,10 @@ mp_subcheck check_curl_certificate_checks(CURL *curl, X509 *cert, int warn_days_
int crit_days_till_exp);
char *fmt_url(check_curl_working_state workingState);
-/* determine_hostname_resolver determines if the host or the proxy resolves the target hostname
-returns RESOLVE_LOCALLY if requester resolves the hostname locally, RESOLVE_REMOTELY if proxy
-resolves the hostname */
+/* hostname_gets_resolved_locally determines if the host or the proxy resolves the target hostname.
+This depends on proxy schema, forced proxy and noproxy hostnames, wildcarded hostnames, IP addresses
+and IP CIDRs. Returns true if the host resolves the hostname locally, and false if proxy resolves
+the hostname */
bool hostname_gets_resolved_locally(const check_curl_working_state working_state);
/* Checks if an IP is inside given CIDR region. Using /protocol_size or not specifying the prefix
More information about the Commits
mailing list