Parse proxy protocol version 1 header (text) */
| 35 | Parse proxy protocol version 1 header (text) |
| 36 | */ |
| 37 | static int parse_v1_header(char *hdr, size_t len, proxy_peer_info *peer_info) |
| 38 | { |
| 39 | char address_family[MAX_PROXY_HEADER_LEN + 1]; |
| 40 | char client_address[MAX_PROXY_HEADER_LEN + 1]; |
| 41 | char server_address[MAX_PROXY_HEADER_LEN + 1]; |
| 42 | int client_port; |
| 43 | int server_port; |
| 44 | |
| 45 | int ret = sscanf(hdr, "PROXY %s %s %s %d %d", |
| 46 | address_family, client_address, server_address, |
| 47 | &client_port, &server_port); |
| 48 | |
| 49 | if (ret != 5) |
| 50 | { |
| 51 | if (ret >= 1 && !strcmp(address_family, "UNKNOWN")) |
| 52 | { |
| 53 | peer_info->is_local_command= true; |
| 54 | return 0; |
| 55 | } |
| 56 | return -1; |
| 57 | } |
| 58 | |
| 59 | if (client_port < 0 || client_port > 0xffff |
| 60 | || server_port < 0 || server_port > 0xffff) |
| 61 | return -1; |
| 62 | |
| 63 | if (!strcmp(address_family, "UNKNOWN")) |
| 64 | { |
| 65 | peer_info->is_local_command= true; |
| 66 | return 0; |
| 67 | } |
| 68 | else if (!strcmp(address_family, "TCP4")) |
| 69 | { |
| 70 | /* Initialize IPv4 peer address.*/ |
| 71 | peer_info->peer_addr.ss_family= AF_INET; |
| 72 | if (!inet_pton(AF_INET, client_address, |
| 73 | &((struct sockaddr_in *)(&peer_info->peer_addr))->sin_addr)) |
| 74 | return -1; |
| 75 | } |
| 76 | else if (!strcmp(address_family, "TCP6")) |
| 77 | { |
| 78 | /* Initialize IPv6 peer address.*/ |
| 79 | peer_info->peer_addr.ss_family= AF_INET6; |
| 80 | if (!inet_pton(AF_INET6, client_address, |
| 81 | &((struct sockaddr_in6 *)(&peer_info->peer_addr))->sin6_addr)) |
| 82 | return -1; |
| 83 | } |
| 84 | peer_info->port= client_port; |
| 85 | /* Check if server address is legal.*/ |
| 86 | char addr_bin[16]; |
| 87 | if (!inet_pton(peer_info->peer_addr.ss_family, |
| 88 | server_address, addr_bin)) |
| 89 | return -1; |
| 90 | |
| 91 | return 0; |
| 92 | } |
| 93 | |
| 94 |
no outgoing calls
no test coverage detected