Check inet_pton retval and properly cleanup on error in unittest helper

remotes/origin/master-1.1.x
Gerardo Iglesias Galvan 14 years ago committed by Victor Julien
parent 58f713254e
commit 5ac8ab9a61

@ -89,12 +89,13 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
p->ip6h = SCMalloc(sizeof(IPV6Hdr)); p->ip6h = SCMalloc(sizeof(IPV6Hdr));
if (p->ip6h == NULL) if (p->ip6h == NULL)
return NULL; goto error;
memset(p->ip6h, 0, sizeof(IPV6Hdr)); memset(p->ip6h, 0, sizeof(IPV6Hdr));
p->ip6h->s_ip6_nxt = ipproto; p->ip6h->s_ip6_nxt = ipproto;
p->ip6h->s_ip6_plen = htons(payload_len + sizeof(TCPHdr)); p->ip6h->s_ip6_plen = htons(payload_len + sizeof(TCPHdr));
inet_pton(AF_INET6, src, &in); if (inet_pton(AF_INET6, src, &in) <= 0)
goto error;
p->src.addr_data32[0] = in[0]; p->src.addr_data32[0] = in[0];
p->src.addr_data32[1] = in[1]; p->src.addr_data32[1] = in[1];
p->src.addr_data32[2] = in[2]; p->src.addr_data32[2] = in[2];
@ -105,7 +106,8 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
p->ip6h->ip6_src[2] = in[2]; p->ip6h->ip6_src[2] = in[2];
p->ip6h->ip6_src[3] = in[3]; p->ip6h->ip6_src[3] = in[3];
inet_pton(AF_INET6, dst, &in); if (inet_pton(AF_INET6, dst, &in) <= 0)
goto error;
p->dst.addr_data32[0] = in[0]; p->dst.addr_data32[0] = in[0];
p->dst.addr_data32[1] = in[1]; p->dst.addr_data32[1] = in[1];
p->dst.addr_data32[2] = in[2]; p->dst.addr_data32[2] = in[2];
@ -118,13 +120,25 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
p->tcph = SCMalloc(sizeof(TCPHdr)); p->tcph = SCMalloc(sizeof(TCPHdr));
if (p->tcph == NULL) if (p->tcph == NULL)
return NULL; goto error;
memset(p->tcph, 0, sizeof(TCPHdr)); memset(p->tcph, 0, sizeof(TCPHdr));
p->tcph->th_sport = htons(sport); p->tcph->th_sport = htons(sport);
p->tcph->th_dport = htons(dport); p->tcph->th_dport = htons(dport);
SET_PKT_LEN(p, sizeof(IPV6Hdr) + sizeof(TCPHdr) + payload_len); SET_PKT_LEN(p, sizeof(IPV6Hdr) + sizeof(TCPHdr) + payload_len);
return p; return p;
error:
if (p != NULL) {
if (p->ip6h != NULL) {
SCFree(p->ip6h);
}
if (p->tcph != NULL) {
SCFree(p->tcph);
}
SCFree(p);
}
return NULL;
} }
/** /**
@ -162,17 +176,19 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
p->payload_len = payload_len; p->payload_len = payload_len;
p->proto = ipproto; p->proto = ipproto;
inet_pton(AF_INET, src, &in); if (inet_pton(AF_INET, src, &in) <= 0)
goto error;
p->src.addr_data32[0] = in.s_addr; p->src.addr_data32[0] = in.s_addr;
p->sp = sport; p->sp = sport;
inet_pton(AF_INET, dst, &in); if (inet_pton(AF_INET, dst, &in) <= 0)
goto error;
p->dst.addr_data32[0] = in.s_addr; p->dst.addr_data32[0] = in.s_addr;
p->dp = dport; p->dp = dport;
p->ip4h = (IPV4Hdr *)GET_PKT_DATA(p); p->ip4h = (IPV4Hdr *)GET_PKT_DATA(p);
if (p->ip4h == NULL) if (p->ip4h == NULL)
return NULL; goto error;
p->ip4h->ip_src.s_addr = p->src.addr_data32[0]; p->ip4h->ip_src.s_addr = p->src.addr_data32[0];
p->ip4h->ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h->ip_dst.s_addr = p->dst.addr_data32[0];
@ -185,7 +201,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
case IPPROTO_UDP: case IPPROTO_UDP:
p->udph = (UDPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr)); p->udph = (UDPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
if (p->udph == NULL) if (p->udph == NULL)
return NULL; goto error;
p->udph->uh_sport = sport; p->udph->uh_sport = sport;
p->udph->uh_dport = dport; p->udph->uh_dport = dport;
@ -194,7 +210,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
case IPPROTO_TCP: case IPPROTO_TCP:
p->tcph = (TCPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr)); p->tcph = (TCPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
if (p->tcph == NULL) if (p->tcph == NULL)
return NULL; goto error;
p->tcph->th_sport = htons(sport); p->tcph->th_sport = htons(sport);
p->tcph->th_dport = htons(dport); p->tcph->th_dport = htons(dport);
@ -203,7 +219,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
case IPPROTO_ICMP: case IPPROTO_ICMP:
p->icmpv4h = (ICMPV4Hdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr)); p->icmpv4h = (ICMPV4Hdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
if (p->icmpv4h == NULL) if (p->icmpv4h == NULL)
return NULL; goto error;
hdr_offset += sizeof(ICMPV4Hdr); hdr_offset += sizeof(ICMPV4Hdr);
break; break;
@ -217,6 +233,10 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
p->payload = GET_PKT_DATA(p)+hdr_offset; p->payload = GET_PKT_DATA(p)+hdr_offset;
return p; return p;
error:
SCFree(p);
return NULL;
} }
/** /**

Loading…
Cancel
Save