| 435 | } |
| 436 | |
| 437 | int |
| 438 | SocksProxy::state_read_socks5_client_request(int event, [[maybe_unused]] void *data) |
| 439 | { |
| 440 | int64_t n; |
| 441 | unsigned char *p; |
| 442 | |
| 443 | ink_assert(state == AUTH_DONE); |
| 444 | if (event != VC_EVENT_READ_READY) { |
| 445 | ink_assert(!"not reached"); |
| 446 | return EVENT_CONT; |
| 447 | } |
| 448 | |
| 449 | n = reader->block_read_avail(); |
| 450 | p = (unsigned char *)reader->start(); |
| 451 | |
| 452 | /* Socks v5 request: |
| 453 | * VER CMD RSV ATYP DST DSTPORT |
| 454 | * 1 + 1 + 1 + 1 + ? + 2 |
| 455 | * |
| 456 | * so the minimum length is 6 + 4(IPv4) or 16(IPv6) |
| 457 | */ |
| 458 | if (n <= 6) { |
| 459 | return EVENT_CONT; |
| 460 | } |
| 461 | int req_len; |
| 462 | switch (p[3]) { |
| 463 | case SOCKS_ATYPE_IPV4: |
| 464 | req_len = 10; |
| 465 | break; |
| 466 | case SOCKS_ATYPE_FQHN: |
| 467 | req_len = 7 + p[4]; |
| 468 | break; |
| 469 | case SOCKS_ATYPE_IPV6: |
| 470 | req_len = 22; |
| 471 | break; |
| 472 | default: |
| 473 | req_len = INT_MAX; |
| 474 | state = SOCKS_ERROR; |
| 475 | Dbg(dbg_ctl_SocksProxy, "Illegal address type(%d)", static_cast<int>(p[3])); |
| 476 | } |
| 477 | |
| 478 | if (state == SOCKS_ERROR) { |
| 479 | return EVENT_DONE; |
| 480 | } else if (n < req_len) { |
| 481 | return EVENT_CONT; |
| 482 | } |
| 483 | |
| 484 | port = p[req_len - 2] * 256 + p[req_len - 1]; |
| 485 | clientVC->socks_addr.type = p[3]; |
| 486 | auth_handler = nullptr; |
| 487 | reader->consume(req_len); |
| 488 | |
| 489 | return parse_socks_client_request(p); |
| 490 | } |
| 491 | |
| 492 | int |
| 493 | SocksProxy::parse_socks_client_request(unsigned char *p) |
nothing calls this directly
no test coverage detected