diff --git a/files.c b/files.c index 65b3dea76..5be2c8547 100644 --- a/files.c +++ b/files.c @@ -405,7 +405,7 @@ int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id) fdinfo_entry__init(e); e->id = ctl_tty_id; - e->fd = get_service_fd(CTL_TTY_OFF); + e->fd = reserve_service_fd(CTL_TTY_OFF); e->type = FD_TYPES__TTY; if (collect_fd(pid, e, rst_info)) { diff --git a/include/crtools.h b/include/crtools.h index ee90839d7..65eb15438 100644 --- a/include/crtools.h +++ b/include/crtools.h @@ -132,6 +132,7 @@ enum sfd_type { extern int clone_service_fd(int id); extern int init_service_fd(void); extern int get_service_fd(enum sfd_type type); +extern int reserve_service_fd(enum sfd_type type); extern int install_service_fd(enum sfd_type type, int fd); extern int close_service_fd(enum sfd_type type); extern bool is_service_fd(int fd, enum sfd_type type); diff --git a/util.c b/util.c index 2b2596e59..5109a5736 100644 --- a/util.c +++ b/util.c @@ -296,6 +296,16 @@ static int __get_service_fd(enum sfd_type type, int service_fd_id) static DECLARE_BITMAP(sfd_map, SERVICE_FD_MAX); +int reserve_service_fd(enum sfd_type type) +{ + int sfd = __get_service_fd(type, service_fd_id); + + BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX); + + set_bit(type, sfd_map); + return sfd; +} + int install_service_fd(enum sfd_type type, int fd) { int sfd = __get_service_fd(type, service_fd_id);