Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 6517888

Browse files
authored
mods/utime.c: avoid overrun exception in ticks_diff()
Revert changes to ticks_diff() and the addition of ticks_add()
1 parent b8576cd commit 6517888

File tree

1 file changed

+10
-20
lines changed

1 file changed

+10
-20
lines changed

esp32/mods/modutime.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,41 +155,31 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_sleep_us_obj, time_sleep_us);
155155
STATIC mp_obj_t time_ticks_ms(void) {
156156
struct timeval tv;
157157
gettimeofday(&tv, NULL);
158-
return mp_obj_new_int_from_uint(((tv.tv_sec * 1000) + tv.tv_usec / 1000)
159-
& (MICROPY_PY_UTIME_TICKS_PERIOD - 1));
158+
return mp_obj_new_int_from_uint(((tv.tv_sec * 1000) + tv.tv_usec / 1000));
160159
}
161160
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_ms_obj, time_ticks_ms);
162161

163162
STATIC mp_obj_t time_ticks_us(void) {
164-
return mp_obj_new_int_from_uint(system_get_rtc_time()
165-
& (MICROPY_PY_UTIME_TICKS_PERIOD - 1));
163+
return mp_obj_new_int_from_uint(system_get_rtc_time());
166164
}
167165
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_us_obj, time_ticks_us);
168166

169167
STATIC mp_obj_t time_ticks_cpu(void) {
170-
return mp_obj_new_int_from_uint(get_timer_counter_value()
171-
& (MICROPY_PY_UTIME_TICKS_PERIOD - 1));
168+
return mp_obj_new_int_from_uint(get_timer_counter_value());
172169
}
173170
STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_ticks_cpu_obj, time_ticks_cpu);
174171

175172
STATIC mp_obj_t time_ticks_diff(mp_obj_t start_in, mp_obj_t end_in) {
176-
// we assume that the arguments come from ticks_xx so are small ints
177-
mp_uint_t start = MP_OBJ_SMALL_INT_VALUE(start_in);
178-
mp_uint_t end = MP_OBJ_SMALL_INT_VALUE(end_in);
179-
// Optimized formula avoiding if conditions. We adjust difference "forward",
180-
// wrap it around and adjust back.
181-
mp_int_t diff = ((end - start + MICROPY_PY_UTIME_TICKS_PERIOD / 2)
182-
& (MICROPY_PY_UTIME_TICKS_PERIOD - 1))
183-
- MICROPY_PY_UTIME_TICKS_PERIOD / 2;
184-
return MP_OBJ_NEW_SMALL_INT(diff);
173+
int32_t start = mp_obj_get_int_truncated(start_in);
174+
int32_t end = mp_obj_get_int_truncated(end_in);
175+
return mp_obj_new_int((end - start));
185176
}
186177
STATIC MP_DEFINE_CONST_FUN_OBJ_2(time_ticks_diff_obj, time_ticks_diff);
187178

188-
STATIC mp_obj_t time_ticks_add(mp_obj_t ticks_in, mp_obj_t delta_in) {
189-
// we assume that first argument come from ticks_xx so is small int
190-
mp_uint_t ticks = MP_OBJ_SMALL_INT_VALUE(ticks_in);
191-
mp_uint_t delta = mp_obj_get_int(delta_in);
192-
return MP_OBJ_NEW_SMALL_INT((ticks + delta) & (MICROPY_PY_UTIME_TICKS_PERIOD - 1));
179+
STATIC mp_obj_t time_ticks_add(mp_obj_t start_in, mp_obj_t delta_in) {
180+
uint32_t start = mp_obj_get_int_truncated(start_in);
181+
uint32_t delta = mp_obj_get_int_truncated(delta_in);
182+
return mp_obj_new_int_from_uint((start + delta));
193183
}
194184
STATIC MP_DEFINE_CONST_FUN_OBJ_2(time_ticks_add_obj, time_ticks_add);
195185

0 commit comments

Comments
 (0)