fix(kobject): Fixed a lifecycle operation issue with the parent in the kernel object.
1.There is a delay in getting the parent when the kernel object is operating, making it possible to be insecure for some time. Fix this by adjusting the timing of access to the parent.
This commit is contained in:
@@ -25,7 +25,7 @@ extern "C" {
|
||||
*/
|
||||
|
||||
#if defined(MR_USE_KTIMER)
|
||||
/* Periodic definition */
|
||||
/* Ktimer periodic definition */
|
||||
#define MR_KTIMER_PERIODIC (1U << 31)
|
||||
|
||||
/* Ktimer type */
|
||||
@@ -61,13 +61,13 @@ mr_err_t mr_ktimer_init(mr_ktimer_t *ktimer, const char *name,
|
||||
void *args, mr_tick_t tick);
|
||||
|
||||
/**
|
||||
* @brief This function create a timer.
|
||||
* @brief This function create a ktimer.
|
||||
*
|
||||
* @param name The timer name.
|
||||
* @param entry The timer entry.
|
||||
* @param args The timer args.
|
||||
* @param tick The timer tick.
|
||||
* @return The timer on success, or MR_NULL on failure.
|
||||
* @param name The ktimer name.
|
||||
* @param entry The ktimer entry.
|
||||
* @param args The ktimer args.
|
||||
* @param tick The ktimer tick.
|
||||
* @return The ktimer on success, or MR_NULL on failure.
|
||||
*/
|
||||
mr_ktimer_t *mr_ktimer_create(const char *name,
|
||||
void (*entry)(mr_ktimer_t *ktimer, void *args),
|
||||
@@ -108,6 +108,16 @@ mr_err_t mr_ktimer_stop(mr_ktimer_t *ktimer);
|
||||
*/
|
||||
mr_err_t mr_ktimer_tick_set(mr_ktimer_t *ktimer, mr_tick_t tick);
|
||||
|
||||
/**
|
||||
* @brief This function check if a ktimer is running.
|
||||
*
|
||||
* @param ktimer The ktimer.
|
||||
* @return MR_TRUE if the ktimer is running, MR_FALSE otherwise.
|
||||
*/
|
||||
MR_INLINE mr_bool_t mr_ktimer_is_running(mr_ktimer_t *ktimer) {
|
||||
return mr_klist_is_empty(&ktimer->list);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function find a ktimer.
|
||||
*
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
#include <kernel/mr_initcall.h>
|
||||
#include <kernel/mr_kclock.h>
|
||||
#include <kernel/mr_kfifo.h>
|
||||
#include <kernel/mr_khook.h>
|
||||
#include <kernel/mr_klist.h>
|
||||
#include <kernel/mr_kobject.h>
|
||||
|
||||
@@ -235,16 +235,9 @@ MR_INLINE mr_err_t kobject_add(mr_kobject_t *kobj, mr_kobject_t *parent,
|
||||
return -MR_EEXIST;
|
||||
}
|
||||
|
||||
/* Get parent */
|
||||
parent = mr_kobject_get(parent);
|
||||
if (!parent) {
|
||||
return -MR_ENOENT;
|
||||
}
|
||||
|
||||
/* Allocate name */
|
||||
ret = kobject_name_alloc(kobj, path);
|
||||
if (ret != 0) {
|
||||
mr_kobject_put(parent);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -261,6 +254,12 @@ MR_INLINE mr_err_t kobject_add_varg(mr_kobject_t *kobj, mr_kobject_t *parent,
|
||||
mr_err_t ret;
|
||||
int mask;
|
||||
|
||||
/* Get parent */
|
||||
parent = mr_kobject_get(parent);
|
||||
if (!parent) {
|
||||
return -MR_EINVAL;
|
||||
}
|
||||
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
@@ -284,6 +283,11 @@ MR_INLINE mr_err_t kobject_add_varg(mr_kobject_t *kobj, mr_kobject_t *parent,
|
||||
_exit:
|
||||
/* Unlock */
|
||||
mr_kspinlock_unlock_irqrestore(&klock, mask);
|
||||
|
||||
/* Put parent */
|
||||
if (ret != 0) {
|
||||
mr_kobject_put(parent);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -311,14 +315,12 @@ MR_INLINE void kobject_del(mr_kobject_t *kobj) {
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
/* Already deleted */
|
||||
if (mr_klist_is_empty(&kobj->entry)) {
|
||||
goto _exit;
|
||||
/* Check kobject is deleted */
|
||||
if (!mr_klist_is_empty(&kobj->entry)) {
|
||||
/* Remove kobject from parent */
|
||||
mr_klist_del(&kobj->entry);
|
||||
}
|
||||
|
||||
/* Remove kobject from parent */
|
||||
mr_klist_del(&kobj->entry);
|
||||
_exit:
|
||||
/* Unlock */
|
||||
mr_kspinlock_unlock_irqrestore(&klock, mask);
|
||||
}
|
||||
@@ -344,6 +346,12 @@ MR_INLINE mr_kobject_t *kobject_lookup_varg(mr_kobject_t *parent,
|
||||
mr_err_t ret;
|
||||
int mask;
|
||||
|
||||
/* Get parent */
|
||||
parent = mr_kobject_get(parent);
|
||||
if (!parent) {
|
||||
return MR_NULL;
|
||||
}
|
||||
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
@@ -365,6 +373,9 @@ MR_INLINE mr_kobject_t *kobject_lookup_varg(mr_kobject_t *parent,
|
||||
_exit:
|
||||
/* Unlock */
|
||||
mr_kspinlock_unlock_irqrestore(&klock, mask);
|
||||
|
||||
/* Put parent */
|
||||
mr_kobject_put(parent);
|
||||
return kobj;
|
||||
}
|
||||
|
||||
|
||||
@@ -94,8 +94,9 @@ MR_INLINE void ktimer_del(mr_ktimer_t *ktimer) {
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
/* Remove ktimer from ktimer list */
|
||||
/* Check ktimer is deleted */
|
||||
if (!mr_klist_is_empty(&ktimer->list)) {
|
||||
/* Remove ktimer from timer list */
|
||||
mr_klist_del(&ktimer->list);
|
||||
}
|
||||
|
||||
@@ -118,15 +119,15 @@ mr_err_t mr_ktimer_del(mr_ktimer_t *ktimer) {
|
||||
}
|
||||
|
||||
MR_INLINE void ktimer_insert(mr_ktimer_t *ktimer) {
|
||||
mr_tick_t tick;
|
||||
mr_ktimer_t *t;
|
||||
mr_tick_t tick;
|
||||
mr_klist_t *l;
|
||||
|
||||
/* Set timeout tick */
|
||||
tick = ktimer->init_tick & ~MR_KTIMER_PERIODIC;
|
||||
ktimer->timeout_tick = mr_kclock_tick() + tick;
|
||||
|
||||
/* Insert ktimer into ktimer list */
|
||||
/* Insert ktimer into timer list */
|
||||
MR_KLIST_FOR_EACH(l, &klist) {
|
||||
t = MR_KLIST_ENTRY(l, mr_ktimer_t, list);
|
||||
if ((ktimer->timeout_tick - t->timeout_tick) < (MR_TICK_MAX / 2)) {
|
||||
@@ -148,7 +149,7 @@ MR_INLINE void ktimer_start(mr_ktimer_t *ktimer) {
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
/* Insert ktimer into ktimer list */
|
||||
/* Insert ktimer into timer list */
|
||||
ktimer_insert(ktimer);
|
||||
|
||||
/* Unlock */
|
||||
@@ -183,7 +184,7 @@ MR_INLINE void ktimer_tick_set(mr_ktimer_t *ktimer, mr_tick_t tick) {
|
||||
/* Lock */
|
||||
mask = mr_kspinlock_lock_irqsave(&klock);
|
||||
|
||||
/* Remove ktimer from ktimer list */
|
||||
/* Remove ktimer from timer list */
|
||||
if (!mr_klist_is_empty(&ktimer->list)) {
|
||||
mr_klist_del(&ktimer->list);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user