Skip to content

Commit a7809ae

Browse files
Merge pull request #3 from kosmas-valianos/memory_mgm
Miscellaneous
2 parents b204c68 + e56f09a commit a7809ae

3 files changed

Lines changed: 66 additions & 11 deletions

File tree

examples/client_server.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
#include <stdio.h>
22
#include <stdlib.h>
3-
#include <unistd.h>
4-
#include <arpa/inet.h>
3+
#ifdef _WIN32
4+
#include <ws2tcpip.h>
5+
#pragma comment(lib, "ws2_32.lib")
6+
#else
7+
#include <arpa/inet.h>
8+
#endif
59

610
#include "../src/proxy_protocol.h"
711

src/proxy_protocol.c

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ static const char *errors[] = {
148148
"v1 PROXY protocol header: invalid IPv6 dst IP",
149149
"v1 PROXY protocol header: invalid src port",
150150
"v1 PROXY protocol header: invalid dst port",
151+
"Heap memory allocation failure",
151152
};
152153

153154
const char *pp_strerror(int32_t error)
@@ -173,29 +174,43 @@ static uint8_t parse_port(const char *value, uint16_t *usport)
173174
static tlv_t *tlv_new(uint8_t type, uint16_t length, const void *value)
174175
{
175176
tlv_t *tlv = malloc(sizeof(tlv_t) - 1 + length);
177+
if (!tlv)
178+
{
179+
return NULL;
180+
}
176181
tlv->type = type;
177182
tlv->length = length;
178183
memcpy(tlv->value, value, length);
179184
return tlv;
180185
}
181186

182-
static void tlv_array_append_tlv(tlv_array_t *tlv_array, tlv_t *tlv)
187+
static uint8_t tlv_array_append_tlv(tlv_array_t *tlv_array, tlv_t *tlv)
183188
{
184189
if (!tlv_array->tlvs)
185190
{
186191
tlv_array->len = 0;
187192
tlv_array->size = 10;
188193
tlv_array->tlvs = malloc(tlv_array->size * sizeof(tlv_t*));
194+
if (!tlv_array->tlvs)
195+
{
196+
return 0;
197+
}
189198
}
190199

191200
if (tlv_array->size == tlv_array->len)
192201
{
193202
tlv_array->size += 5;
194-
tlv_array->tlvs = realloc(tlv_array->tlvs, tlv_array->size * sizeof(tlv_t*));
203+
tlv_t **tlvs = realloc(tlv_array->tlvs, tlv_array->size * sizeof(tlv_t*));
204+
if (!tlvs)
205+
{
206+
return 0;
207+
}
208+
tlv_array->tlvs = tlvs;
195209
}
196210

197211
tlv_array->len++;
198212
tlv_array->tlvs[tlv_array->len - 1] = tlv;
213+
return 1;
199214
}
200215

201216
static void tlv_array_clear(tlv_array_t *tlv_array)
@@ -323,6 +338,11 @@ uint8_t *pp2_create_hdr(uint8_t fam, const pp_info_t *pp_info, uint32_t *pp2_hdr
323338
/* Create the PROXY protocol header */
324339
*pp2_hdr_len = sizeof(proxy_hdr_v2_t) + len;
325340
uint8_t *pp2_hdr = malloc(*pp2_hdr_len);
341+
if (!pp2_hdr)
342+
{
343+
*error = ERR_HEAP_ALLOC;
344+
return NULL;
345+
}
326346
memcpy(pp2_hdr, &proxy_hdr_v2, sizeof(proxy_hdr_v2_t));
327347
memcpy(pp2_hdr + sizeof(proxy_hdr_v2_t), &proxy_addr, len);
328348

@@ -334,13 +354,20 @@ static uint8_t *pp1_create_hdr(uint8_t fam, const pp_info_t *pp_info, uint32_t *
334354
{
335355
if (fam != AF_INET && fam != AF_INET6)
336356
{
357+
*error = ERR_PP1_TRANSPORT_FAMILY;
337358
return NULL;
338359
}
339360

340361
char block[PP1_MAX_LENGHT];
341362
/* sprintf() as snprintf does not exist in ANSI C */
342-
if (strlen(pp_info->src_addr) > 39 || strlen(pp_info->dst_addr) > 39)
363+
if (strlen(pp_info->src_addr) > 39)
343364
{
365+
*error = ERR_PP1_IPV4_SRC_IP;
366+
return NULL;
367+
}
368+
if (strlen(pp_info->dst_addr) > 39)
369+
{
370+
*error = ERR_PP1_IPV4_DST_IP;
344371
return NULL;
345372
}
346373
char src_addr[39+1];
@@ -352,6 +379,11 @@ static uint8_t *pp1_create_hdr(uint8_t fam, const pp_info_t *pp_info, uint32_t *
352379

353380
/* Create the PROXY protocol header */
354381
uint8_t *pp1_hdr = malloc(*pp1_hdr_len);
382+
if (!pp1_hdr)
383+
{
384+
*error = ERR_HEAP_ALLOC;
385+
return NULL;
386+
}
355387
memcpy(pp1_hdr, block, *pp1_hdr_len);
356388
*error = ERR_NULL;
357389
return pp1_hdr;
@@ -623,16 +655,22 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
623655
case PP2_TYPE_ALPN:
624656
{
625657
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len, pp2_tlv->value);
626-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
658+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
659+
{
660+
return ERR_HEAP_ALLOC;
661+
}
627662
break;
628663
}
629664
case PP2_TYPE_AUTHORITY:
630665
case PP2_TYPE_NETNS:
631666
{
632667
/* +1 to save it as a string */
633668
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len + 1, pp2_tlv->value);
669+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
670+
{
671+
return ERR_HEAP_ALLOC;
672+
}
634673
tlv->value[pp2_tlv_len] = '\0';
635-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
636674
break;
637675
}
638676
case PP2_TYPE_CRC32C:
@@ -657,7 +695,10 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
657695
}
658696

659697
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len, &crc32c_chksum);
660-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
698+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
699+
{
700+
return ERR_HEAP_ALLOC;
701+
}
661702
break;
662703
}
663704
case PP2_TYPE_NOOP:
@@ -669,7 +710,10 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
669710
return ERR_PP2_TYPE_UNIQUE_ID;
670711
}
671712
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len, pp2_tlv->value);
672-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
713+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
714+
{
715+
return ERR_HEAP_ALLOC;
716+
}
673717
break;
674718
}
675719
case PP2_TYPE_SSL:
@@ -686,8 +730,11 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
686730
{
687731
/* +1 to save it as a string. Example: \x1vpce-08d2bf15fac5001c9 */
688732
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len + 1, pp2_tlv->value);
733+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
734+
{
735+
return ERR_HEAP_ALLOC;
736+
}
689737
tlv->value[pp2_tlv_len] = '\0';
690-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
691738
}
692739
break;
693740
}
@@ -702,7 +749,10 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
702749
if (pp2_tlv_azure->type == PP2_TYPE_AZURE)
703750
{
704751
tlv_t *tlv = tlv_new(pp2_tlv->type, pp2_tlv_len, pp2_tlv->value);
705-
tlv_array_append_tlv(&pp_info->tlv_array, tlv);
752+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
753+
{
754+
return ERR_HEAP_ALLOC;
755+
}
706756
}
707757
break;
708758
}

src/proxy_protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ enum
4949
ERR_PP1_IPV6_DST_IP = -23,
5050
ERR_PP1_SRC_PORT = -24,
5151
ERR_PP1_DST_PORT = -25,
52+
ERR_HEAP_ALLOC = -26,
5253
};
5354

5455
/* Type-Length-Value (TLV vectors) */

0 commit comments

Comments
 (0)