Skip to content

Commit 1a79582

Browse files
committed
Fixed null-deref (cppcheck) + addressed copilot comment
1 parent cb3e80c commit 1a79582

3 files changed

Lines changed: 72 additions & 6 deletions

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@ Suite *wolf_suite(void)
698698
tcase_add_test(tc_proto, test_icmp_input_filter_drop_receiving);
699699
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_closes_matching_tcp_socket);
700700
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss);
701+
tcase_add_test(tc_proto, test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_match_tcp_socket);
701702
tcase_add_test(tc_proto, test_udp_sendto_and_recvfrom);
702703
tcase_add_test(tc_proto, test_udp_sendto_respects_mtu_api);
703704
tcase_add_test(tc_proto, test_udp_recvfrom_sets_remote_ip);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2142,6 +2142,65 @@ START_TEST(test_icmp_input_dest_unreach_frag_needed_reduces_tcp_peer_mss)
21422142
}
21432143
END_TEST
21442144

2145+
START_TEST(test_icmp_input_dest_unreach_port_unreachable_quoted_ip_options_match_tcp_socket)
2146+
{
2147+
struct wolfIP s;
2148+
struct tsocket *ts;
2149+
uint8_t packet[sizeof(struct wolfIP_icmp_dest_unreachable_packet) + 4];
2150+
struct wolfIP_icmp_packet *icmp = (struct wolfIP_icmp_packet *)packet;
2151+
struct wolfIP_ip_wire *orig_ip;
2152+
uint8_t *orig_tcp;
2153+
uint16_t port;
2154+
uint32_t icmp_body_len;
2155+
uint32_t frame_len;
2156+
2157+
wolfIP_init(&s);
2158+
mock_link_init(&s);
2159+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
2160+
2161+
ts = &s.tcpsockets[0];
2162+
memset(ts, 0, sizeof(*ts));
2163+
ts->proto = WI_IPPROTO_TCP;
2164+
ts->S = &s;
2165+
ts->sock.tcp.state = TCP_ESTABLISHED;
2166+
ts->local_ip = 0x0A000001U;
2167+
ts->remote_ip = 0x0A000002U;
2168+
ts->src_port = 1234;
2169+
ts->dst_port = 4321;
2170+
2171+
memset(packet, 0, sizeof(packet));
2172+
icmp_body_len = ICMP_HEADER_LEN + 24U + 8U;
2173+
icmp->ip.src = ee32(0x0A0000FEU);
2174+
icmp->ip.dst = ee32(ts->local_ip);
2175+
icmp->ip.ttl = 64;
2176+
icmp->ip.proto = WI_IPPROTO_ICMP;
2177+
icmp->ip.len = ee16(IP_HEADER_LEN + icmp_body_len);
2178+
icmp->type = ICMP_DEST_UNREACH;
2179+
icmp->code = ICMP_PORT_UNREACH;
2180+
2181+
orig_ip = (struct wolfIP_ip_wire *)(packet + sizeof(struct wolfIP_icmp_packet));
2182+
orig_ip->ver_ihl = 0x46;
2183+
orig_ip->proto = WI_IPPROTO_TCP;
2184+
orig_ip->src = ee32(ts->local_ip);
2185+
orig_ip->dst = ee32(ts->remote_ip);
2186+
orig_ip->len = ee16(24U + 8U);
2187+
memset(orig_ip->data, 0xAB, 4);
2188+
2189+
orig_tcp = ((uint8_t *)orig_ip) + 24U;
2190+
port = ee16(ts->src_port);
2191+
memcpy(orig_tcp, &port, sizeof(port));
2192+
port = ee16(ts->dst_port);
2193+
memcpy(orig_tcp + sizeof(port), &port, sizeof(port));
2194+
2195+
icmp->csum = ee16(icmp_checksum(icmp, icmp_body_len));
2196+
frame_len = (uint32_t)(ETH_HEADER_LEN + IP_HEADER_LEN + icmp_body_len);
2197+
2198+
icmp_input(&s, TEST_PRIMARY_IF, (struct wolfIP_ip_packet *)icmp, frame_len);
2199+
2200+
ck_assert_uint_eq(ts->proto, 0U);
2201+
}
2202+
END_TEST
2203+
21452204
START_TEST(test_dns_send_query_errors)
21462205
{
21472206
struct wolfIP s;

src/wolfip.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,7 +1984,8 @@ static void icmp_try_deliver_tcp_error(struct wolfIP *s,
19841984
const struct wolfIP_icmp_packet *icmp)
19851985
{
19861986
const struct wolfIP_ip_wire *orig_ip;
1987-
const struct wolfIP_tcp_wire_prefix *orig_tcp;
1987+
const uint8_t *orig_tcp;
1988+
uint16_t src_port, dst_port;
19881989
uint32_t icmp_len;
19891990
uint32_t avail;
19901991
uint32_t orig_hlen;
@@ -2012,7 +2013,9 @@ static void icmp_try_deliver_tcp_error(struct wolfIP *s,
20122013
if (avail < (orig_hlen + 8U))
20132014
return;
20142015

2015-
orig_tcp = (const struct wolfIP_tcp_wire_prefix *)orig_ip;
2016+
orig_tcp = ((const uint8_t *)orig_ip) + orig_hlen;
2017+
memcpy(&src_port, orig_tcp, sizeof(src_port));
2018+
memcpy(&dst_port, orig_tcp + sizeof(src_port), sizeof(dst_port));
20162019
for (i = 0; i < MAX_TCPSOCKETS; i++) {
20172020
struct tsocket *t = &s->tcpsockets[i];
20182021

@@ -2022,8 +2025,7 @@ static void icmp_try_deliver_tcp_error(struct wolfIP *s,
20222025
continue;
20232026
if (t->local_ip != ee32(orig_ip->src) || t->remote_ip != ee32(orig_ip->dst))
20242027
continue;
2025-
if (t->src_port != ee16(orig_tcp->src_port) ||
2026-
t->dst_port != ee16(orig_tcp->dst_port))
2028+
if (t->src_port != ee16(src_port) || t->dst_port != ee16(dst_port))
20272029
continue;
20282030

20292031
if (icmp->type == ICMP_DEST_UNREACH) {
@@ -5923,11 +5925,15 @@ static int dhcp_send_discover(struct wolfIP *s)
59235925
struct dhcp_msg disc;
59245926
struct dhcp_option *opt = (struct dhcp_option *)(disc.options);
59255927
struct wolfIP_sockaddr_in sin;
5926-
uint64_t retry_at = s ? (s->last_tick + 1U) : 0;
5928+
uint64_t retry_at;
59275929
int ret;
59285930
uint32_t opt_sz = 0;
59295931

5930-
if (s && s->dhcp_state == DHCP_OFF)
5932+
if (!s)
5933+
return -1;
5934+
5935+
retry_at = s->last_tick + 1U;
5936+
if (s->dhcp_state == DHCP_OFF)
59315937
s->dhcp_start_tick = s->last_tick;
59325938

59335939
/* Prepare DHCP discover */

0 commit comments

Comments
 (0)