Skip to content

Commit a1b710e

Browse files
authored
🐛 Fix table index out of range in interrupt primitive (#188)
1 parent 1d0eef5 commit a1b710e

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

src/Primitives/arduino.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ ISREntry ISRs[ALL_ISRS];
6565
int isr_index = 0;
6666

6767
/* Private macro to install an ISR */
68-
#define install_isr(number) \
69-
{ \
70-
dbg_info("installing isr number: %d of %d with name: %s\n", \
71-
isr_index + 1, ALL_ISRS, isr_##number); \
72-
if (isr_index < ALL_ISRS) { \
73-
ISREntry *p = &ISRs[isr_index++]; \
74-
p->pin = number; \
75-
p->ISR_callback = &(isr_##number); \
76-
} else { \
77-
FATAL("isr_index out of bounds"); \
78-
} \
68+
#define install_isr(number) \
69+
{ \
70+
dbg_info("installing isr number: %d of %d with name: %s\n", \
71+
isr_index + 1, ALL_ISRS, isr_##number); \
72+
if (isr_index < ALL_ISRS) { \
73+
ISREntry *p = &ISRs[isr_index++]; \
74+
p->pin = number; \
75+
p->ISR_callback = &(isr_##number); \
76+
} else { \
77+
FATAL("isr_index out of bounds"); \
78+
} \
7979
}
8080

8181
#define INTERRUPT_TOPIC_PREFIX "interrupt_"
@@ -610,7 +610,12 @@ def_prim(subscribe_interrupt, threeToNoneU32) {
610610

611611
int index = resolve_isr(pin);
612612
if (index < 0) {
613-
dbg_info("subscribe_interrupt: no ISR found for pin %i", pin);
613+
dbg_info("subscribe_interrupt: no ISR found for pin %i\n", pin);
614+
return false;
615+
}
616+
617+
if (tidx < 0 || m->table.size < tidx) {
618+
dbg_info("subscribe_interrupt: out of range table index %i\n", tidx);
614619
return false;
615620
}
616621

src/Primitives/emulated.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,12 @@ def_prim(subscribe_interrupt, threeToNoneU32) {
438438
uint8_t mode = arg0.uint32;
439439

440440
debug("EMU: subscribe_interrupt(%u, %u, %u) \n", pin, tidx, mode);
441+
442+
if (tidx < 0 || m->table.size < tidx) {
443+
debug("subscribe_interrupt: out of range table index %i\n", tidx);
444+
return false;
445+
}
446+
441447
std::string topic = "interrupt_";
442448
topic.append(std::to_string(pin));
443449

0 commit comments

Comments
 (0)