arduino / arduino/ArduinoCore-avr

pinMode() does not check valid pin number

Open
#149 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
1.5k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

The current [pinMode](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_digital.c#L29)() implementation performs a digitalPinToPort(pin) and then checks the port for NOT_A_PORT but [digitalPinToPort](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Arduino.h#L169)() is a program memory table read. It is possible to give an illegal pin number.

Possible correction is:

```
void pinMode(uint8_t pin, uint8_t mode)
{
if (pin >= NUM_DIGITAL_PINS) return;
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg, *out;
...
}
```

Replacing the port check with a pin number check (first).

### Additional context

#### Additional reports

- https://github.com/arduino/ArduinoCore-avr/issues/403
- https://github.com/arduino/Arduino/issues/6297
- https://forum.arduino.cc/t/a6-a7-problem-causes-data-error/1388426

#### Related

- https://github.com/arduino/Arduino/pull/4618
- https://github.com/arduino/Arduino/pull/4649

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in hardware/arduino/avr/cores/arduino/wiring_digital.c at pinMode() and review the NUM_DIGITAL_PINS definition and digitalPinToPort() macro in Arduino.h. Verify that invalid pin numbers are handled before the program-memory table lookup, and confirm that valid pin behavior remains unchanged.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
embedded-iot
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.