ChargePoint / wireshark-v2g

Dissector for the V2G Protocols
Other
43 stars 18 forks source link

tshark -G values segfaults #42

Closed malsyned closed 1 year ago

malsyned commented 1 year ago

tshark -G values lists the possible values of all fields, including every value_string associated with a value of a field. However, when it gets to listing the values of v2giso2.struct.evsestatus.evsenotification, it lists the two correct ones, StopCharging and ReNegotiation and then keeps on listing value strings associated with different v2giso2 fields.

$ tshark -G values
# ... pages and pages of output elided ... #
V       v2giso2.struct.evsestatus.evsenotification      0       StopCharging
V       v2giso2.struct.evsestatus.evsenotification      1       ReNegotiation
V       v2giso2.struct.evsestatus.evsenotification      0       OK
V       v2giso2.struct.evsestatus.evsenotification      1       OK (NewSessionEstablished)
V       v2giso2.struct.evsestatus.evsenotification      2       OK (OldSessionJoined)
V       v2giso2.struct.evsestatus.evsenotification      3       OK (CertificateExpiresSoon)
V       v2giso2.struct.evsestatus.evsenotification      4       OK (IsolationValid)
V       v2giso2.struct.evsestatus.evsenotification      5       OK (IsolationWarning)
V       v2giso2.struct.evsestatus.evsenotification      6       WARNING (CertificateExpired)
V       v2giso2.struct.evsestatus.evsenotification      7       WARNING (NoCertificateAvailable)
V       v2giso2.struct.evsestatus.evsenotification      8       WARNING (CertValidationError)
V       v2giso2.struct.evsestatus.evsenotification      9       WARNGIN (CertVerificationError)
V       v2giso2.struct.evsestatus.evsenotification      10      WARNING (ContractCanceled)
V       v2giso2.struct.evsestatus.evsenotification      11      FAILED
V       v2giso2.struct.evsestatus.evsenotification      12      FAILED (SequenceError)
V       v2giso2.struct.evsestatus.evsenotification      13      FAILED (ServiceIDInvalid)
V       v2giso2.struct.evsestatus.evsenotification      14      FAILED (UnknownSession)
V       v2giso2.struct.evsestatus.evsenotification      15      FAILED (ServiceSelectionInvalid)
V       v2giso2.struct.evsestatus.evsenotification      16      FAILED (SignatureError)
V       v2giso2.struct.evsestatus.evsenotification      17      FAILED (PaymentSelectionInvalid)
V       v2giso2.struct.evsestatus.evsenotification      18      FAILED (ChallengeInvalid)
V       v2giso2.struct.evsestatus.evsenotification      19      FAILED (WrongChargeParameter)
V       v2giso2.struct.evsestatus.evsenotification      20      FAILED (IsolationFault)
V       v2giso2.struct.evsestatus.evsenotification      21      FAILED (PowerDeliveryNotApplied)
V       v2giso2.struct.evsestatus.evsenotification      22      FAILED (TariffSelectionInvalid)
V       v2giso2.struct.evsestatus.evsenotification      23      FAILED (ChargingProfileInvalid)
V       v2giso2.struct.evsestatus.evsenotification      24      FAILED (MeteringSignatureNotValid)
V       v2giso2.struct.evsestatus.evsenotification      25      FAILED (NoChargeServiceSelected)
V       v2giso2.struct.evsestatus.evsenotification      26      FAILED (WrongEnergyTransferMode)
V       v2giso2.struct.evsestatus.evsenotification      27      FAILED (ContactorError)
V       v2giso2.struct.evsestatus.evsenotification      28      FAILED (CertificateRevoked)
V       v2giso2.struct.evsestatus.evsenotification      29      FAILED (CertificateNotYetValid)
V       v2giso2.struct.evsestatus.evsenotification      0       Finished
V       v2giso2.struct.evsestatus.evsenotification      1       Ongoing
V       v2giso2.struct.evsestatus.evsenotification      2       Ongoing (WaitingForCustomerInteraction)
V       v2giso2.struct.evsestatus.evsenotification      0       Ready
V       v2giso2.struct.evsestatus.evsenotification      1       NotReady
V       v2giso2.struct.evsestatus.evsenotification      0       Charge
V       v2giso2.struct.evsestatus.evsenotification      1       BPT
V       v2giso2.struct.evsestatus.evsenotification      0       CheckOut
V       v2giso2.struct.evsestatus.evsenotification      1       Processing
V       v2giso2.struct.evsestatus.evsenotification      2       Completed
V       v2giso2.struct.evsestatus.evsenotification      0       Scheduled
V       v2giso2.struct.evsestatus.evsenotification      1       Completed
V       v2giso2.struct.evsestatus.evsenotification      0       CheckIn
V       v2giso2.struct.evsestatus.evsenotification      1       Processing
V       v2giso2.struct.evsestatus.evsenotification      2       Completed
V       v2giso2.struct.evsestatus.evsenotification      0       AutoParking
V       v2giso2.struct.evsestatus.evsenotification      1       MVGuideManual
V       v2giso2.struct.evsestatus.evsenotification      2       Manual
V       v2giso2.struct.evsestatus.evsenotification      0       ObjectOnPad
V       v2giso2.struct.evsestatus.evsenotification      1       PadClear
V       v2giso2.struct.evsestatus.evsenotification      2       UnknownError
V       v2giso2.struct.evsestatus.evsenotification      0       Terminate
V       v2giso2.struct.evsestatus.evsenotification      1       Pause
V       v2giso2.struct.evsestatus.evsenotification      0       Start
V       v2giso2.struct.evsestatus.evsenotification      1       Stop
V       v2giso2.struct.evsestatus.evsenotification      2       Renegotiate
V       v2giso2.struct.evsestatus.evsenotification      0       Contract
V       v2giso2.struct.evsestatus.evsenotification      1       ExternalPayment
V       v2giso2.struct.evsestatus.evsenotification      0       relativePricePercentage
V       v2giso2.struct.evsestatus.evsenotification      1       RenewableGenerationPercentage
V       v2giso2.struct.evsestatus.evsenotification      2       CarbonDioxideEmission
Segmentation fault
malsyned commented 1 year ago

I believe I've found the source of the problem. According to the dissector API documentation, value_string arrays must end with a sentinel { 0, NULL} to indicate the end of the array. The value_string arrays in this plugin don't. This probably doesn't cause any problems during normal packet dissection, since entries are looked up by value, but it does keep Wireshark from knowing how to enumerate the values for -G value.

I would guess it would also cause buggy behavior in the event of a field that contained an out-of-range value without a matching value string.