mirror of https://github.com/ArduPilot/ardupilot
AP_RCProtocol: added random data test
this triggers the CRSF crash bug that was just fixed
This commit is contained in:
parent
427384eb11
commit
5a2f711d85
|
@ -276,7 +276,7 @@ bool AP_RCProtocol_CRSF::check_frame(uint32_t timestamp_us)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_frame.length + CRSF_HEADER_LEN < _frame_ofs) {
|
if (_frame.length < CRSF_FRAME_LENGTH_MIN) {
|
||||||
// invalid short frame
|
// invalid short frame
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,12 @@
|
||||||
#include <AP_VideoTX/AP_VideoTX.h>
|
#include <AP_VideoTX/AP_VideoTX.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
void setup();
|
void setup();
|
||||||
void loop();
|
void loop();
|
||||||
|
|
||||||
|
@ -280,6 +286,39 @@ static bool test_protocol_bytesonly(const char *name, uint32_t baudrate,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
test with random data
|
||||||
|
*/
|
||||||
|
static void test_random(void)
|
||||||
|
{
|
||||||
|
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL
|
||||||
|
const uint32_t baudrates[] = { 115200, 100000, 416666, 420000 };
|
||||||
|
const uint32_t test_bytes = 1000000;
|
||||||
|
int fd = open("/dev/urandom", O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
printf("Can't open /dev/urandom\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint8_t *buf = (uint8_t *)malloc(test_bytes);
|
||||||
|
for (const auto b : baudrates) {
|
||||||
|
printf("Testing random with baud %u\n", unsigned(b));
|
||||||
|
rcprot = new AP_RCProtocol();
|
||||||
|
rcprot->init();
|
||||||
|
if (::read(fd, buf, test_bytes) != test_bytes) {
|
||||||
|
printf("Failed to read from /dev/urandom\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (uint32_t i=0; i<test_bytes; i++) {
|
||||||
|
rcprot->process_byte(buf[i], b);
|
||||||
|
}
|
||||||
|
delete rcprot;
|
||||||
|
rcprot = nullptr;
|
||||||
|
}
|
||||||
|
free(buf);
|
||||||
|
close(fd);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
//Main loop where the action takes place
|
//Main loop where the action takes place
|
||||||
#pragma GCC diagnostic error "-Wframe-larger-than=2000"
|
#pragma GCC diagnostic error "-Wframe-larger-than=2000"
|
||||||
void loop()
|
void loop()
|
||||||
|
@ -479,6 +518,11 @@ void loop()
|
||||||
test_protocol("FPORT2_16CH", 115200, fport2_16ch_bytes, sizeof(fport2_16ch_bytes), fport2_16ch_output, ARRAY_SIZE(fport2_16ch_output), 3, 0, true);
|
test_protocol("FPORT2_16CH", 115200, fport2_16ch_bytes, sizeof(fport2_16ch_bytes), fport2_16ch_output, ARRAY_SIZE(fport2_16ch_output), 3, 0, true);
|
||||||
test_protocol("FPORT2_24CH", 115200, fport2_24ch_bytes, sizeof(fport2_24ch_bytes), fport2_24ch_output, ARRAY_SIZE(fport2_24ch_output), 3, 0, true);
|
test_protocol("FPORT2_24CH", 115200, fport2_24ch_bytes, sizeof(fport2_24ch_bytes), fport2_24ch_output, ARRAY_SIZE(fport2_24ch_output), 3, 0, true);
|
||||||
|
|
||||||
|
/*
|
||||||
|
now test with random data to ensure we don't have any logic bugs that can cause a crash of the parser
|
||||||
|
*/
|
||||||
|
test_random();
|
||||||
|
|
||||||
if (test_count++ == 10) {
|
if (test_count++ == 10) {
|
||||||
if (test_failures == 0) {
|
if (test_failures == 0) {
|
||||||
printf("Test PASSED\n");
|
printf("Test PASSED\n");
|
||||||
|
|
Loading…
Reference in New Issue