Skip to content

Commit

Permalink
Bounds checking on g_pin_cfg array
Browse files Browse the repository at this point in the history
As I mentioned in the forum thread:
https://forum.arduino.cc/t/apis-like-digitalwrite-who-use-g-pinc-cfg-should-do-bounds-checking/1156322

I believe that many of the simple functions should have some form of parameter testing.  For example: pinMode(100, OUTPUT);
Should fail instead of trying to use random garbage off the end of the array to pass down to the next level.

As @per1234 mentioned on the forum thread.  This has bounced around for years:
arduino/ArduinoCore-avr#302

So decided to at least try to do it for a few of the APIs that have this issue.  Most of the other references to this array appear to either check or are driven by pin information in definded in the variant.
  • Loading branch information
KurtE committed Aug 10, 2023
1 parent 1c9b086 commit b99ae79
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 0 deletions.
1 change: 1 addition & 0 deletions cores/arduino/analog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,7 @@ void analogWrite(pin_size_t pinNumber, int value)

if(ptr != nullptr) {
//check the pinmux in case it's been modified by a call to pinMode()
if (pinNumber >= (g_pin_cfg_size / sizeof(g_pin_cfg[0]))) return; /* pinNumber > sizeof of pin table */
bool has_peripheral_mux = R_PFS->PORT[g_pin_cfg[pinNumber].pin >> IOPORT_PRV_PORT_OFFSET].PIN[g_pin_cfg[pinNumber].pin & BSP_IO_PRV_8BIT_MASK].PmnPFS & IOPORT_CFG_PERIPHERAL_PIN;
if (!has_peripheral_mux) {
ptr->end();
Expand Down
3 changes: 3 additions & 0 deletions cores/arduino/digital.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "Arduino.h"

void pinMode(pin_size_t pin, const PinMode mode) {
if (pin >= (g_pin_cfg_size / sizeof(g_pin_cfg[0]))) return; /* pinNumber > sizeof of pin table */
switch (mode) {
case INPUT:
case INPUT_PULLDOWN: // TODO: document the INPUT_PULLDOWN is unavailable
Expand All @@ -19,10 +20,12 @@ void pinMode(pin_size_t pin, const PinMode mode) {
}

void digitalWrite(pin_size_t pin, PinStatus val) {
if (pin >= (g_pin_cfg_size / sizeof(g_pin_cfg[0]))) return; /* pinNumber > sizeof of pin table */
R_IOPORT_PinWrite(NULL, g_pin_cfg[pin].pin, val == LOW ? BSP_IO_LEVEL_LOW : BSP_IO_LEVEL_HIGH);
}

PinStatus digitalRead(pin_size_t pin) {
if (pin >= (g_pin_cfg_size / sizeof(g_pin_cfg[0]))) return LOW; /* pinNumber > sizeof of pin table */
bsp_io_level_t ret;
R_IOPORT_PinRead(NULL, g_pin_cfg[pin].pin, &ret);
return (ret == BSP_IO_LEVEL_LOW ? LOW : HIGH);
Expand Down

0 comments on commit b99ae79

Please sign in to comment.