@@ -378,7 +378,6 @@ udp_print(register const u_char *bp, u_int length,
378
378
else
379
379
ip6 = NULL ;
380
380
#endif /*INET6*/
381
- cp = (u_char * )(up + 1 );
382
381
if (!TTEST (up -> uh_dport )) {
383
382
udpipaddr_print (ip , -1 , -1 );
384
383
(void )printf ("[|udp]" );
@@ -393,20 +392,24 @@ udp_print(register const u_char *bp, u_int length,
393
392
(void )printf ("truncated-udp %d" , length );
394
393
return ;
395
394
}
396
- length -= sizeof (struct udphdr );
397
-
398
- if (cp > snapend ) {
395
+ ulen = EXTRACT_16BITS (& up -> uh_ulen );
396
+ if (ulen < sizeof (struct udphdr )) {
399
397
udpipaddr_print (ip , sport , dport );
400
- ( void ) printf ("[|udp]" );
398
+ printf ("truncated-udplength %d" , ulen );
401
399
return ;
402
400
}
401
+ ulen -= sizeof (struct udphdr );
402
+ length -= sizeof (struct udphdr );
403
+ if (ulen < length )
404
+ length = ulen ;
403
405
404
- ulen = EXTRACT_16BITS ( & up -> uh_ulen );
405
- if (ulen < 8 ) {
406
+ cp = ( u_char * )( up + 1 );
407
+ if (cp > snapend ) {
406
408
udpipaddr_print (ip , sport , dport );
407
- ( void ) printf ("truncated-udplength %d" , ulen );
409
+ printf ("[|udp]" );
408
410
return ;
409
411
}
412
+
410
413
if (packettype ) {
411
414
register struct sunrpc_msg * rp ;
412
415
enum sunrpc_msg_type direction ;
@@ -682,12 +685,23 @@ udp_print(register const u_char *bp, u_int length,
682
685
otv_print ((const u_char * )(up + 1 ), length );
683
686
else if (ISPORT (VXLAN_PORT ))
684
687
vxlan_print ((const u_char * )(up + 1 ), length );
685
- else
686
- (void )printf ("UDP , length %u ",
687
- (u_int32_t )(ulen - sizeof (* up )));
688
+ else {
689
+ if (ulen > length )
690
+ printf ("UDP, bad length %u > %u" ,
691
+ ulen , length );
692
+ else
693
+ printf ("UDP, length %u" ,
694
+ (uint32_t )(ulen - sizeof (* up )));
695
+ }
688
696
#undef ISPORT
689
- } else
690
- (void )printf ("UDP , length %u ", (u_int32_t )(ulen - sizeof (* up )));
697
+ } else {
698
+ if (ulen > length )
699
+ printf ("UDP, bad length %u > %u" ,
700
+ ulen , length );
701
+ else
702
+ printf ("UDP, length %u" ,
703
+ (uint32_t )(ulen - sizeof (* up )));
704
+ }
691
705
}
692
706
693
707
0 commit comments