Commit bd7c9e07 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

nvme: do port number checking in nvme_parse_addr()



TCP was already range checking the port number, so
move it to the common nvme_parse_addr() so that RDMA
gets the port checking as well.

Note, previously TCP was checking against MAX_INT,
so change this to reject >= 65536 instead which is
the real IP port limit.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Suggested-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: I91e2f23ac4f4d8ec80cdea95a4bbff73477b8464
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20565


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 01bbc271
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -1555,7 +1555,8 @@ spdk_nvme_connect_async(const struct spdk_nvme_transport_id *trid,
}

int
nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const char *service)
nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const char *service,
		long int *port)
{
	struct addrinfo *res;
	struct addrinfo hints;
@@ -1566,6 +1567,17 @@ nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = 0;

	if (addr == NULL || service == NULL) {
		SPDK_ERRLOG("addr and service must both be non-NULL\n");
		return -EINVAL;
	}

	*port = spdk_strtol(service, 10);
	if (*port <= 0 || *port >= 65536) {
		SPDK_ERRLOG("Invalid port: %s\n", service);
		return -EINVAL;
	}

	ret = getaddrinfo(addr, service, &hints, &res);
	if (ret) {
		SPDK_ERRLOG("getaddrinfo failed: %s (%d)\n", gai_strerror(ret), ret);
+1 −1
Original line number Diff line number Diff line
@@ -1594,7 +1594,7 @@ void nvme_ctrlr_proc_put_ref(struct spdk_nvme_ctrlr *ctrlr);
int	nvme_ctrlr_get_ref_count(struct spdk_nvme_ctrlr *ctrlr);

int	nvme_parse_addr(struct sockaddr_storage *sa, int family,
			const char *addr, const char *service);
			const char *addr, const char *service, long int *port);

static inline bool
_is_page_aligned(uint64_t address, uint64_t page_size)
+3 −2
Original line number Diff line number Diff line
@@ -1247,6 +1247,7 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp
	struct sockaddr_storage dst_addr;
	struct sockaddr_storage src_addr;
	bool src_addr_specified;
	long int port, src_port;
	int rc;
	struct nvme_rdma_ctrlr *rctrlr;
	struct nvme_rdma_qpair *rqpair;
@@ -1273,7 +1274,7 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp
	memset(&dst_addr, 0, sizeof(dst_addr));

	SPDK_DEBUGLOG(nvme, "trsvcid is %s\n", ctrlr->trid.trsvcid);
	rc = nvme_parse_addr(&dst_addr, family, ctrlr->trid.traddr, ctrlr->trid.trsvcid);
	rc = nvme_parse_addr(&dst_addr, family, ctrlr->trid.traddr, ctrlr->trid.trsvcid, &port);
	if (rc != 0) {
		SPDK_ERRLOG("dst_addr nvme_parse_addr() failed\n");
		return -1;
@@ -1281,7 +1282,7 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp

	if (ctrlr->opts.src_addr[0] || ctrlr->opts.src_svcid[0]) {
		memset(&src_addr, 0, sizeof(src_addr));
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid);
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid, &src_port);
		if (rc != 0) {
			SPDK_ERRLOG("src_addr nvme_parse_addr() failed\n");
			return -1;
+3 −10
Original line number Diff line number Diff line
@@ -2222,7 +2222,7 @@ nvme_tcp_qpair_connect_sock(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpai
	int rc;
	struct nvme_tcp_qpair *tqpair;
	int family;
	long int port;
	long int port, src_port;
	char *sock_impl_name;
	struct spdk_sock_impl_opts impl_opts = {};
	size_t impl_opts_size = sizeof(impl_opts);
@@ -2248,15 +2248,8 @@ nvme_tcp_qpair_connect_sock(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpai

	memset(&dst_addr, 0, sizeof(dst_addr));

	port = spdk_strtol(ctrlr->trid.trsvcid, 10);
	if (port <= 0 || port >= INT_MAX) {
		SPDK_ERRLOG("Invalid port: %s\n", ctrlr->trid.trsvcid);
		rc = -1;
		return rc;
	}

	SPDK_DEBUGLOG(nvme, "trsvcid is %s\n", ctrlr->trid.trsvcid);
	rc = nvme_parse_addr(&dst_addr, family, ctrlr->trid.traddr, ctrlr->trid.trsvcid);
	rc = nvme_parse_addr(&dst_addr, family, ctrlr->trid.traddr, ctrlr->trid.trsvcid, &port);
	if (rc != 0) {
		SPDK_ERRLOG("dst_addr nvme_parse_addr() failed\n");
		return rc;
@@ -2264,7 +2257,7 @@ nvme_tcp_qpair_connect_sock(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpai

	if (ctrlr->opts.src_addr[0] || ctrlr->opts.src_svcid[0]) {
		memset(&src_addr, 0, sizeof(src_addr));
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid);
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid, &src_port);
		if (rc != 0) {
			SPDK_ERRLOG("src_addr nvme_parse_addr() failed\n");
			return rc;
+8 −1
Original line number Diff line number Diff line
@@ -114,12 +114,19 @@ nvme_qpair_init(struct spdk_nvme_qpair *qpair, uint16_t id,
}

int
nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const char *service)
nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const char *service,
		long int *port)
{
	struct addrinfo *res;
	struct addrinfo hints;
	int rc;

	SPDK_CU_ASSERT_FATAL(service != NULL);
	*port = spdk_strtol(service, 10);
	if (*port <= 0 || *port >= 65536) {
		return -EINVAL;
	}

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = family;
	hints.ai_socktype = SOCK_STREAM;
Loading