public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH 1/2] test/nstool: Provide useful error if given a path that's too long
Date: Tue, 23 May 2023 12:25:42 +1000	[thread overview]
Message-ID: <20230523022543.623950-2-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20230523022543.623950-1-david@gibson.dropbear.id.au>

Normal filesystem paths can be very long (PATH_MAX is around 8k), however
Unix domain sockets can only use relatively short paths (UNIX_PATH_MAX is
108 on Linux).  Currently nstool will simply truncate paths that are too
long, leading to difficult to understand failures.

Make such failures clearer, with an explicit error message if given a path
that's too long.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 test/nstool.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/test/nstool.c b/test/nstool.c
index e6d7d37..bca9569 100644
--- a/test/nstool.c
+++ b/test/nstool.c
@@ -93,14 +93,22 @@ static void usage(void)
 	    "    terminate.\n");
 }
 
+static void sockaddr_from_path(struct sockaddr_un *addr, const char *sockpath)
+{
+	if (strlen(sockpath) > UNIX_PATH_MAX)
+		die("\"%s\" is too long for Unix socket path (%zu > %d)",
+		    sockpath, strlen(sockpath), UNIX_PATH_MAX);
+
+	addr->sun_family = AF_UNIX;
+	strncpy(addr->sun_path, sockpath, UNIX_PATH_MAX);
+}
+
 static int connect_ctl(const char *sockpath, bool wait,
 		       struct holder_info *info,
 		       struct ucred *peercred)
 {
 	int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
-	struct sockaddr_un addr = {
-		.sun_family = AF_UNIX,
-	};
+	struct sockaddr_un addr;
 	struct holder_info discard;
 	ssize_t len;
 	int rc;
@@ -108,7 +116,7 @@ static int connect_ctl(const char *sockpath, bool wait,
 	if (fd < 0)
 		die("socket(): %s\n", strerror(errno));
 
-	strncpy(addr.sun_path, sockpath, UNIX_PATH_MAX);
+	sockaddr_from_path(&addr, sockpath);
 
 	do {
 		rc = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
@@ -149,9 +157,7 @@ static int connect_ctl(const char *sockpath, bool wait,
 static void cmd_hold(int argc, char *argv[])
 {
 	int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
-	struct sockaddr_un addr = {
-		.sun_family = AF_UNIX,
-	};
+	struct sockaddr_un addr;
 	const char *sockpath = argv[1];
 	struct holder_info info;
 	int rc;
@@ -162,7 +168,7 @@ static void cmd_hold(int argc, char *argv[])
 	if (fd < 0)
 		die("socket(): %s\n", strerror(errno));
 
-	strncpy(addr.sun_path, sockpath, UNIX_PATH_MAX);
+	sockaddr_from_path(&addr, sockpath);
 
 	rc = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
 	if (rc < 0)
-- 
@@ -93,14 +93,22 @@ static void usage(void)
 	    "    terminate.\n");
 }
 
+static void sockaddr_from_path(struct sockaddr_un *addr, const char *sockpath)
+{
+	if (strlen(sockpath) > UNIX_PATH_MAX)
+		die("\"%s\" is too long for Unix socket path (%zu > %d)",
+		    sockpath, strlen(sockpath), UNIX_PATH_MAX);
+
+	addr->sun_family = AF_UNIX;
+	strncpy(addr->sun_path, sockpath, UNIX_PATH_MAX);
+}
+
 static int connect_ctl(const char *sockpath, bool wait,
 		       struct holder_info *info,
 		       struct ucred *peercred)
 {
 	int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
-	struct sockaddr_un addr = {
-		.sun_family = AF_UNIX,
-	};
+	struct sockaddr_un addr;
 	struct holder_info discard;
 	ssize_t len;
 	int rc;
@@ -108,7 +116,7 @@ static int connect_ctl(const char *sockpath, bool wait,
 	if (fd < 0)
 		die("socket(): %s\n", strerror(errno));
 
-	strncpy(addr.sun_path, sockpath, UNIX_PATH_MAX);
+	sockaddr_from_path(&addr, sockpath);
 
 	do {
 		rc = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
@@ -149,9 +157,7 @@ static int connect_ctl(const char *sockpath, bool wait,
 static void cmd_hold(int argc, char *argv[])
 {
 	int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
-	struct sockaddr_un addr = {
-		.sun_family = AF_UNIX,
-	};
+	struct sockaddr_un addr;
 	const char *sockpath = argv[1];
 	struct holder_info info;
 	int rc;
@@ -162,7 +168,7 @@ static void cmd_hold(int argc, char *argv[])
 	if (fd < 0)
 		die("socket(): %s\n", strerror(errno));
 
-	strncpy(addr.sun_path, sockpath, UNIX_PATH_MAX);
+	sockaddr_from_path(&addr, sockpath);
 
 	rc = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
 	if (rc < 0)
-- 
2.40.1


  reply	other threads:[~2023-05-23  2:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-23  2:25 [PATCH 0/2] Fixes for nstool David Gibson
2023-05-23  2:25 ` David Gibson [this message]
2023-05-23  2:25 ` [PATCH 2/2] test/nstool: Fix fd leak in accept() loop David Gibson
2023-05-23 15:06 ` [PATCH 0/2] Fixes for nstool Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230523022543.623950-2-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).