Skip to content

Commit b1c78c5

Browse files
fixed memory leak in string buffer
1 parent 1bb88b1 commit b1c78c5

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

Firmata.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ void FirmataClass::processSysexMessage(void)
181181
j++;
182182
}
183183
(*currentStringCallback)(buffer);
184+
free(buffer);
185+
buffer = 0;
184186
}
185187
break;
186188
default:

examples/EchoString/EchoString.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void sysexCallback(byte command, byte argc, byte*argv)
2828

2929
void setup()
3030
{
31-
Firmata.setFirmwareVersion(0, 1);
31+
Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);
3232
Firmata.attach(STRING_DATA, stringCallback);
3333
Firmata.attach(START_SYSEX, sysexCallback);
3434
Firmata.begin(57600);

test/unit/firmata_test/firmata_test.ino

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,6 @@ void loop()
1818
Test::run();
1919
}
2020

21-
// Note: this test required adding a method (Firmata.unsetFirmwareVersion()) to
22-
// Firmata.cpp solely for the purpose of running this test. The method has been
23-
// removed from Firmata.cpp, but keeping the test here as a recored
24-
// test(setFirmwareVersionDoesNotLeakMemory)
25-
// {
26-
// Firmata.setFirmwareVersion(1, 0);
27-
// int initialMemory = freeMemory();
28-
29-
// Firmata.setFirmwareVersion(1, 0);
30-
31-
// assertEquals(0, initialMemory - freeMemory());
32-
33-
// Firmata.unsetFirmwareVersion();
34-
// }
35-
3621
test(beginPrintsVersion)
3722
{
3823
FakeStream stream;
@@ -61,6 +46,10 @@ void processMessage(const byte* message, size_t length)
6146
}
6247
}
6348

49+
void stringCallback(char *myString)
50+
{
51+
}
52+
6453
byte _digitalPort;
6554
int _digitalPortValue;
6655
void writeToDigitalPort(byte port, int value)
@@ -140,3 +129,28 @@ test(specifiedDigitalWritePort)
140129

141130
assertEqual(1, _digitalPort);
142131
}
132+
133+
test(stringDataDoesNotLeakMemory)
134+
{
135+
Firmata.attach(STRING_DATA, stringCallback);
136+
137+
int initialMemory = freeMemory();
138+
139+
byte stringMsg[] = { START_SYSEX, STRING_DATA, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, END_SYSEX };
140+
141+
for (int i = 0; i < 4; i++) {
142+
processMessage(stringMsg, 13);
143+
}
144+
145+
assertEqual(0, initialMemory - freeMemory());
146+
}
147+
148+
test(setFirmwareVersionDoesNotLeakMemory)
149+
{
150+
Firmata.setFirmwareVersion(1, 0);
151+
int initialMemory = freeMemory();
152+
153+
Firmata.setFirmwareVersion(1, 0);
154+
155+
assertEqual(0, initialMemory - freeMemory());
156+
}

0 commit comments

Comments
 (0)