/************************************************************************** Sanity check packet **************************************************************************/ bool packet_check(struct data_in *din, struct connection *pc) { size_t rem = dio_input_remaining(din); if (rem > 0) { int type, len; dio_input_rewind(din); dio_get_type(din, pc->packet_header.length, &len); dio_get_type(din, pc->packet_header.type, &type); log_packet("received long packet (type %d, len %d, rem %lu) from %s", type, len, (unsigned long) rem, conn_description (pc)); return FALSE; } return TRUE; }
/************************************************************************** ... **************************************************************************/ void check_packet(struct data_in *din, struct connection *pc) { size_t rem = dio_input_remaining(din); if (din->bad_string || din->bad_bit_string || rem != 0) { char from[MAX_LEN_ADDR + MAX_LEN_NAME + 128]; int type, len; assert(pc != NULL); my_snprintf(from, sizeof(from), " from %s", conn_description(pc)); dio_input_rewind(din); dio_get_uint16(din, &len); dio_get_uint8(din, &type); if (din->bad_string) { freelog(LOG_ERROR, "received bad string in packet (type %d, len %d)%s", type, len, from); } if (din->bad_bit_string) { freelog(LOG_ERROR, "received bad bit string in packet (type %d, len %d)%s", type, len, from); } if (din->too_short) { freelog(LOG_ERROR, "received short packet (type %d, len %d)%s", type, len, from); } if (rem > 0) { /* This may be ok, eg a packet from a newer version with extra info * which we should just ignore */ freelog(LOG_VERBOSE, "received long packet (type %d, len %d, rem %lu)%s", type, len, (unsigned long)rem, from); } } }