[CRIU] [PATCH 1/3] unix: Fix tail processing for peer-less sockets

Pavel Emelyanov xemul at virtuozzo.com
Tue Feb 14 08:55:58 PST 2017


We should only get to the post-open stage for standalone
sockets with peers. All the others return 0 from ->open
which means "restore is over".

This change avoids double calling or rst_file_params and
restore_socket_opts for those ones.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/sk-unix.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/criu/sk-unix.c b/criu/sk-unix.c
index 5a69cd2..2dfd7d5 100644
--- a/criu/sk-unix.c
+++ b/criu/sk-unix.c
@@ -919,25 +919,17 @@ static int post_open_unix_sk(struct file_desc *d, int fd)
 	int cwd_fd = -1, root_fd = -1;
 
 	ui = container_of(d, struct unix_sk_info, d);
-	if (ui->flags & (USK_PAIR_MASTER | USK_PAIR_SLAVE))
-		return 0;
+	BUG_ON((ui->flags & (USK_PAIR_MASTER | USK_PAIR_SLAVE)) ||
+			(ui->ue->uflags & (USK_CALLBACK | USK_INHERIT)));
 
 	peer = ui->peer;
-
-	if (peer == NULL)
-		return 0;
-
-	if (ui->ue->uflags & USK_CALLBACK)
-		return 0;
+	BUG_ON(peer == NULL);
 
 	/* Skip external sockets */
 	if (!list_empty(&peer->d.fd_info_head))
 		if (peer_is_not_prepared(peer))
 			return 1;
 
-	if (ui->ue->uflags & USK_INHERIT)
-		return 0;
-
 	memset(&addr, 0, sizeof(addr));
 	addr.sun_family = AF_UNIX;
 	memcpy(&addr.sun_path, peer->name, peer->ue->name.len);
@@ -1291,6 +1283,17 @@ static int open_unixsk_standalone(struct unix_sk_info *ui, int *new_fd)
 		ui->listen = 1;
 		wake_connected_sockets(ui);
 	}
+
+	if (ui->peer) {
+		/*
+		 * We need to connect() to the peer, but the
+		 * guy might have not bind()-ed himself, so
+		 * let's postpone this.
+		 */
+		*new_fd = sk;
+		return 1;
+	}
+
 out:
 	if (rst_file_params(sk, ui->ue->fown, ui->ue->flags))
 		return -1;
@@ -1298,8 +1301,11 @@ out:
 	if (restore_socket_opts(sk, ui->ue->opts))
 		return -1;
 
+	if (shutdown_unix_sk(sk, ui))
+		return -1;
+
 	*new_fd = sk;
-	return 1;
+	return 0;
 }
 
 static int open_unix_sk(struct file_desc *d, int *new_fd)
-- 
2.1.4


More information about the CRIU mailing list