Serge E. Hallyn wrote: > Quoting Oren Laadan (orenl@xxxxxxxxxxxxxxx): >>> /* dump the task_struct of a given task */ >>> static int checkpoint_task_struct(struct ckpt_ctx *ctx, struct task_struct *t) >>> { >>> struct ckpt_hdr_task *h; >>> int ret; >>> + int realcred_ref, ecred_ref; >>> + >>> + realcred_ref = checkpoint_obj(ctx, t->real_cred, CKPT_OBJ_CRED); >>> + if (realcred_ref < 0) >>> + return realcred_ref; >>> + >>> + ecred_ref = checkpoint_obj(ctx, t->cred, CKPT_OBJ_CRED); >>> + if (ecred_ref < 0) >>> + return ecred_ref; >> Is this safe even if the checkpointed task's state changes ? >> (e.g. unfrozen - yes, I know there is a patch in the works to >> prevent this; but if we ever want to checkpoint STOPPED tasks... >> for instance). >> >> Would incrementing the refcount on t->{cred,real_cred} help ? > > Doesn't checkpoint_obj already do that through obj_new? > No, it does not. There is a (potentially long) window of opportunity between the callback invoked from checkpoint_obj() - where the pointer is used, and when checkpoint_obj() later takes the extra reference. See for comparison checkpoint_mm_obj(), it safely grabs the task->mm (with a reference) around the invocation of checkpoint_obj(). Oren. _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers