| 213 | } |
| 214 | |
| 215 | char *parse_net_proxy_protocol(char *buf, int size, struct proxy_protocol *proxy) |
| 216 | { |
| 217 | int af, max; |
| 218 | char *p, *end; |
| 219 | str _buf, tmp; |
| 220 | struct ip_addr *ip; |
| 221 | unsigned int port; |
| 222 | enum proxy_tok_match m; |
| 223 | |
| 224 | if (size < PROXY_PROTOCOL_V1_HDR_LEN || |
| 225 | memcmp(buf, PROXY_PROTOCOL_V1_HDR, PROXY_PROTOCOL_V1_HDR_LEN) != 0) |
| 226 | goto error; |
| 227 | |
| 228 | _buf.s = buf + PROXY_PROTOCOL_V1_HDR_LEN; |
| 229 | _buf.len = size - PROXY_PROTOCOL_V1_HDR_LEN; |
| 230 | |
| 231 | m = match_proxy_token(&_buf, PROXY_PROTOCOL_TCP4, PROXY_PROTOCOL_TCP4_LEN); |
| 232 | if (m == PP_TOK_MATCH) { |
| 233 | af = AF_INET; |
| 234 | _buf.s += PROXY_PROTOCOL_TCP4_LEN; |
| 235 | _buf.len -= PROXY_PROTOCOL_TCP4_LEN; |
| 236 | if (_buf.len > PROXY_PROTOCOL_TCP4_PAYLOAD_MAX) |
| 237 | _buf.len = PROXY_PROTOCOL_TCP4_PAYLOAD_MAX; |
| 238 | max = PROXY_PROTOCOL_TCP4_MAX; |
| 239 | } else if (m == PP_TOK_PARTIAL) { |
| 240 | return NULL; |
| 241 | } else { |
| 242 | m = match_proxy_token(&_buf, PROXY_PROTOCOL_TCP6, PROXY_PROTOCOL_TCP6_LEN); |
| 243 | if (m == PP_TOK_MATCH) { |
| 244 | af = AF_INET6; |
| 245 | _buf.s += PROXY_PROTOCOL_TCP6_LEN; |
| 246 | _buf.len -= PROXY_PROTOCOL_TCP6_LEN; |
| 247 | if (_buf.len > PROXY_PROTOCOL_TCP6_PAYLOAD_MAX) |
| 248 | _buf.len = PROXY_PROTOCOL_TCP6_PAYLOAD_MAX; |
| 249 | max = PROXY_PROTOCOL_TCP6_MAX; |
| 250 | } else if (m == PP_TOK_PARTIAL) { |
| 251 | return NULL; |
| 252 | } else { |
| 253 | m = match_proxy_token(&_buf, PROXY_PROTOCOL_UNKN, PROXY_PROTOCOL_UNKN_LEN); |
| 254 | if (m == PP_TOK_MATCH) { |
| 255 | _buf.s += PROXY_PROTOCOL_UNKN_LEN; |
| 256 | _buf.len -= PROXY_PROTOCOL_UNKN_LEN; |
| 257 | if (_buf.len == 0) |
| 258 | return NULL; |
| 259 | if (_buf.s[0] != PROXY_PROTOCOL_SEP && |
| 260 | _buf.s[0] != PROXY_PROTOCOL_END[0]) { |
| 261 | LM_DBG("bad separator after proxy_protocol UNKNOWN: 0x%x\n", |
| 262 | (unsigned char)_buf.s[0]); |
| 263 | goto error; |
| 264 | } |
| 265 | if (_buf.len > PROXY_PROTOCOL_UNKN_PAYLOAD_MAX) |
| 266 | _buf.len = PROXY_PROTOCOL_UNKN_PAYLOAD_MAX; |
| 267 | af = AF_UNSPEC; |
| 268 | max = PROXY_PROTOCOL_UNKN_MAX; |
| 269 | } else if (m == PP_TOK_PARTIAL) { |
| 270 | return NULL; |
| 271 | } else { |
| 272 | LM_DBG("unknown proxy_protocol proto [%.*s]\n", _buf.len, _buf.s); |
no test coverage detected