diff options
| author | geniusgogo <[email protected]> | 2023-02-27 09:59:45 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-02-27 09:59:45 +0800 |
| commit | ab7ab19be52f2993b15fcbc9e0aa545c5ce333ec (patch) | |
| tree | 797879d51b675159ead3946ee4f78304b329e894 | |
| parent | cdd2755bbdaa6f17c4275daa991c9cecaffc80fe (diff) | |
fixed ctime timer_delete timerid parameter check. (#6977)
* fixed ctime timer_delete timerid parameter check.
| -rw-r--r-- | components/libc/compilers/common/ctime.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c index 7e182b5ba9..19cd789bed 100644 --- a/components/libc/compilers/common/ctime.c +++ b/components/libc/compilers/common/ctime.c @@ -967,9 +967,15 @@ void timer_id_unlock() rt_hw_spin_unlock(&_timer_id_lock); } -struct timer_obj *timer_id_get(int timerid) +struct timer_obj *timer_id_get(rt_ubase_t timerid) { struct timer_obj *timer; + + if (timerid < 0 || timerid >= TIMER_ID_MAX) + { + return NULL; + } + timer_id_lock(); if (_g_timerid[timerid] == NULL) { @@ -1071,16 +1077,26 @@ RTM_EXPORT(timer_create); int timer_delete(timer_t timerid) { struct timer_obj *timer; + rt_ubase_t ktimerid; + + ktimerid = (rt_ubase_t)timerid; + + if (ktimerid < 0 || ktimerid >= TIMER_ID_MAX) + { + rt_set_errno(EINVAL); + return -1; + } + timer_id_lock(); - if (_g_timerid[(rt_ubase_t)timerid] == NULL) + if (_g_timerid[ktimerid] == NULL) { timer_id_unlock(); rt_set_errno(EINVAL); LOG_E("can not find timer!"); return -1; } - timer = _g_timerid[(rt_ubase_t)timerid]; - timer_id_put((rt_ubase_t)timerid); + timer = _g_timerid[ktimerid]; + timer_id_put(ktimerid); timer_id_unlock(); if (timer == RT_NULL) { @@ -1132,9 +1148,11 @@ int timer_getoverrun(timer_t timerid) */ int timer_gettime(timer_t timerid, struct itimerspec *its) { - struct timer_obj *timer = timer_id_get((rt_ubase_t)timerid); + struct timer_obj *timer; rt_uint32_t seconds, nanoseconds; + timer = timer_id_get((rt_ubase_t)timerid); + if (timer == NULL) { rt_set_errno(EINVAL); |
