[CRIU] [PATCH] files: fix clone_service_fd overlap handling
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Apr 17 17:44:22 MSK 2018
On 17.04.2018 17:07, Pavel Tikhomirov wrote:
> Though LOG_FD_OFF < IMG_FD_OFF, get_service_fd(LOG_FD_OFF) is > than
> get_service_fd(IMG_FD_OFF), see __get_service_fd, so the check here
> should be twisted. Also add bug_on to track possible __get_service_fd
> change which can break these check again.
>
> We have a problem when USERNSD_SK replaces LOG_FD_OFF, latter when
> writing to log, instead we actually send crazy commands to usernsd,
> which failes to handle them and BUG or crash.
>
> https://jira.sw.ru/browse/PSBM-83472
>
> Also we had similar problem when __userns_call received bad repsonse,
> likely it has the same background.
>
> https://api.travis-ci.org/v3/job/352164661/log.txt
>
> fixes commit 129bb14611c3 ("files: Prepare clone_service_fd() for
> overlaping ranges.")
>
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
> criu/util.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/criu/util.c b/criu/util.c
> index b19bf5175..4af542a4f 100644
> --- a/criu/util.c
> +++ b/criu/util.c
> @@ -617,7 +617,8 @@ int clone_service_fd(struct pstree_item *me)
> return 0;
>
> /* Dup sfds in memmove() style: they may overlap */
> - if (get_service_fd(LOG_FD_OFF) > new_base - LOG_FD_OFF - SERVICE_FD_MAX * id)
Good catch!
> + BUG_ON(get_service_fd(LOG_FD_OFF) < get_service_fd(IMG_FD_OFF));
I don't think we should check this in runtime. If we need this, this should be made
once in one of the init functions.
> + if (get_service_fd(LOG_FD_OFF) < new_base - LOG_FD_OFF - SERVICE_FD_MAX * id)
> for (i = SERVICE_FD_MIN + 1; i < SERVICE_FD_MAX; i++)
> move_service_fd(me, i, id, new_base);
> else
>
Kirill
More information about the CRIU
mailing list