From 3477bd7ed13fba6a6021eae485cf937461debe49 Mon Sep 17 00:00:00 2001 From: fuleinist Date: Tue, 11 Aug 2026 05:06:19 +1000 Subject: [PATCH 1/2] fix(Label_4A_DIS): guard against comma-less DIS payloads (issue #493) Label_4A_DIS.decode split message.text on ',' then unconditionally called fields[1].substring(2). A comma-less DIS payload (truncated header, DIS-only marker) made fields[1] undefined, throwing TypeError and aborting MessageDecoder.decode(). Fix: early-return with decoded=false when fields.length < 2 or fields[1] is too short for the substring(2) + '00' timestamp parse. Adds 2 regression tests for comma-less and empty-field cases. --- lib/plugins/Label_4A_DIS.test.ts | 14 +++++++++++--- lib/plugins/Label_4A_DIS.ts | 8 +++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/plugins/Label_4A_DIS.test.ts b/lib/plugins/Label_4A_DIS.test.ts index 6695efce..d9150540 100644 --- a/lib/plugins/Label_4A_DIS.test.ts +++ b/lib/plugins/Label_4A_DIS.test.ts @@ -39,9 +39,8 @@ describe('Label 4A preamble DIS', () => { expect(decodeResult.formatted.items[2].value).toBe('@HOLD CNX'); }); - // disabled because all messages should decode - test.skip('decodes Label 4A_DIS ', () => { - message.text = '4A_DIS Bogus message'; + test('does not throw on comma-less DIS payload', () => { + message.text = 'DIS'; const decodeResult = plugin.decode(message); expect(decodeResult.decoded).toBe(false); @@ -50,4 +49,13 @@ describe('Label 4A preamble DIS', () => { expect(decodeResult.formatted.description).toBe('Latest New Format'); expect(decodeResult.formatted.items.length).toBe(0); }); + + test('does not throw on DIS with empty field after comma', () => { + message.text = 'DIS,'; + const decodeResult = plugin.decode(message); + + expect(decodeResult.decoded).toBe(false); + expect(decodeResult.decoder.decodeLevel).toBe('none'); + expect(decodeResult.formatted.items.length).toBe(0); + }); }); diff --git a/lib/plugins/Label_4A_DIS.ts b/lib/plugins/Label_4A_DIS.ts index 048c2025..afd0d859 100644 --- a/lib/plugins/Label_4A_DIS.ts +++ b/lib/plugins/Label_4A_DIS.ts @@ -16,8 +16,14 @@ export class Label_4A_DIS extends DecoderPlugin { decode(message: Message, options: Options = {}): DecodeResult { const decodeResult = this.initResult(message, 'Latest New Format'); - decodeResult.decoded = true; const fields = message.text.split(','); + if (fields.length < 2 || !fields[1] || fields[1].length < 3) { + decodeResult.decoded = false; + this.setDecodeLevel(decodeResult, decodeResult.decoded); + return decodeResult; + } + + decodeResult.decoded = true; ResultFormatter.timestamp( decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'), From 60f8cffd8185f42eab3cebcf9fed70663a2ab45a Mon Sep 17 00:00:00 2001 From: fuleinist Date: Wed, 12 Aug 2026 02:08:35 +1000 Subject: [PATCH 2/2] fix(Label_4A_DIS): require callsign field before decoding --- lib/plugins/Label_4A_DIS.test.ts | 18 ++++++++++++++++++ lib/plugins/Label_4A_DIS.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/plugins/Label_4A_DIS.test.ts b/lib/plugins/Label_4A_DIS.test.ts index d9150540..2c020706 100644 --- a/lib/plugins/Label_4A_DIS.test.ts +++ b/lib/plugins/Label_4A_DIS.test.ts @@ -58,4 +58,22 @@ describe('Label 4A preamble DIS', () => { expect(decodeResult.decoder.decodeLevel).toBe('none'); expect(decodeResult.formatted.items.length).toBe(0); }); + + test('does not decode DIS payload without comma', () => { + message.text = 'DIS01'; + const decodeResult = plugin.decode(message); + + expect(decodeResult.decoded).toBe(false); + expect(decodeResult.decoder.decodeLevel).toBe('none'); + expect(decodeResult.formatted.items.length).toBe(0); + }); + + test('does not decode DIS payload without callsign', () => { + message.text = 'DIS01,190009'; + const decodeResult = plugin.decode(message); + + expect(decodeResult.decoded).toBe(false); + expect(decodeResult.decoder.decodeLevel).toBe('none'); + expect(decodeResult.formatted.items.length).toBe(0); + }); }); diff --git a/lib/plugins/Label_4A_DIS.ts b/lib/plugins/Label_4A_DIS.ts index afd0d859..d25f7a90 100644 --- a/lib/plugins/Label_4A_DIS.ts +++ b/lib/plugins/Label_4A_DIS.ts @@ -17,7 +17,7 @@ export class Label_4A_DIS extends DecoderPlugin { const decodeResult = this.initResult(message, 'Latest New Format'); const fields = message.text.split(','); - if (fields.length < 2 || !fields[1] || fields[1].length < 3) { + if (fields.length < 3 || !fields[1] || fields[1].length < 3 || !fields[2]) { decodeResult.decoded = false; this.setDecodeLevel(decodeResult, decodeResult.decoded); return decodeResult;