Skip to content

Commit 358f09c

Browse files
KAGA-KOKOavagin
authored andcommitted
timers: improve and fix posix timer id sequence checks
This is a patch proposed by Thomas here: https://lore.kernel.org/all/87ilczc7d9.ffs@tglx/ It removes (created id > desired id) "sanity" check and adds proper checking that ids start at zero and increment by one each time when we create/delete a posix timer. First purpose of it is to fix infinite looping in create_posix_timers on old pre 3.11 kernels. Second purpose is to allow kernel interface of creating posix timers with desired id change from iterating with predictable next id to just setting next id directly. And at the same time removing predictable next id so that criu with this patch would not get to infinite loop in create_posix_timers if this happens. Thanks a lot to Thomas! Signed-off-by: Pavel Tikhomirov <[email protected]>
1 parent 9130fef commit 358f09c

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

criu/pie/restorer.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,7 @@ static int timerfd_arm(struct task_restore_args *args)
11691169
static int create_posix_timers(struct task_restore_args *args)
11701170
{
11711171
int ret, i;
1172-
kernel_timer_t next_id;
1172+
kernel_timer_t next_id = 0, timer_id;
11731173
struct sigevent sev;
11741174

11751175
for (i = 0; i < args->posix_timers_n; i++) {
@@ -1183,25 +1183,26 @@ static int create_posix_timers(struct task_restore_args *args)
11831183
sev.sigev_value.sival_ptr = args->posix_timers[i].spt.sival_ptr;
11841184

11851185
while (1) {
1186-
ret = sys_timer_create(args->posix_timers[i].spt.clock_id, &sev, &next_id);
1186+
ret = sys_timer_create(args->posix_timers[i].spt.clock_id, &sev, &timer_id);
11871187
if (ret < 0) {
11881188
pr_err("Can't create posix timer - %d\n", i);
11891189
return ret;
11901190
}
11911191

1192-
if (next_id == args->posix_timers[i].spt.it_id)
1192+
if (timer_id != next_id) {
1193+
pr_err("Can't create timers, kernel don't give them consequently\n");
1194+
return -1;
1195+
}
1196+
next_id++;
1197+
1198+
if (timer_id == args->posix_timers[i].spt.it_id)
11931199
break;
11941200

1195-
ret = sys_timer_delete(next_id);
1201+
ret = sys_timer_delete(timer_id);
11961202
if (ret < 0) {
1197-
pr_err("Can't remove temporaty posix timer 0x%x\n", next_id);
1203+
pr_err("Can't remove temporaty posix timer 0x%x\n", timer_id);
11981204
return ret;
11991205
}
1200-
1201-
if ((long)next_id > args->posix_timers[i].spt.it_id) {
1202-
pr_err("Can't create timers, kernel don't give them consequently\n");
1203-
return -1;
1204-
}
12051206
}
12061207
}
12071208

0 commit comments

Comments
 (0)