[lxc-devel] [lxc/master] commands: switch to setting errno and returning -1

brauner on Github lxc-bot at linuxcontainers.org
Mon Sep 3 01:14:37 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180903/c91d6efe/attachment.bin>
-------------- next part --------------
From 1b1ce77d4ca4fa54e08240ba7b2121368c2f3e67 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:44:40 +0200
Subject: [PATCH 1/4] commands: better error message

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/commands.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index e57a64f33..04fff50eb 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -97,7 +97,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
 	};
 
 	if (cmd >= LXC_CMD_MAX)
-		return "Unknown cmd";
+		return "Invalid request";
 
 	return cmdname[cmd];
 }

From 498825d88044f870f360dd57d86a3e26934bea84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:51:39 +0200
Subject: [PATCH 2/4] file_utils: add lxc_recv_nointr()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/file_utils.c | 11 +++++++++++
 src/lxc/file_utils.h |  2 ++
 2 files changed, 13 insertions(+)

diff --git a/src/lxc/file_utils.c b/src/lxc/file_utils.c
index 63e8322d6..1e87f2a24 100644
--- a/src/lxc/file_utils.c
+++ b/src/lxc/file_utils.c
@@ -117,6 +117,17 @@ ssize_t lxc_read_nointr(int fd, void *buf, size_t count)
 	return ret;
 }
 
+ssize_t lxc_recv_nointr(int sockfd, void *buf, size_t len, int flags)
+{
+	ssize_t ret;
+again:
+	ret = recv(sockfd, buf, len, flags);
+	if (ret < 0 && errno == EINTR)
+		goto again;
+
+	return ret;
+}
+
 ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count, const void *expected_buf)
 {
 	ssize_t ret;
diff --git a/src/lxc/file_utils.h b/src/lxc/file_utils.h
index 9467f53ac..5172b6d15 100644
--- a/src/lxc/file_utils.h
+++ b/src/lxc/file_utils.h
@@ -40,6 +40,8 @@ extern ssize_t lxc_write_nointr(int fd, const void *buf, size_t count);
 extern ssize_t lxc_read_nointr(int fd, void *buf, size_t count);
 extern ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count,
 				      const void *expected_buf);
+extern ssize_t lxc_recv_nointr(int sockfd, void *buf, size_t len, int flags);
+
 extern bool file_exists(const char *f);
 extern int print_to_file(const char *file, const char *content);
 extern int is_dir(const char *path);

From 7c1d7d207382d0959b9952cbbadf2f98e7ec04d6 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:53:57 +0200
Subject: [PATCH 3/4] commands: switch to setting errno and returning -1

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
Cc: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
 src/lxc/commands.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 04fff50eb..24f28acb7 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -130,7 +130,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
 		        lxc_cmd_str(cmd->req.cmd));
 
 		if (errno == ECONNRESET)
-			return -ECONNRESET;
+			return -1;
 
 		return -1;
 	}
@@ -147,10 +147,12 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
 
 		rspdata = malloc(sizeof(*rspdata));
 		if (!rspdata) {
-			ERROR("Failed to allocate response buffer for command \"%s\"",
-			      lxc_cmd_str(cmd->req.cmd));
-			return -ENOMEM;
+			errno = ENOMEM;
+			SYSERROR("Failed to allocate response buffer for command \"%s\"",
+				 lxc_cmd_str(cmd->req.cmd));
+			return -1;
 		}
+
 		rspdata->masterfd = rspfd;
 		rspdata->ttynum = PTR_TO_INT(rsp->data);
 		rsp->data = rspdata;
@@ -167,7 +169,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
 		errno = EFBIG;
 		SYSERROR("Response data for command \"%s\" is too long: %d bytes > %d",
 		         lxc_cmd_str(cmd->req.cmd), rsp->datalen, LXC_CMD_DATA_MAX);
-		return -EFBIG;
+		return -1;
 	}
 
 	if (cmd->req.cmd == LXC_CMD_CONSOLE_LOG) {
@@ -180,15 +182,14 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
 		errno = ENOMEM;
 		SYSERROR("Failed to allocate response buffer for command \"%s\"",
 		         lxc_cmd_str(cmd->req.cmd));
-		return -ENOMEM;
+		return -1;
 	}
 
-	ret = recv(sock, rsp->data, rsp->datalen, 0);
+	ret = lxc_recv_nointr(sock, rsp->data, rsp->datalen, 0);
 	if (ret != rsp->datalen) {
 		SYSERROR("Failed to receive response data for command \"%s\"",
 		         lxc_cmd_str(cmd->req.cmd));
-		if (ret >= 0)
-			ret = -1;
+		return -1;
 	}
 
 	return ret;
@@ -323,7 +324,7 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
 	}
 
 	ret = lxc_cmd_rsp_recv(client_fd, cmd);
-	if (ret == -ECONNRESET)
+	if (ret < 0 && errno == ECONNRESET)
 		*stopped = 1;
 
 	if (!stay_connected || ret <= 0)

From 241eaa3365cce8a1902387efe5aa8877ed42ef84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 03:05:57 +0200
Subject: [PATCH 4/4] commands: switch to setting errno and returning -1

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
Cc: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
 src/lxc/commands.c       | 55 +++++++++++++++-------------------------
 src/lxc/commands_utils.c |  5 +---
 2 files changed, 21 insertions(+), 39 deletions(-)

diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 24f28acb7..7abb33fd8 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -228,51 +228,33 @@ static int lxc_cmd_rsp_send(int fd, struct lxc_cmd_rsp *rsp)
 static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd,
 			const char *lxcpath, const char *hashed_sock_name)
 {
-	int client_fd;
+	int client_fd, saved_errno;
 	ssize_t ret = -1;
 
 	client_fd = lxc_cmd_connect(name, lxcpath, hashed_sock_name, "command");
-	if (client_fd < 0) {
-		if (client_fd == -ECONNREFUSED)
-			return -ECONNREFUSED;
-
+	if (client_fd < 0)
 		return -1;
-	}
 
 	ret = lxc_abstract_unix_send_credential(client_fd, &cmd->req,
 						sizeof(cmd->req));
-	if (ret < 0 ) {
-		if (errno == EPIPE) {
-			close(client_fd);
-			return -EPIPE;
-		}
-		close(client_fd);
-
-		return -1;
-	}
-
-	if ((size_t)ret != sizeof(cmd->req)) {
-		close(client_fd);
-		return -EMSGSIZE;
-	}
+	if (ret < 0 || (size_t)ret != sizeof(cmd->req))
+		goto on_error;
 
 	if (cmd->req.datalen <= 0)
 		return client_fd;
 
 	ret = send(client_fd, cmd->req.data, cmd->req.datalen, MSG_NOSIGNAL);
-	if (ret < 0 || ret != (ssize_t)cmd->req.datalen) {
-		close(client_fd);
-
-		if (errno == EPIPE)
-			return -EPIPE;
+	if (ret < 0 || ret != (ssize_t)cmd->req.datalen)
+		goto on_error;
 
-		if (ret >= 0)
-			return -EMSGSIZE;
+	return client_fd;
 
-		return -1;
-	}
+on_error:
+	saved_errno = errno;
+	close(client_fd);
+	errno = saved_errno;
 
-	return client_fd;
+	return -1;
 }
 
 /*
@@ -297,7 +279,7 @@ static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd,
 static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
 		   const char *lxcpath, const char *hashed_sock_name)
 {
-	int client_fd;
+	int client_fd, saved_errno;
 	int ret = -1;
 	bool stay_connected = false;
 
@@ -312,15 +294,15 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
 		SYSTRACE("Command \"%s\" failed to connect command socket",
 		         lxc_cmd_str(cmd->req.cmd));
 
-		if (client_fd == -ECONNREFUSED)
+		if (errno == ECONNREFUSED)
 			*stopped = 1;
 
-		if (client_fd == -EPIPE) {
+		if (errno == EPIPE) {
 			*stopped = 1;
 			client_fd = 0;
 		}
 
-		return client_fd;
+		return -1;
 	}
 
 	ret = lxc_cmd_rsp_recv(client_fd, cmd);
@@ -328,8 +310,11 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
 		*stopped = 1;
 
 	if (!stay_connected || ret <= 0)
-		if (client_fd >= 0)
+		if (client_fd >= 0) {
+			saved_errno = errno;
 			close(client_fd);
+			errno = saved_errno;
+		}
 
 	if (stay_connected && ret > 0)
 		cmd->rsp.ret = client_fd;
diff --git a/src/lxc/commands_utils.c b/src/lxc/commands_utils.c
index c6544631d..bb61797c8 100644
--- a/src/lxc/commands_utils.c
+++ b/src/lxc/commands_utils.c
@@ -178,11 +178,8 @@ int lxc_cmd_connect(const char *name, const char *lxcpath,
 
 	/* Get new client fd. */
 	client_fd = lxc_abstract_unix_connect(path);
-	if (client_fd < 0) {
-		if (errno == ECONNREFUSED)
-			return -ECONNREFUSED;
+	if (client_fd < 0)
 		return -1;
-	}
 
 	return client_fd;
 }


More information about the lxc-devel mailing list