Skip to content

Commit bfd0d0a

Browse files
authored
Merge pull request #138 from fprwi6labs/fix_spi_memory_leak
Fix SPI memory leak
2 parents 22eb2bf + 55220f6 commit bfd0d0a

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

libraries/SPI/src/SPI.cpp

+17-16
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void SPIClass::begin(uint8_t _pin)
5757
return;
5858

5959
idx = pinIdx(_pin, ADD_NEW_PIN);
60-
if(idx == NB_SPI_SETTINGS)
60+
if(idx >= NB_SPI_SETTINGS)
6161
return;
6262

6363
if((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
@@ -93,7 +93,7 @@ void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings)
9393
return;
9494

9595
idx = pinIdx(_pin, ADD_NEW_PIN);
96-
if(idx == NB_SPI_SETTINGS) {
96+
if(idx >= NB_SPI_SETTINGS) {
9797
return;
9898
}
9999

@@ -139,7 +139,7 @@ void SPIClass::setBitOrder(uint8_t _pin, BitOrder _bitOrder)
139139
return;
140140

141141
uint8_t idx = pinIdx(_pin, GET_IDX);
142-
if(idx == NB_SPI_SETTINGS) {
142+
if(idx >= NB_SPI_SETTINGS) {
143143
return;
144144
}
145145

@@ -162,7 +162,7 @@ void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode)
162162
return;
163163

164164
uint8_t idx = pinIdx(_pin, GET_IDX);
165-
if(idx == NB_SPI_SETTINGS) {
165+
if(idx >= NB_SPI_SETTINGS) {
166166
return;
167167
}
168168

@@ -191,7 +191,7 @@ void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider)
191191
return;
192192

193193
uint8_t idx = pinIdx(_pin, GET_IDX);
194-
if(idx == NB_SPI_SETTINGS) {
194+
if(idx >= NB_SPI_SETTINGS) {
195195
return;
196196
}
197197

@@ -234,7 +234,7 @@ byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode)
234234

235235
if(_pin != _CSpin) {
236236
uint8_t idx = pinIdx(_pin, GET_IDX);
237-
if(idx == NB_SPI_SETTINGS) {
237+
if(idx >= NB_SPI_SETTINGS) {
238238
return rx_buffer;
239239
}
240240
spi_init(&_spi, spiSettings[idx].clk,
@@ -262,22 +262,23 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
262262
if (_pin > NUM_DIGITAL_PINS)
263263
return rx_buffer;
264264

265-
if (spiSettings[_pin].msb) {
266-
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
267-
data = tmp;
265+
uint8_t idx = pinIdx(_pin, GET_IDX);
266+
if(idx >= NB_SPI_SETTINGS) {
267+
return rx_buffer;
268268
}
269269

270270
if(_pin != _CSpin) {
271-
uint8_t idx = pinIdx(_pin, GET_IDX);
272-
if(idx == NB_SPI_SETTINGS) {
273-
return rx_buffer;
274-
}
275271
spi_init(&_spi, spiSettings[idx].clk,
276272
spiSettings[idx].dMode,
277273
spiSettings[idx].msb);
278274
_CSpin = _pin;
279275
}
280276

277+
if (spiSettings[idx].msb) {
278+
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
279+
data = tmp;
280+
}
281+
281282
if((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC))
282283
digitalWrite(_pin, LOW);
283284

@@ -286,7 +287,7 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
286287
if((_pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC))
287288
digitalWrite(_pin, HIGH);
288289

289-
if (spiSettings[_pin].msb) {
290+
if (spiSettings[idx].msb) {
290291
tmp = ((rx_buffer & 0xff00) >> 8) | ((rx_buffer & 0xff) << 8);
291292
rx_buffer = tmp;
292293
}
@@ -301,7 +302,7 @@ void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode
301302

302303
if(_pin != _CSpin) {
303304
uint8_t idx = pinIdx(_pin, GET_IDX);
304-
if(idx == NB_SPI_SETTINGS) {
305+
if(idx >= NB_SPI_SETTINGS) {
305306
return;
306307
}
307308
spi_init(&_spi, spiSettings[idx].clk,
@@ -326,7 +327,7 @@ void SPIClass::transfer(byte _pin, void *_bufout, void *_bufin, size_t _count, S
326327

327328
if(_pin != _CSpin) {
328329
uint8_t idx = pinIdx(_pin, GET_IDX);
329-
if(idx == NB_SPI_SETTINGS) {
330+
if(idx >= NB_SPI_SETTINGS) {
330331
return;
331332
}
332333
spi_init(&_spi, spiSettings[idx].clk,

0 commit comments

Comments
 (0)