[CRIU] [PATCH] remap: fix dead pid remap of /proc/<pid>

Pavel Emelyanov xemul at parallels.com
Wed Jan 13 05:38:34 PST 2016


On 01/13/2016 04:12 PM, Tycho Andersen wrote:
> On Wed, Jan 13, 2016 at 04:05:28PM +0300, Pavel Emelyanov wrote:
>> On 01/06/2016 06:57 PM, Tycho Andersen wrote:
>>> It turns out we can't just test for /proc/<pid>, because the kernel appends
>>> (deleted), since the directory is actually deleted (vs. something like
>>> /proc/1/mountinfo, where the file still exists in the unlinked directory,
>>> so there is no (deleted)). See comment for details.
>>>
>>> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
>>> ---
>>>  files-reg.c                            | 34 +++++++++++++++++++++++++---------
>>>  test/zdtm/live/static/remap_dead_pid.c | 22 ++++++++++++++++++++--
>>>  2 files changed, 45 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/files-reg.c b/files-reg.c
>>> index 0f89be5..43872f0 100644
>>> --- a/files-reg.c
>>> +++ b/files-reg.c
>>> @@ -887,16 +887,32 @@ static int check_path_remap(struct fd_link *link, const struct fd_parms *parms,
>>>  			return -1;
>>>  		pid = strtol(start + 1, &end, 10);
>>>  
>>> -		/* if we didn't find another /, this path something
>>> -		 * like ./proc/kmsg, which we shouldn't mess with. */
>>> -		if (*end == '/') {
>>> -			*end = 0;
>>> -			ret = access(rpath, F_OK);
>>> -			*end = '/';
>>> -
>>> -			if (ret) {
>>> +		/* If strtol didn't convert anything, then we are looking at
>>> +		 * something like /proc/kmsg, which we shouldn't mess with.
>>> +		 * Anything under /proc/<pid> (including that directory itself)
>>> +		 * can be c/r'd with a dead pid remap, so let's allow all such
>>> +		 * cases.
>>> +		 */
>>> +		if (pid != 0) {
>>> +			bool is_dead = strip_deleted(link);
>>> +
>>> +			/* /proc/<pid> will be "/proc/1 (deleted)" when it is
>>> +			 * dead, but a path like /proc/1/mountinfo won't have
>>> +			 * the suffix, since it isn't actually deleted (still
>>> +			 * exists, but the parent dir is deleted). So, if we
>>> +			 * have a path like /proc/1/mountinfo, test if /proc/1
>>> +			 * exists instead, since this is what CRIU will need to
>>> +			 * open on restore.
>>> +			 */
>>> +			if (!is_dead) {
>>
>> If the is_dead is 0 here we never go dumping the pid remap, which seems to
>> be breaking the behavior on /proc/pid/xxx files.
>>
>>> +				*end = 0;
>>> +				ret = access(rpath, F_OK);
>>
>> Shouldn't this be is_dead = access() instead?
> 
> Oh, yes. Doesn't that fix the case you noted above, too?

Hm... At the first glance it should, but ...

> Also, I'll fix the test so that it doesn't use the same pid for both
> cases, so we'll see this if it breaks in the future :)

... yes, having two separate test cases would be nice :)

-- Pavel



More information about the CRIU mailing list