aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/restricted/aws/aws-c-io/source/socket_shared.c
blob: 63c640b4926061fa7941baf7e529ef71b5cc8210 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */
#include <aws/io/socket.h>

#include <aws/io/logging.h>

/* common validation for connect() and bind() */
static int s_socket_validate_port_for_domain(uint32_t port, enum aws_socket_domain domain) {
    switch (domain) {
        case AWS_SOCKET_IPV4:
        case AWS_SOCKET_IPV6:
            if (port > UINT16_MAX) {
                AWS_LOGF_ERROR(
                    AWS_LS_IO_SOCKET,
                    "Invalid port=%u for %s. Cannot exceed 65535",
                    port,
                    domain == AWS_SOCKET_IPV4 ? "IPv4" : "IPv6");
                return aws_raise_error(AWS_IO_SOCKET_INVALID_ADDRESS);
            }
            break;

        case AWS_SOCKET_LOCAL:
            /* port is ignored */
            break;

        case AWS_SOCKET_VSOCK:
            /* any 32bit port is legal */
            break;

        default:
            AWS_LOGF_ERROR(AWS_LS_IO_SOCKET, "Cannot validate port for unknown domain=%d", domain);
            return aws_raise_error(AWS_IO_SOCKET_INVALID_ADDRESS);
    }
    return AWS_OP_SUCCESS;
}

int aws_socket_validate_port_for_connect(uint32_t port, enum aws_socket_domain domain) {
    if (s_socket_validate_port_for_domain(port, domain)) {
        return AWS_OP_ERR;
    }

    /* additional validation */
    switch (domain) {
        case AWS_SOCKET_IPV4:
        case AWS_SOCKET_IPV6:
            if (port == 0) {
                AWS_LOGF_ERROR(
                    AWS_LS_IO_SOCKET,
                    "Invalid port=%u for %s connections. Must use 1-65535",
                    port,
                    domain == AWS_SOCKET_IPV4 ? "IPv4" : "IPv6");
                return aws_raise_error(AWS_IO_SOCKET_INVALID_ADDRESS);
            }
            break;

        case AWS_SOCKET_VSOCK:
            if (port == (uint32_t)-1) {
                AWS_LOGF_ERROR(
                    AWS_LS_IO_SOCKET, "Invalid port for VSOCK connections. Cannot use VMADDR_PORT_ANY (-1U).");
                return aws_raise_error(AWS_IO_SOCKET_INVALID_ADDRESS);
            }
            break;

        default:
            /* no extra validation */
            break;
    }
    return AWS_OP_SUCCESS;
}

int aws_socket_validate_port_for_bind(uint32_t port, enum aws_socket_domain domain) {
    return s_socket_validate_port_for_domain(port, domain);
}