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

util: don't allow users to pass paddr/pport for listen sockets



paddr/pport don't apply to listen sockets, since listen sockets don't
have a peer. So throw an explicit error if they are specified, rather
than just waiting for the getpeername() to fail.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: Ic537f8000f7625a1165ca02373db3227a1c55eb8
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24144


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 1fcd7d99
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -122,12 +122,13 @@ spdk_net_getaddr(int fd, char *laddr, int llen, uint16_t *lport,
		 char *paddr, int plen, uint16_t *pport)
{
	struct sockaddr_storage sa;
	socklen_t salen;
	int val;
	socklen_t len;
	int rc;

	memset(&sa, 0, sizeof(sa));
	salen = sizeof(sa);
	rc = getsockname(fd, (struct sockaddr *)&sa, &salen);
	len = sizeof(sa);
	rc = getsockname(fd, (struct sockaddr *)&sa, &len);
	if (rc != 0) {
		SPDK_ERRLOG("getsockname() failed (errno=%d)\n", errno);
		return -1;
@@ -160,9 +161,20 @@ spdk_net_getaddr(int fd, char *laddr, int llen, uint16_t *lport,
		}
	}

	len = sizeof(val);
	rc = getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len);
	if (rc == 0 && val == 1) {
		/* It is an error to getaddr for a peer address on a listen socket. */
		if (paddr != NULL || pport != NULL) {
			SPDK_ERRLOG("paddr, pport not valid on listen sockets\n");
			return -1;
		}
		return 0;
	}

	memset(&sa, 0, sizeof(sa));
	salen = sizeof(sa);
	rc = getpeername(fd, (struct sockaddr *)&sa, &salen);
	len = sizeof(sa);
	rc = getpeername(fd, (struct sockaddr *)&sa, &len);
	if (rc != 0) {
		SPDK_ERRLOG("getpeername() failed (errno=%d)\n", errno);
		return -1;