mirror of https://github.com/ARMmbed/mbed-os.git
ONME-3733 detect xinetd service pattern and generate correct pattern
parent
3d28f7f125
commit
571f0e016b
|
@ -58,15 +58,19 @@ static nsapi_error_t _tcpsocket_connect_to_chargen_srv(TCPSocket &sock)
|
||||||
* \param offset Start pattern from offset
|
* \param offset Start pattern from offset
|
||||||
* \param len Length of pattern to generate.
|
* \param len Length of pattern to generate.
|
||||||
*/
|
*/
|
||||||
static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len)
|
static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len, bool is_xinetd)
|
||||||
{
|
{
|
||||||
|
const int row_size = 74; // Number of chars in single row
|
||||||
|
const int row_count = 95; // Number of rows in pattern after which pattern start from beginning
|
||||||
|
const int chars_scope = is_xinetd ? 93 : 95; // Number of chars from ASCII table used in pattern
|
||||||
|
const char first_char = is_xinetd ? '!' : ' '; // First char from ASCII table used in pattern
|
||||||
while (len--) {
|
while (len--) {
|
||||||
if (offset % 74 == 72) {
|
if (offset % row_size == (row_size - 2)) {
|
||||||
*buf++ = '\r';
|
*buf++ = '\r';
|
||||||
} else if (offset % 74 == 73) {
|
} else if (offset % row_size == (row_size - 1)) {
|
||||||
*buf++ = '\n';
|
*buf++ = '\n';
|
||||||
} else {
|
} else {
|
||||||
*buf++ = ' ' + (offset % 74 + offset / 74) % 95 ;
|
*buf++ = first_char + (offset % row_size + ((offset / row_size) % row_count)) % chars_scope;
|
||||||
}
|
}
|
||||||
offset++;
|
offset++;
|
||||||
}
|
}
|
||||||
|
@ -74,10 +78,14 @@ static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len)
|
||||||
|
|
||||||
static void check_RFC_864_pattern(void *rx_buff, const size_t len, const size_t offset)
|
static void check_RFC_864_pattern(void *rx_buff, const size_t len, const size_t offset)
|
||||||
{
|
{
|
||||||
|
static bool is_xinetd = false;
|
||||||
void *ref_buff = malloc(len);
|
void *ref_buff = malloc(len);
|
||||||
TEST_ASSERT_NOT_NULL(ref_buff);
|
TEST_ASSERT_NOT_NULL(ref_buff);
|
||||||
|
|
||||||
generate_RFC_864_pattern(offset, (uint8_t *)ref_buff, len);
|
if (offset == 0) {
|
||||||
|
is_xinetd = ((uint8_t *)rx_buff)[0] == '!';
|
||||||
|
}
|
||||||
|
generate_RFC_864_pattern(offset, (uint8_t *)ref_buff, len, is_xinetd);
|
||||||
bool match = memcmp(ref_buff, rx_buff, len) == 0;
|
bool match = memcmp(ref_buff, rx_buff, len) == 0;
|
||||||
|
|
||||||
free(ref_buff);
|
free(ref_buff);
|
||||||
|
|
|
@ -408,15 +408,19 @@ static void print_data_as_hex(const uint8_t *buf, int len, int col_width);
|
||||||
* \param offset Start pattern from offset
|
* \param offset Start pattern from offset
|
||||||
* \param len Length of pattern to generate.
|
* \param len Length of pattern to generate.
|
||||||
*/
|
*/
|
||||||
static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len)
|
static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len, bool is_xinetd)
|
||||||
{
|
{
|
||||||
|
const int row_size = 74; // Number of chars in single row
|
||||||
|
const int row_count = 95; // Number of rows in pattern after which pattern start from beginning
|
||||||
|
const int chars_scope = is_xinetd ? 93 : 95; // Number of chars from ASCII table used in pattern
|
||||||
|
const char first_char = is_xinetd ? '!' : ' '; // First char from ASCII table used in pattern
|
||||||
while (len--) {
|
while (len--) {
|
||||||
if (offset % 74 == 72) {
|
if (offset % row_size == (row_size - 2)) {
|
||||||
*buf++ = '\r';
|
*buf++ = '\r';
|
||||||
} else if (offset % 74 == 73) {
|
} else if (offset % row_size == (row_size - 1)) {
|
||||||
*buf++ = '\n';
|
*buf++ = '\n';
|
||||||
} else {
|
} else {
|
||||||
*buf++ = ' ' + (offset % 74 + offset / 74) % 95 ;
|
*buf++ = first_char + (offset % row_size + ((offset / row_size) % row_count)) % chars_scope;
|
||||||
}
|
}
|
||||||
offset++;
|
offset++;
|
||||||
}
|
}
|
||||||
|
@ -424,6 +428,7 @@ static void generate_RFC_864_pattern(size_t offset, uint8_t *buf, size_t len)
|
||||||
|
|
||||||
bool SInfo::check_pattern(void *buffer, size_t len)
|
bool SInfo::check_pattern(void *buffer, size_t len)
|
||||||
{
|
{
|
||||||
|
static bool is_xinetd = false;
|
||||||
if (!_check_pattern) {
|
if (!_check_pattern) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -431,8 +436,14 @@ bool SInfo::check_pattern(void *buffer, size_t len)
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t offset = _receivedTotal;
|
size_t offset = _receivedTotal;
|
||||||
generate_RFC_864_pattern(offset, (uint8_t *)buf, len);
|
|
||||||
|
if (offset == 0) {
|
||||||
|
is_xinetd = ((uint8_t *)buffer)[0] == '!';
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_RFC_864_pattern(offset, (uint8_t *)buf, len, is_xinetd);
|
||||||
bool match = memcmp(buf, buffer, len) == 0;
|
bool match = memcmp(buf, buffer, len) == 0;
|
||||||
if (!match) {
|
if (!match) {
|
||||||
cmd_printf("Pattern check failed\r\nWAS:%.*s\r\nREF:%.*s\r\n", len, (char *)buffer, len, (char *)buf);
|
cmd_printf("Pattern check failed\r\nWAS:%.*s\r\nREF:%.*s\r\n", len, (char *)buffer, len, (char *)buf);
|
||||||
|
|
Loading…
Reference in New Issue