housekeeper: Copy data to prevent access of freed data
This commit is contained in:
@ -275,11 +275,16 @@ hkthread(void *data)
|
|||||||
ptr->nextdue = now + ptr->frequency;
|
ptr->nextdue = now + ptr->frequency;
|
||||||
taskfn = ptr->task;
|
taskfn = ptr->task;
|
||||||
taskdata = ptr->data;
|
taskdata = ptr->data;
|
||||||
|
// We need to copy type and name, in case hktask_remove is called from
|
||||||
|
// the callback. Otherwise we will access freed data.
|
||||||
|
HKTASK_TYPE type = ptr->type;
|
||||||
|
char name[strlen(ptr->name) + 1];
|
||||||
|
strcpy(name, ptr->name);
|
||||||
spinlock_release(&tasklock);
|
spinlock_release(&tasklock);
|
||||||
(*taskfn)(taskdata);
|
(*taskfn)(taskdata);
|
||||||
if (ptr->type == HK_ONESHOT)
|
if (type == HK_ONESHOT)
|
||||||
{
|
{
|
||||||
hktask_remove(ptr->name);
|
hktask_remove(name);
|
||||||
}
|
}
|
||||||
spinlock_acquire(&tasklock);
|
spinlock_acquire(&tasklock);
|
||||||
ptr = tasks;
|
ptr = tasks;
|
||||||
|
Reference in New Issue
Block a user