[CRIU] [PATCH 2/3] sfd: Make sure we're not overwriting existing files
Cyrill Gorcunov
gorcunov at gmail.com
Fri Mar 29 20:55:23 MSK 2019
Just a warn for now since we need to investigate
every case without breaking ci.
Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
criu/include/servicefd.h | 15 +++++++++++++++
criu/servicefd.c | 4 ++--
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/criu/include/servicefd.h b/criu/include/servicefd.h
index f8c2814092b7..1c4349e4eeb0 100644
--- a/criu/include/servicefd.h
+++ b/criu/include/servicefd.h
@@ -1,7 +1,11 @@
#ifndef __CR_SERVICE_FD_H__
#define __CR_SERVICE_FD_H__
+#include <stdio.h>
#include <stdbool.h>
+#include <unistd.h>
+
+#include "criu-log.h"
enum sfd_type {
SERVICE_FD_MIN,
@@ -28,6 +32,17 @@ enum sfd_type {
struct pstree_item;
extern bool sfds_protected;
+#define sfd_verify_targtet(_type, _old_fd, _new_fd) \
+ do { \
+ char self_path[64]; \
+ \
+ snprintf(self_path, sizeof(self_path), "/proc/self/fd/%d", _new_fd); \
+ if (access(self_path, F_OK)) { \
+ pr_warn("type %d: busy target %d -> %d\n", \
+ _type, _old_fd, _new_fd); \
+ } \
+ } while (0)
+
extern int init_service_fd(void);
extern int get_service_fd(enum sfd_type type);
extern bool is_any_service_fd(int fd);
diff --git a/criu/servicefd.c b/criu/servicefd.c
index a9909735af44..bb8c26ca466c 100644
--- a/criu/servicefd.c
+++ b/criu/servicefd.c
@@ -10,8 +10,6 @@
#include "common/compiler.h"
#include "common/list.h"
-#include "criu-log.h"
-
#include "util.h"
#include "bitops.h"
#include "pstree.h"
@@ -128,6 +126,7 @@ int install_service_fd(enum sfd_type type, int fd)
return fd;
}
+ sfd_verify_targtet(type, fd, sfd);
if (dup3(fd, sfd, O_CLOEXEC) != sfd) {
pr_perror("Dup %d -> %d failed", fd, sfd);
close(fd);
@@ -166,6 +165,7 @@ static void move_service_fd(struct pstree_item *me, int type, int new_id, int ne
if (old < 0)
return;
+ sfd_verify_targtet(type, old, new);
ret = dup2(old, new);
if (ret == -1) {
if (errno != EBADF)
--
2.20.1
More information about the CRIU
mailing list