Check padding
This commit is contained in:
parent
1f179e8b2b
commit
43540d51bc
1 changed files with 30 additions and 4 deletions
30
ethermess.c
30
ethermess.c
|
@ -233,6 +233,20 @@ void read_command(void) {
|
|||
}
|
||||
}
|
||||
|
||||
bool check_padding(const unsigned char *data, size_t index, size_t data_length) {
|
||||
// Valid padding is all zero bytes
|
||||
assert(index <= data_length);
|
||||
for (size_t i = index; i < data_length; i++) {
|
||||
if (data[i] != 0) {
|
||||
// Check failed
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check succeeded
|
||||
return true;
|
||||
}
|
||||
|
||||
void handle_status(const unsigned char source_mac[6], const unsigned char *data, size_t data_length) {
|
||||
if (data_length < 2) {
|
||||
// Too short
|
||||
|
@ -259,6 +273,11 @@ void handle_status(const unsigned char source_mac[6], const unsigned char *data,
|
|||
unsigned char nick[256];
|
||||
memcpy(nick, &data[2], nick_length);
|
||||
|
||||
if (!check_padding(data, 2 + nick_length, data_length)) {
|
||||
// Malformed padding
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: check that nick is valid utf-8 with no control chars
|
||||
|
||||
char mac[18];
|
||||
|
@ -303,6 +322,11 @@ void handle_msgid(const unsigned char source_mac[6], const unsigned char *data,
|
|||
|
||||
uint16_t msgid = data[0] << 8 | data[1];
|
||||
|
||||
if (!check_padding(data, 2, data_length)) {
|
||||
// Malformed padding
|
||||
return;
|
||||
}
|
||||
|
||||
ssize_t cache_index = msgid_cache_lookup(source_mac);
|
||||
if (cache_index == -1) {
|
||||
// Not in the cache, so add it there
|
||||
|
@ -375,7 +399,9 @@ void process_frame(void) {
|
|||
// Process the packet based on the packet type
|
||||
switch (packet_type) {
|
||||
case EMT_STATUS_REQUEST:
|
||||
if (check_padding(&frame[16], 0, packet_length - 16)) {
|
||||
send_status(source_mac);
|
||||
}
|
||||
break;
|
||||
|
||||
case EMT_STATUS:
|
||||
|
@ -383,7 +409,9 @@ void process_frame(void) {
|
|||
break;
|
||||
|
||||
case EMT_MSGID_REQUEST:
|
||||
if (check_padding(&frame[16], 0, packet_length - 16)) {
|
||||
send_msgid(source_mac);
|
||||
}
|
||||
break;
|
||||
|
||||
case EMT_MSGID:
|
||||
|
@ -393,8 +421,6 @@ void process_frame(void) {
|
|||
default:
|
||||
fprintf(stderr, "Ignoring packet of type %i\n", packet_type);
|
||||
}
|
||||
|
||||
// TODO: Check that padding, if any, is all zeroes
|
||||
}
|
||||
|
||||
void eventloop(void) {
|
||||
|
|
Loading…
Reference in a new issue