@@ -294,15 +294,23 @@ bool prepare_tcp_segment(
294
294
}
295
295
296
296
297
+ // padlen<0 means payload shrinking
297
298
bool prepare_udp_segment4 (
298
299
const struct sockaddr_in * src , const struct sockaddr_in * dst ,
299
300
uint8_t ttl ,
300
301
uint8_t fooling ,
301
- uint16_t padlen ,
302
+ int padlen ,
302
303
const void * data , uint16_t len ,
303
304
uint8_t * buf , size_t * buflen )
304
305
{
305
- uint16_t datalen = len + padlen ;
306
+ if ((len + padlen )<=0 ) padlen = - (int )len + 1 ; // do not allow payload to be less that 1 byte
307
+ if ((len + padlen )> 0xFFFF ) padlen = 0xFFFF - len ; // do not allow payload size to exceed u16 range
308
+ if (padlen < 0 )
309
+ {
310
+ len += padlen ;
311
+ padlen = 0 ;
312
+ }
313
+ uint16_t datalen = (uint16_t )(len + padlen );
306
314
uint16_t ip_payload_len = sizeof (struct udphdr ) + datalen ;
307
315
uint16_t pktlen = sizeof (struct ip ) + ip_payload_len ;
308
316
if (pktlen > * buflen ) return false;
@@ -327,11 +335,18 @@ bool prepare_udp_segment6(
327
335
const struct sockaddr_in6 * src , const struct sockaddr_in6 * dst ,
328
336
uint8_t ttl ,
329
337
uint8_t fooling ,
330
- uint16_t padlen ,
338
+ int padlen ,
331
339
const void * data , uint16_t len ,
332
340
uint8_t * buf , size_t * buflen )
333
341
{
334
- uint16_t datalen = len + padlen ;
342
+ if ((len + padlen )<=0 ) padlen = - (int )len + 1 ; // do not allow payload to be less that 1 byte
343
+ if ((len + padlen )> 0xFFFF ) padlen = 0xFFFF - len ; // do not allow payload size to exceed u16 range
344
+ if (padlen < 0 )
345
+ {
346
+ len += padlen ;
347
+ padlen = 0 ;
348
+ }
349
+ uint16_t datalen = (uint16_t )(len + padlen );
335
350
uint16_t transport_payload_len = sizeof (struct udphdr ) + datalen ;
336
351
uint16_t ip_payload_len = transport_payload_len +
337
352
8 * !!((fooling & (FOOL_HOPBYHOP |FOOL_HOPBYHOP2 ))== FOOL_HOPBYHOP ) +
@@ -404,7 +419,7 @@ bool prepare_udp_segment(
404
419
const struct sockaddr * src , const struct sockaddr * dst ,
405
420
uint8_t ttl ,
406
421
uint8_t fooling ,
407
- uint16_t padlen ,
422
+ int padlen ,
408
423
const void * data , uint16_t len ,
409
424
uint8_t * buf , size_t * buflen )
410
425
{
0 commit comments