Bug Tracker – Attachment #329: Patch for r2714 that implements packet CRC32 checking for bug #773

View | Details | Raw Unified | Return to bug 773
Collapse All | Expand All

(-)common/i_net.cpp (-3 / +101 lines)
Lines 480-489 Link Here
480
        return false;
480
        return false;
481
#endif
481
#endif
482
    }
482
    }
483
    net_message.setcursize(ret);
483
    
484
    SockadrToNetadr (&from, &net_from);
484
    SockadrToNetadr (&from, &net_from);
485
485
486
    return ret;
486
	// total packet size less the CRC
487
	size_t len = ret - sizeof(uint32_t);
488
	
489
	// read the CRC from the packet
490
	byte *crcptr = net_message.ptr() + len;
491
	uint32_t crc = crcptr[0] + (crcptr[1] << 8) + (crcptr[2] << 16) + (crcptr[3] << 24);
492
					
493
	if (crc != I_CalculateCrc32(net_message.ptr(), len))
494
	{
495
		Printf(PRINT_HIGH, "NET_GetPacket: Bad packet CRC\n");
496
		net_message.clear();
497
		return false;
498
	}
499
	
500
	net_message.setcursize(len);
501
	return len;
487
}
502
}
488
503
489
void NET_SendPacket (buf_t &buf, netadr_t &to)
504
void NET_SendPacket (buf_t &buf, netadr_t &to)
Lines 501-508 Link Here
501
516
502
    NetadrToSockadr (&to, &addr);
517
    NetadrToSockadr (&to, &addr);
503
518
504
	ret = sendto (inet_socket, (const char *)buf.ptr(), buf.size(), 0, (struct sockaddr *)&addr, sizeof(addr));
519
	// calculate the CRC for the packet
520
	uint32_t crc = I_CalculateCrc32(buf.ptr(), buf.size());
505
521
522
	// copy the packet data
523
	size_t packetsize = buf.size() + sizeof(crc);
524
	byte packetdata[packetsize];
525
	memcpy(packetdata, buf.ptr(), buf.size());
526
	
527
	// paste the CRC on the end of the data
528
	byte *crcptr = packetdata + buf.size();
529
	crcptr[0] = crc & 0xFF;
530
	crcptr[1] = (crc >> 8) & 0xFF;
531
	crcptr[2] = (crc >> 16) & 0xFF;
532
	crcptr[3] = (crc >> 24) & 0xFF;
533
		
534
	ret = sendto (inet_socket, (const char *)packetdata, packetsize, 0, (struct sockaddr *)&addr, sizeof(addr));
535
506
	buf.clear();
536
	buf.clear();
507
537
508
    if (ret == -1)
538
    if (ret == -1)
Lines 1048-1053 Link Here
1048
   addr.port = htons(port);
1078
   addr.port = htons(port);
1049
}
1079
}
1050
1080
1081
1082
static uint32_t crc32table[] = {
1083
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1084
	0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1085
	0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1086
	0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1087
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1088
	0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1089
	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1090
	0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1091
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1092
	0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1093
	0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1094
	0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1095
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1096
	0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1097
	0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1098
	0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1099
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1100
	0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1101
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1102
	0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1103
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1104
	0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1105
	0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1106
	0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1107
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1108
	0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1109
	0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1110
	0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1111
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1112
	0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1113
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1114
	0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1115
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1116
	0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1117
	0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1118
	0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1119
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1120
	0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1121
	0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1122
	0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1123
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1124
	0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1125
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1126
	0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1127
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1128
	0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1129
	0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1130
	0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1131
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1132
	0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1133
	0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1134
	0x2d02ef8d };
1135
1136
uint32_t I_CalculateCrc32(byte *data, size_t length)
1137
{
1138
	if (!data)
1139
		return 0;
1140
		
1141
	uint32_t crc = 0xffffffff;
1142
	for (size_t i = 0; i < length; i++)
1143
		crc = (crc >> 8) ^ crc32table[(crc & 0xff) ^ data[i]];
1144
1145
	crc ^= 0xffffffff;
1146
	return crc;
1147
}
1148
1051
VERSION_CONTROL (i_net_cpp, "$Id$")
1149
VERSION_CONTROL (i_net_cpp, "$Id$")
1052
1150
1053
1151
(-)common/i_net.h (+2 lines)
Lines 553-558 Link Here
553
bool MSG_DecompressAdaptive (huffman &huff);
553
bool MSG_DecompressAdaptive (huffman &huff);
554
bool MSG_CompressAdaptive (huffman &huff, buf_t &buf, size_t start_offset, size_t write_gap);
554
bool MSG_CompressAdaptive (huffman &huff, buf_t &buf, size_t start_offset, size_t write_gap);
555
555
556
uint32_t I_CalculateCrc32(byte *data, size_t length);
557
556
#endif
558
#endif
557
559
558
560

Return to bug 773