test/nstool: Provide useful error if given a path that's too long
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> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
9f61c5b68b
commit
527c822a3b
1 changed files with 14 additions and 8 deletions
|
@ -93,14 +93,22 @@ static void usage(void)
|
||||||
" terminate.\n");
|
" 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,
|
static int connect_ctl(const char *sockpath, bool wait,
|
||||||
struct holder_info *info,
|
struct holder_info *info,
|
||||||
struct ucred *peercred)
|
struct ucred *peercred)
|
||||||
{
|
{
|
||||||
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
|
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
|
||||||
struct sockaddr_un addr = {
|
struct sockaddr_un addr;
|
||||||
.sun_family = AF_UNIX,
|
|
||||||
};
|
|
||||||
struct holder_info discard;
|
struct holder_info discard;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -108,7 +116,7 @@ static int connect_ctl(const char *sockpath, bool wait,
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
die("socket(): %s\n", strerror(errno));
|
die("socket(): %s\n", strerror(errno));
|
||||||
|
|
||||||
strncpy(addr.sun_path, sockpath, UNIX_PATH_MAX);
|
sockaddr_from_path(&addr, sockpath);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
rc = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
|
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[])
|
static void cmd_hold(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
|
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, PF_UNIX);
|
||||||
struct sockaddr_un addr = {
|
struct sockaddr_un addr;
|
||||||
.sun_family = AF_UNIX,
|
|
||||||
};
|
|
||||||
const char *sockpath = argv[1];
|
const char *sockpath = argv[1];
|
||||||
struct holder_info info;
|
struct holder_info info;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -162,7 +168,7 @@ static void cmd_hold(int argc, char *argv[])
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
die("socket(): %s\n", strerror(errno));
|
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));
|
rc = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
|
Loading…
Reference in a new issue