From 8a3abfb597434a001477f4565d74837a4cae24cd Mon Sep 17 00:00:00 2001 From: yhirose Date: Fri, 2 Oct 2026 21:15:14 -0400 Subject: [PATCH] Extract parse_int_in_range from parse_port parse_port and the NO_PROXY CIDR prefix parsing each repeated the same from_chars call, full-consumption check and range check. Move that into a parse_int_in_range helper and use it in both places. --- httplib.h | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/httplib.h b/httplib.h index c8aa168b..31fc1143 100644 --- a/httplib.h +++ b/httplib.h @@ -831,16 +831,21 @@ inline from_chars_result from_chars(const char *first, const char *last, return {p, std::errc{}}; } -inline bool parse_port(const char *s, size_t len, int &port) { +inline bool parse_int_in_range(const char *s, size_t len, int lo, int hi, + int &out) { int val = 0; auto r = from_chars(s, s + len, val); - if (r.ec != std::errc{} || r.ptr != s + len || val < 1 || val > 65535) { + if (r.ec != std::errc{} || r.ptr != s + len || val < lo || val > hi) { return false; } - port = val; + out = val; return true; } +inline bool parse_port(const char *s, size_t len, int &port) { + return parse_int_in_range(s, len, 1, 65535, port); +} + inline bool parse_port(const std::string &s, int &port) { return parse_port(s.data(), s.size(), port); } @@ -12470,14 +12475,10 @@ inline bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out) { struct in_addr v4; if (inet_pton(AF_INET, addr_part.c_str(), &v4) == 1) { int prefix = 32; - if (!prefix_part.empty()) { - auto r = from_chars(prefix_part.data(), - prefix_part.data() + prefix_part.size(), prefix); - if (r.ec != std::errc{} || - r.ptr != prefix_part.data() + prefix_part.size()) { - return false; - } - if (prefix < 0 || prefix > 32) { return false; } + if (!prefix_part.empty() && + !parse_int_in_range(prefix_part.data(), prefix_part.size(), 0, 32, + prefix)) { + return false; } out.kind = NoProxyKind::IPv4Cidr; std::memcpy(out.net.data(), &v4, sizeof(v4)); @@ -12489,14 +12490,10 @@ inline bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out) { struct in6_addr v6; if (inet_pton(AF_INET6, addr_part.c_str(), &v6) == 1) { int prefix = 128; - if (!prefix_part.empty()) { - auto r = from_chars(prefix_part.data(), - prefix_part.data() + prefix_part.size(), prefix); - if (r.ec != std::errc{} || - r.ptr != prefix_part.data() + prefix_part.size()) { - return false; - } - if (prefix < 0 || prefix > 128) { return false; } + if (!prefix_part.empty() && + !parse_int_in_range(prefix_part.data(), prefix_part.size(), 0, 128, + prefix)) { + return false; } out.kind = NoProxyKind::IPv6Cidr; std::memcpy(out.net.data(), &v6, sizeof(v6));