@@ -357,9 +357,9 @@ void arv_gvcp_packet_debug (const ArvGvcpPacket *packet, ArvDebugLevel lev
357
357
*/
358
358
359
359
static inline ArvGvcpPacketType
360
- arv_gvcp_packet_get_packet_type (ArvGvcpPacket * packet )
360
+ arv_gvcp_packet_get_packet_type (ArvGvcpPacket * packet , size_t size )
361
361
{
362
- if (packet == NULL )
362
+ if G_UNLIKELY (packet == NULL || size < sizeof ( ArvGvcpPacket ) )
363
363
return ARV_GVCP_PACKET_TYPE_ERROR ;
364
364
365
365
return (ArvGvcpPacketType ) packet -> header .packet_type ;
@@ -373,9 +373,9 @@ arv_gvcp_packet_get_packet_type (ArvGvcpPacket *packet)
373
373
*/
374
374
375
375
static inline guint8
376
- arv_gvcp_packet_get_packet_flags (ArvGvcpPacket * packet )
376
+ arv_gvcp_packet_get_packet_flags (ArvGvcpPacket * packet , size_t size )
377
377
{
378
- if (packet == NULL )
378
+ if G_UNLIKELY (packet == NULL || size < sizeof ( ArvGvcpPacket ) )
379
379
return 0 ;
380
380
381
381
return (ArvGvcpPacketType ) packet -> header .packet_flags ;
@@ -389,40 +389,42 @@ arv_gvcp_packet_get_packet_flags (ArvGvcpPacket *packet)
389
389
*/
390
390
391
391
static inline ArvGvcpCommand
392
- arv_gvcp_packet_get_command (ArvGvcpPacket * packet )
392
+ arv_gvcp_packet_get_command (ArvGvcpPacket * packet , size_t size )
393
393
{
394
- if (packet == NULL )
394
+ if G_UNLIKELY (packet == NULL || size < sizeof ( ArvGvcpPacket ) )
395
395
return (ArvGvcpCommand ) 0 ;
396
396
397
397
return (ArvGvcpCommand ) g_ntohs (packet -> header .command );
398
398
}
399
399
400
400
static inline void
401
- arv_gvcp_packet_set_packet_id (ArvGvcpPacket * packet , guint16 id )
401
+ arv_gvcp_packet_set_packet_id (ArvGvcpPacket * packet , guint16 id , size_t size )
402
402
{
403
- if (packet != NULL )
403
+ if G_UNLIKELY (packet != NULL && size >= sizeof ( ArvGvcpPacket ) )
404
404
packet -> header .id = g_htons (id );
405
405
}
406
406
407
407
static inline guint16
408
- arv_gvcp_packet_get_packet_id (ArvGvcpPacket * packet )
408
+ arv_gvcp_packet_get_packet_id (ArvGvcpPacket * packet , size_t size )
409
409
{
410
- if (packet == NULL )
410
+ if G_UNLIKELY (packet == NULL || size < sizeof ( ArvGvcpPacket ) )
411
411
return 0 ;
412
412
413
413
return g_ntohs (packet -> header .id );
414
414
}
415
415
416
416
static inline void
417
- arv_gvcp_packet_get_read_memory_cmd_infos (const ArvGvcpPacket * packet , guint32 * address , guint32 * size )
417
+ arv_gvcp_packet_get_read_memory_cmd_infos (const ArvGvcpPacket * packet , size_t packet_size ,
418
+ guint32 * address , guint32 * size )
418
419
{
419
- if (packet == NULL ) {
420
+ if G_UNLIKELY (packet == NULL || packet_size < sizeof ( ArvGvcpPacket ) + 2 * sizeof ( guint32 ) ) {
420
421
if (address != NULL )
421
422
* address = 0 ;
422
423
if (size != NULL )
423
424
* size = 0 ;
424
425
return ;
425
426
}
427
+
426
428
if (address != NULL )
427
429
* address = g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
428
430
if (size != NULL )
@@ -443,69 +445,76 @@ arv_gvcp_packet_get_read_memory_ack_data (const ArvGvcpPacket *packet)
443
445
}
444
446
445
447
static inline void
446
- arv_gvcp_packet_get_write_memory_cmd_infos (const ArvGvcpPacket * packet , guint32 * address , guint32 * size )
448
+ arv_gvcp_packet_get_write_memory_cmd_infos (const ArvGvcpPacket * packet , size_t packet_size ,
449
+ guint32 * address , guint32 * size )
447
450
{
448
- if (packet == NULL ) {
451
+ if G_UNLIKELY (packet == NULL || packet_size < sizeof ( ArvGvcpPacket ) + sizeof ( guint32 ) ) {
449
452
if (address != NULL )
450
453
* address = 0 ;
451
454
if (size != NULL )
452
455
* size = 0 ;
453
456
return ;
454
457
}
458
+
455
459
if (address != NULL )
456
460
* address = g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
457
461
if (size != NULL )
458
462
* size = g_ntohs (packet -> header .size ) - sizeof (guint32 );
459
463
}
460
464
461
- static inline void *
462
- arv_gvcp_packet_get_write_memory_cmd_data (const ArvGvcpPacket * packet )
463
- {
464
- return (char * ) packet + sizeof (ArvGvcpPacket ) + sizeof (guint32 );
465
- }
466
-
467
465
static inline size_t
468
466
arv_gvcp_packet_get_write_memory_ack_size (void )
469
467
{
470
468
return sizeof (ArvGvcpPacket ) + sizeof (guint32 );
471
469
}
472
470
471
+ static inline void *
472
+ arv_gvcp_packet_get_write_memory_cmd_data (const ArvGvcpPacket * packet )
473
+ {
474
+ return (char * ) packet + sizeof (ArvGvcpPacket ) + sizeof (guint32 );
475
+ }
476
+
473
477
static inline void
474
- arv_gvcp_packet_get_read_register_cmd_infos (const ArvGvcpPacket * packet , guint32 * address )
478
+ arv_gvcp_packet_get_read_register_cmd_infos (const ArvGvcpPacket * packet , size_t packet_size ,
479
+ guint32 * address )
475
480
{
476
- if (packet == NULL ) {
481
+ if G_UNLIKELY (packet == NULL || packet_size < sizeof ( ArvGvcpPacket ) + sizeof ( guint32 ) ) {
477
482
if (address != NULL )
478
483
* address = 0 ;
479
484
return ;
480
485
}
486
+
481
487
if (address != NULL )
482
488
* address = g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
483
489
}
484
490
485
- static inline guint32
486
- arv_gvcp_packet_get_read_register_ack_value (const ArvGvcpPacket * packet )
487
- {
488
- if (packet == NULL )
489
- return 0 ;
490
- return g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
491
- }
492
-
493
491
static inline size_t
494
492
arv_gvcp_packet_get_read_register_ack_size (void )
495
493
{
496
494
return sizeof (ArvGvcpHeader ) + sizeof (guint32 );
497
495
}
498
496
497
+ static inline guint32
498
+ arv_gvcp_packet_get_read_register_ack_value (const ArvGvcpPacket * packet , size_t packet_size )
499
+ {
500
+ if G_UNLIKELY (packet == NULL || packet_size < arv_gvcp_packet_get_read_register_ack_size ())
501
+ return 0 ;
502
+
503
+ return g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
504
+ }
505
+
499
506
static inline void
500
- arv_gvcp_packet_get_write_register_cmd_infos (const ArvGvcpPacket * packet , guint32 * address , guint32 * value )
507
+ arv_gvcp_packet_get_write_register_cmd_infos (const ArvGvcpPacket * packet , size_t packet_size ,
508
+ guint32 * address , guint32 * value )
501
509
{
502
- if (packet == NULL ) {
510
+ if G_UNLIKELY (packet == NULL || packet_size < sizeof ( ArvGvcpPacket ) + 2 * sizeof ( guint32 ) ) {
503
511
if (address != NULL )
504
512
* address = 0 ;
505
513
if (value != NULL )
506
514
* value = 0 ;
507
515
return ;
508
516
}
517
+
509
518
if (address != NULL )
510
519
* address = g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
511
520
if (value != NULL )
@@ -543,9 +552,12 @@ arv_gvcp_packet_get_pending_ack_size (void)
543
552
*/
544
553
545
554
static inline guint32
546
- arv_gvcp_packet_get_pending_ack_timeout (const ArvGvcpPacket * packet )
555
+ arv_gvcp_packet_get_pending_ack_timeout (const ArvGvcpPacket * packet , size_t packet_size )
547
556
{
548
- return packet != NULL ? g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket )))) : 0 ;
557
+ if G_UNLIKELY (packet == NULL || packet_size < sizeof (ArvGvcpPacket ) + sizeof (guint32 ))
558
+ return 0 ;
559
+
560
+ return g_ntohl (* ((guint32 * ) ((char * ) packet + sizeof (ArvGvcpPacket ))));
549
561
}
550
562
551
563
G_END_DECLS
0 commit comments