diff options
Diffstat (limited to 'src/qcommon/net_chan.c')
| -rw-r--r-- | src/qcommon/net_chan.c | 27 | 
1 files changed, 21 insertions, 6 deletions
diff --git a/src/qcommon/net_chan.c b/src/qcommon/net_chan.c index 4aacfa7e..d9c6760b 100644 --- a/src/qcommon/net_chan.c +++ b/src/qcommon/net_chan.c @@ -84,7 +84,8 @@ Netchan_Setup  called to open a channel to a remote system  ==============  */ -void Netchan_Setup( netsrc_t sock, netchan_t *chan, netadr_t adr, int qport ) { +void Netchan_Setup(netsrc_t sock, netchan_t *chan, netadr_t adr, int qport, int challenge) +{  	Com_Memset (chan, 0, sizeof(*chan));  	chan->sock = sock; @@ -92,6 +93,7 @@ void Netchan_Setup( netsrc_t sock, netchan_t *chan, netadr_t adr, int qport ) {  	chan->qport = qport;  	chan->incomingSequence = 0;  	chan->outgoingSequence = 1; +	chan->challenge = challenge;  }  // TTimo: unused, commenting out to make gcc happy @@ -191,17 +193,21 @@ void Netchan_TransmitNextFragment( netchan_t *chan ) {  	msg_t		send;  	byte		send_buf[MAX_PACKETLEN];  	int			fragmentLength; +	int			outgoingSequence;  	// write the packet header  	MSG_InitOOB (&send, send_buf, sizeof(send_buf));				// <-- only do the oob here -	MSG_WriteLong( &send, chan->outgoingSequence | FRAGMENT_BIT ); +	outgoingSequence = chan->outgoingSequence | FRAGMENT_BIT; +	MSG_WriteLong(&send, outgoingSequence);  	// send the qport if we are a client  	if ( chan->sock == NS_CLIENT ) {  		MSG_WriteShort( &send, qport->integer );  	} +	MSG_WriteLong(&send, NETCHAN_GENCHECKSUM(chan->challenge, chan->outgoingSequence)); +  	// copy the reliable message to the packet first  	fragmentLength = FRAGMENT_SIZE;  	if ( chan->unsentFragmentStart  + fragmentLength > chan->unsentLength ) { @@ -269,12 +275,14 @@ void Netchan_Transmit( netchan_t *chan, int length, const byte *data ) {  	MSG_InitOOB (&send, send_buf, sizeof(send_buf));  	MSG_WriteLong( &send, chan->outgoingSequence ); -	chan->outgoingSequence++;  	// send the qport if we are a client -	if ( chan->sock == NS_CLIENT ) { -		MSG_WriteShort( &send, qport->integer ); -	} +	if(chan->sock == NS_CLIENT) +		MSG_WriteShort(&send, qport->integer); + +	MSG_WriteLong(&send, NETCHAN_GENCHECKSUM(chan->challenge, chan->outgoingSequence)); + +	chan->outgoingSequence++;  	MSG_WriteData( &send, data, length ); @@ -306,6 +314,7 @@ qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) {  	int			sequence;  	int			qport;  	int			fragmentStart, fragmentLength; +	int			checksum;  	qboolean	fragmented;  	// XOR unscramble all data in the packet after the header @@ -328,6 +337,12 @@ qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) {  		qport = MSG_ReadShort( msg );  	} +	checksum = MSG_ReadLong(msg); + +	// UDP spoofing protection +	if(NETCHAN_GENCHECKSUM(chan->challenge, sequence) != checksum) +		return qfalse; +  	// read the fragment information  	if ( fragmented ) {  		fragmentStart = MSG_ReadShort( msg );  | 
