@@ -579,21 +579,42 @@ private static ushort CalculateDlc(ushort dataFieldSize)
579579
580580 public CanFrame LsCanTransmitOperationToSilKitCanFrame ( byte [ ] LSCanFrame , ILogger Logger )
581581 {
582- int size = Marshal . SizeOf ( typeof ( CanTransmitOperation ) ) ;
583- IntPtr ptr = Marshal . AllocHGlobal ( size ) ;
584- Marshal . Copy ( LSCanFrame , 0 , ptr , LSCanFrame . Length ) ;
582+ // copy only the fixed header
583+ int headerSize = Marshal . SizeOf ( typeof ( CanTransmitOperation ) ) - IntPtr . Size ;
584+
585+ if ( LSCanFrame . Length < headerSize )
586+ {
587+ Logger . Log ( LogLevel . Error , $ "CAN frame too short ({ LSCanFrame . Length } bytes). Expected at least { headerSize } bytes.") ;
588+ return new CanFrame ( ) ;
589+ }
590+
591+ IntPtr ptr = Marshal . AllocHGlobal ( Marshal . SizeOf ( typeof ( CanTransmitOperation ) ) ) ;
592+ Marshal . Copy ( LSCanFrame , 0 , ptr , headerSize ) ;
585593 var ptrToStruct = Marshal . PtrToStructure ( ptr , typeof ( CanTransmitOperation ) ) ;
586594 Marshal . FreeHGlobal ( ptr ) ;
587595
588596 if ( ptrToStruct == null )
589597 {
590- Logger . Log ( LogLevel . Error , $ "Error while casting CAN transmit operation to SIL Kit CAN frame. Retreived bytes:" +
598+ Logger . Log ( LogLevel . Error , $ "Error while casting CAN transmit operation to SIL Kit CAN frame. Retrieved bytes:" +
591599 $ "{ LSCanFrame } ") ;
592600 return new CanFrame ( ) ;
593601 }
594602
595603 CanTransmitOperation canTransmitOp = ( CanTransmitOperation ) ptrToStruct ;
596604
605+ // populate the Data field from the remaining bytes
606+ var dataLength = canTransmitOp . GetDataLength ( ) ;
607+
608+ if ( LSCanFrame . Length < headerSize + dataLength )
609+ {
610+ Logger . Log ( LogLevel . Error , $ "CAN frame size mismatch. Header indicates { dataLength } data bytes, " +
611+ $ "but only { LSCanFrame . Length - headerSize } are available.") ;
612+ return new CanFrame ( ) ;
613+ }
614+
615+ canTransmitOp . Data = Marshal . AllocHGlobal ( dataLength ) ;
616+ Marshal . Copy ( LSCanFrame , headerSize , canTransmitOp . Data , dataLength ) ;
617+
597618 CanFrame silkitCanFrame = new CanFrame ( ) ;
598619
599620 silkitCanFrame . id = canTransmitOp . GetID ( ) ;
@@ -605,7 +626,6 @@ public CanFrame LsCanTransmitOperationToSilKitCanFrame(byte[] LSCanFrame, ILogge
605626 {
606627 silkitCanFrame . flags |= ( UInt32 ) SilKitCanFrameFlag . Rtr ;
607628 }
608- var dataLength = canTransmitOp . GetDataLength ( ) ;
609629 silkitCanFrame . dlc = CalculateDlc ( dataLength ) ;
610630 if ( silkitCanFrame . dlc == 0xFFFF )
611631 {
@@ -618,14 +638,9 @@ public CanFrame LsCanTransmitOperationToSilKitCanFrame(byte[] LSCanFrame, ILogge
618638 silkitCanFrame . vcid = 0 ;
619639 silkitCanFrame . af = 0 ;
620640
621- // handle data field. Starts from the 17th byte
622- var bytes = LSCanFrame . AsSpan ( 16 , dataLength ) ;
623- var dataptr = Marshal . AllocHGlobal ( dataLength ) ;
624- Marshal . Copy ( bytes . ToArray ( ) , 0 , dataptr , dataLength ) ;
625-
626641 silkitCanFrame . data = new ByteVector
627642 {
628- data = dataptr ,
643+ data = canTransmitOp . Data ,
629644 size = ( IntPtr ) dataLength
630645 } ;
631646
0 commit comments