Skip to content

Commit e7fc7b9

Browse files
Merge pull request #21 from kosmas-valianos/fixes
Fix error set in create_hdr functions
2 parents db1387b + b7c3975 commit e7fc7b9

3 files changed

Lines changed: 190 additions & 31 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
*.o
22
libs/libproxyprotocol.so
33
tests/test_libproxyprotocol
4+
examples/client_server

src/proxy_protocol.c

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
589589
proxy_hdr_v2.ver_cmd = '\x20';
590590
if (!pp_info->pp2_info.local)
591591
{
592-
*error = ERR_PP2_CMD;
592+
*error = -ERR_PP2_CMD;
593593
return NULL;
594594
}
595595
}
@@ -598,12 +598,12 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
598598
proxy_addr_len = 12;
599599
if (inet_pton(AF_INET, pp_info->src_addr, &proxy_addr.ipv4_addr.src_addr) != 1)
600600
{
601-
*error = ERR_PP2_IPV4_SRC_IP;
601+
*error = -ERR_PP2_IPV4_SRC_IP;
602602
return NULL;
603603
}
604604
if (inet_pton(AF_INET, pp_info->dst_addr, &proxy_addr.ipv4_addr.dst_addr) != 1)
605605
{
606-
*error = ERR_PP2_IPV4_DST_IP;
606+
*error = -ERR_PP2_IPV4_DST_IP;
607607
return NULL;
608608
}
609609
proxy_addr.ipv4_addr.src_port = htons(pp_info->src_port);
@@ -614,12 +614,12 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
614614
proxy_addr_len = 36;
615615
if (inet_pton(AF_INET6, pp_info->src_addr, &proxy_addr.ipv6_addr.src_addr) != 1)
616616
{
617-
*error = ERR_PP2_IPV6_SRC_IP;
617+
*error = -ERR_PP2_IPV6_SRC_IP;
618618
return NULL;
619619
}
620620
if (inet_pton(AF_INET6, pp_info->dst_addr, &proxy_addr.ipv6_addr.dst_addr) != 1)
621621
{
622-
*error = ERR_PP2_IPV6_DST_IP;
622+
*error = -ERR_PP2_IPV6_DST_IP;
623623
return NULL;
624624
}
625625
proxy_addr.ipv6_addr.src_port = htons(pp_info->src_port);
@@ -633,13 +633,13 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
633633
}
634634
else
635635
{
636-
*error = ERR_PP2_ADDR_FAMILY;
636+
*error = -ERR_PP2_ADDR_FAMILY;
637637
return NULL;
638638
}
639639

640640
if (pp_info->transport_protocol > TRANSPORT_PROTOCOL_DGRAM)
641641
{
642-
*error = ERR_PP2_TRANSPORT_PROTOCOL;
642+
*error = -ERR_PP2_TRANSPORT_PROTOCOL;
643643
return NULL;
644644
}
645645

@@ -683,7 +683,7 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
683683
uint8_t *pp2_hdr = malloc(*pp2_hdr_len);
684684
if (!pp2_hdr)
685685
{
686-
*error = ERR_HEAP_ALLOC;
686+
*error = -ERR_HEAP_ALLOC;
687687
return NULL;
688688
}
689689
uint16_t index = 0;
@@ -739,7 +739,7 @@ static uint8_t *pp1_create_hdr(const pp_info_t *pp_info, uint16_t *pp1_hdr_len,
739739
{
740740
if (pp_info->transport_protocol != TRANSPORT_PROTOCOL_UNSPEC && pp_info->transport_protocol != TRANSPORT_PROTOCOL_STREAM)
741741
{
742-
*error = ERR_PP1_TRANSPORT_FAMILY;
742+
*error = -ERR_PP1_TRANSPORT_FAMILY;
743743
return NULL;
744744
}
745745

@@ -753,15 +753,33 @@ static uint8_t *pp1_create_hdr(const pp_info_t *pp_info, uint16_t *pp1_hdr_len,
753753
else if (pp_info->address_family == ADDR_FAMILY_INET || pp_info->address_family == ADDR_FAMILY_INET6)
754754
{
755755
const char *fam = pp_info->address_family == ADDR_FAMILY_INET ? "TCP4" : "TCP6";
756-
if (strlen(pp_info->src_addr) > 39)
756+
if (pp_info->address_family == ADDR_FAMILY_INET)
757757
{
758-
*error = ERR_PP1_IPV4_SRC_IP;
759-
return NULL;
758+
struct in_addr in;
759+
if (inet_pton(AF_INET, pp_info->src_addr, &in) != 1)
760+
{
761+
*error = -ERR_PP1_IPV4_SRC_IP;
762+
return NULL;
763+
}
764+
if (inet_pton(AF_INET, pp_info->dst_addr, &in) != 1)
765+
{
766+
*error = -ERR_PP1_IPV4_DST_IP;
767+
return NULL;
768+
}
760769
}
761-
if (strlen(pp_info->dst_addr) > 39)
770+
else if (pp_info->address_family == ADDR_FAMILY_INET6)
762771
{
763-
*error = ERR_PP1_IPV4_DST_IP;
764-
return NULL;
772+
struct in6_addr in6;
773+
if (inet_pton(AF_INET6, pp_info->src_addr, &in6) != 1)
774+
{
775+
*error = -ERR_PP1_IPV6_SRC_IP;
776+
return NULL;
777+
}
778+
if (inet_pton(AF_INET6, pp_info->dst_addr, &in6) != 1)
779+
{
780+
*error = -ERR_PP1_IPV6_DST_IP;
781+
return NULL;
782+
}
765783
}
766784
char src_addr[39+1];
767785
char dst_addr[39+1];
@@ -771,15 +789,15 @@ static uint8_t *pp1_create_hdr(const pp_info_t *pp_info, uint16_t *pp1_hdr_len,
771789
}
772790
else
773791
{
774-
*error = ERR_PP1_TRANSPORT_FAMILY;
792+
*error = -ERR_PP1_TRANSPORT_FAMILY;
775793
return NULL;
776794
}
777795

778796
/* Create the PROXY protocol header */
779797
uint8_t *pp1_hdr = malloc(*pp1_hdr_len);
780798
if (!pp1_hdr)
781799
{
782-
*error = ERR_HEAP_ALLOC;
800+
*error = -ERR_HEAP_ALLOC;
783801
return NULL;
784802
}
785803
memcpy(pp1_hdr, block, *pp1_hdr_len);
@@ -799,7 +817,7 @@ uint8_t *pp_create_hdr(uint8_t version, const pp_info_t *pp_info, uint16_t *pp_h
799817
}
800818
else
801819
{
802-
*error = ERR_PP_VERSION;
820+
*error = -ERR_PP_VERSION;
803821
return NULL;
804822
}
805823
}

tests/test.c

Lines changed: 153 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ typedef struct
7070
pp_info_t pp_info_in;
7171
uint8_t *raw_bytes_in;
7272
uint32_t raw_bytes_in_length;
73+
int32_t error_expected; /* error parameter of pp_create_hdr() */
7374
int32_t rc_expected;
7475
pp_info_t pp_info_out_expected;
7576
test_tlv_t add_tlvs[10];
@@ -554,6 +555,132 @@ int main()
554555
.pp2_info.local = 1
555556
},
556557
},
558+
{
559+
.name = "v1 PROXY protocol header: -ERR_PP1_TRANSPORT_FAMILY",
560+
.version = 1,
561+
.pp_info_in = {
562+
.transport_protocol = 3,
563+
},
564+
.error_expected = -ERR_PP1_TRANSPORT_FAMILY,
565+
},
566+
{
567+
.name = "v1 PROXY protocol header: -ERR_PP1_TRANSPORT_FAMILY",
568+
.version = 1,
569+
.pp_info_in = {
570+
.address_family = 3,
571+
},
572+
.error_expected = -ERR_PP1_TRANSPORT_FAMILY,
573+
},
574+
{
575+
.name = "v1 PROXY protocol header: -ERR_PP1_IPV4_SRC_IP",
576+
.version = 1,
577+
.pp_info_in = {
578+
.address_family = ADDR_FAMILY_INET,
579+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
580+
.src_addr = "255.255.255.255.255",
581+
},
582+
.error_expected = -ERR_PP1_IPV4_SRC_IP,
583+
},
584+
{
585+
.name = "v1 PROXY protocol header: -ERR_PP1_IPV4_DST_IP",
586+
.version = 1,
587+
.pp_info_in = {
588+
.address_family = ADDR_FAMILY_INET,
589+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
590+
.src_addr = "255.255.255.255",
591+
.dst_addr = "255.255.255.255.255",
592+
},
593+
.error_expected = -ERR_PP1_IPV4_DST_IP,
594+
},
595+
{
596+
.name = "v1 PROXY protocol header: -ERR_PP1_IPV6_SRC_IP",
597+
.version = 1,
598+
.pp_info_in = {
599+
.address_family = ADDR_FAMILY_INET6,
600+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
601+
.src_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
602+
},
603+
.error_expected = -ERR_PP1_IPV6_SRC_IP,
604+
},
605+
{
606+
.name = "v1 PROXY protocol header: -ERR_PP1_IPV6_DST_IP",
607+
.version = 1,
608+
.pp_info_in = {
609+
.address_family = ADDR_FAMILY_INET6,
610+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
611+
.src_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
612+
.dst_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
613+
},
614+
.error_expected = -ERR_PP1_IPV6_DST_IP,
615+
},
616+
{
617+
.name = "v2 PROXY protocol header: -ERR_PP2_CMD",
618+
.version = 2,
619+
.pp_info_in = {
620+
.pp2_info.local = 0,
621+
},
622+
.error_expected = -ERR_PP2_CMD,
623+
},
624+
{
625+
.name = "v2 PROXY protocol header: -ERR_PP2_ADDR_FAMILY",
626+
.version = 2,
627+
.pp_info_in = {
628+
.address_family = 4,
629+
},
630+
.error_expected = -ERR_PP2_ADDR_FAMILY,
631+
},
632+
{
633+
.name = "v2 PROXY protocol header: -ERR_PP2_TRANSPORT_PROTOCOL",
634+
.version = 2,
635+
.pp_info_in = {
636+
.address_family = ADDR_FAMILY_UNSPEC,
637+
.pp2_info.local = 1,
638+
.transport_protocol = 4,
639+
},
640+
.error_expected = -ERR_PP2_TRANSPORT_PROTOCOL,
641+
},
642+
{
643+
.name = "v2 PROXY protocol header: -ERR_PP2_IPV4_SRC_IP",
644+
.version = 2,
645+
.pp_info_in = {
646+
.address_family = ADDR_FAMILY_INET,
647+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
648+
.src_addr = "255.255.255.255.255",
649+
},
650+
.error_expected = -ERR_PP2_IPV4_SRC_IP,
651+
},
652+
{
653+
.name = "v2 PROXY protocol header: -ERR_PP2_IPV4_DST_IP",
654+
.version = 2,
655+
.pp_info_in = {
656+
.address_family = ADDR_FAMILY_INET,
657+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
658+
.src_addr = "255.255.255.255",
659+
.dst_addr = "255.255.255.255.255",
660+
},
661+
.error_expected = -ERR_PP2_IPV4_DST_IP,
662+
},
663+
{
664+
.name = "v2 PROXY protocol header: -ERR_PP2_IPV6_SRC_IP",
665+
.version = 2,
666+
.pp_info_in = {
667+
.address_family = ADDR_FAMILY_INET6,
668+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
669+
.src_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
670+
},
671+
.error_expected = -ERR_PP2_IPV6_SRC_IP,
672+
},
673+
{
674+
.name = "v2 PROXY protocol header: -ERR_PP2_IPV6_DST_IP",
675+
.version = 2,
676+
.pp_info_in = {
677+
.address_family = ADDR_FAMILY_INET6,
678+
.transport_protocol = TRANSPORT_PROTOCOL_STREAM,
679+
.src_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
680+
.dst_addr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
681+
},
682+
.error_expected = -ERR_PP2_IPV6_DST_IP,
683+
},
557684
};
558685

559686
/* Run tests */
@@ -562,16 +689,16 @@ int main()
562689
{
563690
printf("Running test: %s...", tests[i].name);
564691
pp_info_t pp_info_out;
565-
int32_t rc;
692+
int32_t pp_parse_hdr_rc = 0;
566693
if (tests[i].raw_bytes_in)
567694
{
568-
rc = pp_parse_hdr(tests[i].raw_bytes_in, tests[i].raw_bytes_in_length, &pp_info_out);
695+
pp_parse_hdr_rc = pp_parse_hdr(tests[i].raw_bytes_in, tests[i].raw_bytes_in_length, &pp_info_out);
569696
}
570697
else
571698
{
572-
uint16_t pp_hdr_len;
699+
uint16_t pp_hdr_len = 0;
573700
uint16_t alignment = 1 << tests[i].pp_info_in.pp2_info.alignment_power;
574-
int32_t error;
701+
int32_t error = ERR_NULL;
575702

576703
if (tests[i].add_tlvs[0].type)
577704
{
@@ -594,20 +721,33 @@ int main()
594721
pp_hdr = pp_create_hdr(tests[i].version, &tests[i].pp_info_in, &pp_hdr_len, &error);
595722
pp_info_clear(&tests[i].pp_info_in);
596723
}
597-
if (!pp_hdr
598-
|| error != ERR_NULL
599-
|| (alignment > 1 && pp_hdr_len % alignment))
724+
if (tests[i].error_expected == ERR_NULL)
600725
{
601-
printf("FAILED\n");
602-
pp_info_clear(&pp_info_out);
603-
return EXIT_FAILURE;
726+
if (!pp_hdr
727+
|| error != ERR_NULL
728+
|| (alignment > 1 && pp_hdr_len % alignment))
729+
{
730+
printf("FAILED\n");
731+
pp_info_clear(&pp_info_out);
732+
return EXIT_FAILURE;
733+
}
734+
tests[i].rc_expected = pp_hdr_len;
735+
pp_parse_hdr_rc = pp_parse_hdr(pp_hdr, pp_hdr_len, &pp_info_out);
736+
}
737+
else
738+
{
739+
if (pp_hdr || error != tests[i].error_expected)
740+
{
741+
printf("FAILED\n");
742+
pp_info_clear(&pp_info_out);
743+
return EXIT_FAILURE;
744+
}
604745
}
605-
tests[i].rc_expected = pp_hdr_len;
606-
rc = pp_parse_hdr(pp_hdr, pp_hdr_len, &pp_info_out);
607746
free(pp_hdr);
608747
}
609748

610-
if (rc != tests[i].rc_expected || !pp_info_equal(&pp_info_out, &tests[i].pp_info_out_expected) || !pp_verify_tlvs(&pp_info_out, &tests[i].expected_tlvs))
749+
if (pp_parse_hdr_rc != tests[i].rc_expected
750+
|| (pp_parse_hdr_rc && (!pp_info_equal(&pp_info_out, &tests[i].pp_info_out_expected) || !pp_verify_tlvs(&pp_info_out, &tests[i].expected_tlvs))))
611751
{
612752
printf("FAILED\n");
613753
pp_info_clear(&pp_info_out);

0 commit comments

Comments
 (0)