summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrl1987 <rl1987@sdf.lonestar.org>2020-04-08 18:33:18 +0300
committerrl1987 <rl1987@users.noreply.github.com>2020-05-21 13:41:15 +0300
commitd8e24684b6607baa95dd4950a14ea671edcef1dc (patch)
tree72325d8d8e236f34877c85170d22d804cc5808de
parentb5bfdbfd41e38ac73d6655ff3da5a06b66f54d8a (diff)
downloadtor-d8e24684b6607baa95dd4950a14ea671edcef1dc.tar.gz
tor-d8e24684b6607baa95dd4950a14ea671edcef1dc.zip
Check for possible failures of tor_inet_ntop/tor_inet_ntoa in fmt_addr32 and tor_dup_ip
-rw-r--r--src/lib/net/address.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/lib/net/address.c b/src/lib/net/address.c
index b8f5f37747..b24fe6c91e 100644
--- a/src/lib/net/address.c
+++ b/src/lib/net/address.c
@@ -1196,14 +1196,24 @@ fmt_addrport(const tor_addr_t *addr, uint16_t port)
/** Like fmt_addr(), but takes <b>addr</b> as a host-order IPv4
* addresses. Also not thread-safe, also clobbers its return buffer on
- * repeated calls. */
+ * repeated calls. Clean internal buffer and return empty string on failure. */
const char *
fmt_addr32(uint32_t addr)
{
static char buf[INET_NTOA_BUF_LEN];
struct in_addr in;
+ int success;
+
in.s_addr = htonl(addr);
- tor_inet_ntoa(&in, buf, sizeof(buf));
+
+ success = tor_inet_ntoa(&in, buf, sizeof(buf));
+ tor_assertf_nonfatal(success > 0,
+ "Failed to convert IP %04X to string", addr);
+
+ if (success <= 0) {
+ memset(buf, 0, INET_NTOA_BUF_LEN);
+ }
+
return buf;
}
@@ -1995,17 +2005,24 @@ parse_port_range(const char *port, uint16_t *port_min_out,
}
/** Given a host-order <b>addr</b>, call tor_inet_ntop() on it
- * and return a strdup of the resulting address.
+ * and return a strdup of the resulting address. Return NULL if
+ * tor_inet_ntop() fails.
*/
char *
tor_dup_ip(uint32_t addr)
{
+ const char *ip_str;
char buf[TOR_ADDR_BUF_LEN];
struct in_addr in;
in.s_addr = htonl(addr);
- tor_inet_ntop(AF_INET, &in, buf, sizeof(buf));
- return tor_strdup(buf);
+ ip_str = tor_inet_ntop(AF_INET, &in, buf, sizeof(buf));
+
+ tor_assertf_nonfatal(ip_str, "Failed to duplicate IP %04X", addr);
+ if (ip_str)
+ return tor_strdup(buf);
+
+ return NULL;
}
/**