|
21 | 21 | #include <string.h> |
22 | 22 | #ifdef _WIN32 |
23 | 23 | #include <ws2tcpip.h> |
| 24 | + /* Caution: To be used only with fixed length arrays */ |
| 25 | + #define _sprintf(buffer, format, ...) sprintf_s(buffer, sizeof(buffer), format, __VA_ARGS__) |
24 | 26 | #else |
25 | 27 | #include <arpa/inet.h> |
| 28 | + /* sprintf() as snprintf does not exist in ANSI C */ |
| 29 | + #define _sprintf(buffer, format, ...) sprintf(buffer, format, __VA_ARGS__) |
26 | 30 | #endif |
27 | 31 |
|
28 | 32 | #include "proxy_protocol.h" |
@@ -149,8 +153,8 @@ typedef struct |
149 | 153 | #define PP2_SIG "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" |
150 | 154 |
|
151 | 155 | /* ANSI C makes us suffer as we cannot have value[0] */ |
152 | | -#define sizeof_pp2_tlv_t (sizeof(pp2_tlv_t) - 1) |
153 | | -#define sizeof_pp2_tlv_aws_t (sizeof(pp2_tlv_aws_t) - 1) |
| 156 | +#define sizeof_pp2_tlv_t ((uint16_t) sizeof(pp2_tlv_t) - 1) |
| 157 | +#define sizeof_pp2_tlv_aws_t ((uint16_t) sizeof(pp2_tlv_aws_t) - 1) |
154 | 158 |
|
155 | 159 | /****************************************************************/ |
156 | 160 |
|
@@ -347,7 +351,7 @@ uint8_t pp_info_add_netns(pp_info_t *pp_info, const char *netns) |
347 | 351 |
|
348 | 352 | uint8_t pp_info_add_aws_vpce_id(pp_info_t *pp_info, const char *vpce_id) |
349 | 353 | { |
350 | | - uint16_t length = (uint16_t) (sizeof_pp2_tlv_aws_t + strlen(vpce_id)); |
| 354 | + uint16_t length = sizeof_pp2_tlv_aws_t + (uint16_t) strlen(vpce_id); |
351 | 355 | pp2_tlv_aws_t *pp2_tlv_aws = malloc(length); |
352 | 356 | pp2_tlv_aws->type = PP2_SUBTYPE_AWS_VPCE_ID; |
353 | 357 | memcpy(pp2_tlv_aws->value, vpce_id, strlen(vpce_id)); |
@@ -663,7 +667,7 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t |
663 | 667 | { |
664 | 668 | uint16_t pp2_hdr_len_padded = (*pp2_hdr_len / alignment + 1) * alignment; |
665 | 669 | /* The NOOP TLV needs to be at least 3 bytes because a TLV can not be smaller than that */ |
666 | | - if (pp2_hdr_len_padded - *pp2_hdr_len < 3) |
| 670 | + if (pp2_hdr_len_padded - *pp2_hdr_len < sizeof_pp2_tlv_t) |
667 | 671 | { |
668 | 672 | pp2_hdr_len_padded += alignment; |
669 | 673 | } |
@@ -763,8 +767,7 @@ static uint8_t *pp1_create_hdr(const pp_info_t *pp_info, uint16_t *pp1_hdr_len, |
763 | 767 | char dst_addr[39+1]; |
764 | 768 | memcpy(src_addr, pp_info->src_addr, sizeof(src_addr)); |
765 | 769 | memcpy(dst_addr, pp_info->dst_addr, sizeof(dst_addr)); |
766 | | - /* sprintf() as snprintf does not exist in ANSI C */ |
767 | | - *pp1_hdr_len = sprintf(block, "PROXY %s %s %s %hu %hu"CRLF, fam, src_addr, dst_addr, pp_info->src_port, pp_info->dst_port); |
| 770 | + *pp1_hdr_len = _sprintf(block, "PROXY %s %s %s %hu %hu"CRLF, fam, src_addr, dst_addr, pp_info->src_port, pp_info->dst_port); |
768 | 771 | } |
769 | 772 | else |
770 | 773 | { |
@@ -932,11 +935,11 @@ static int32_t pp2_parse_hdr(uint8_t *buffer, uint32_t buffer_length, pp_info_t |
932 | 935 |
|
933 | 936 | /* TLVs */ |
934 | 937 | /* Any TLV vector must be at least 3 bytes */ |
935 | | - while (tlv_vectors_len > 3) |
| 938 | + while (tlv_vectors_len > sizeof_pp2_tlv_t) |
936 | 939 | { |
937 | 940 | pp2_tlv_t *pp2_tlv = (pp2_tlv_t*) buffer; |
938 | 941 | uint16_t pp2_tlv_len = pp2_tlv->length_hi << 8 | pp2_tlv->length_lo; |
939 | | - uint16_t pp2_tlv_offset = 3 + pp2_tlv_len; |
| 942 | + uint16_t pp2_tlv_offset = sizeof_pp2_tlv_t + pp2_tlv_len; |
940 | 943 | if (pp2_tlv_offset > tlv_vectors_len) |
941 | 944 | { |
942 | 945 | return -ERR_PP2_TLV_LENGTH; |
@@ -1030,7 +1033,7 @@ static int32_t pp2_parse_hdr(uint8_t *buffer, uint32_t buffer_length, pp_info_t |
1030 | 1033 | return -ERR_PP2_TYPE_SSL; |
1031 | 1034 | } |
1032 | 1035 |
|
1033 | | - pp2_sub_tlv_offset += 3 + pp2_sub_tlv_ssl_len; |
| 1036 | + pp2_sub_tlv_offset += sizeof_pp2_tlv_t + pp2_sub_tlv_ssl_len; |
1034 | 1037 | } |
1035 | 1038 | if (pp2_sub_tlv_offset > pp2_tlvs_ssl_len || (pp_info->pp2_info.pp2_ssl_info.ssl && !tlv_ssl_version_found)) |
1036 | 1039 | { |
|
0 commit comments