aboutsummaryrefslogtreecommitdiffstats
path: root/src/fig0_13.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2020-11-02 14:02:01 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2020-11-02 14:02:01 +0100
commit90101548ec43fd50ddc143eb0cbe99bdd0b47c6f (patch)
tree6a4a7eaa55a31a7d54eeb0c34ef9bf3ef4547b94 /src/fig0_13.cpp
parentea56f46c8f017ef98ae647abc99ceecba9dce1e1 (diff)
downloadetisnoop-90101548ec43fd50ddc143eb0cbe99bdd0b47c6f.tar.gz
etisnoop-90101548ec43fd50ddc143eb0cbe99bdd0b47c6f.tar.bz2
etisnoop-90101548ec43fd50ddc143eb0cbe99bdd0b47c6f.zip
Improve FIG0/13, add 0/7, avoid int overflows
Diffstat (limited to 'src/fig0_13.cpp')
-rw-r--r--src/fig0_13.cpp46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/fig0_13.cpp b/src/fig0_13.cpp
index 9a715af..9b8c2c0 100644
--- a/src/fig0_13.cpp
+++ b/src/fig0_13.cpp
@@ -125,33 +125,37 @@ fig_result_t fig0_13(fig0_common_t& fig0, const display_settings_t &disp)
r.msgs.emplace_back(2, strprintf("length=%u", user_app_len));
if (user_app_len >= 2) {
- bool ca_flag = (f[k] >> 7) & 0x1;
- r.msgs.emplace_back(2, strprintf("CAflag=%d", ca_flag));
+ size_t effective_uadata_len = user_app_len;
- bool ca_org_flag = (f[k] >> 6) & 0x1;
- r.msgs.emplace_back(2, strprintf("CAOrgflag=%d", ca_org_flag));
+ if (fig0.pd() == 0) { // Programme services contain the X-PAD data field
+ bool ca_flag = (f[k] >> 7) & 0x1;
+ r.msgs.emplace_back(2, strprintf("CAflag=%d", ca_flag));
- uint8_t xpad_appty = f[k] & 0x1F;
- r.msgs.emplace_back(2, strprintf("XPAD_AppTy=%d", xpad_appty));
+ bool ca_org_flag = (f[k] >> 6) & 0x1;
+ r.msgs.emplace_back(2, strprintf("CAOrgflag=%d", ca_org_flag));
- bool dg_flag = (f[k+1] >> 7) & 0x1;
- r.msgs.emplace_back(2, strprintf("DGflag=%d", dg_flag));
+ uint8_t xpad_appty = f[k] & 0x1F;
+ r.msgs.emplace_back(2, strprintf("XPAD_AppTy=%d", xpad_appty));
- uint8_t dscty = f[k+1] & 0x3F;
- r.msgs.emplace_back(2, strprintf("DSCTy=%d", dscty));
+ bool dg_flag = (f[k+1] >> 7) & 0x1;
+ r.msgs.emplace_back(2, strprintf("DGflag=%d", dg_flag));
- k += 2;
- size_t effective_uadata_len = user_app_len - 2;
+ uint8_t dscty = f[k+1] & 0x3F;
+ r.msgs.emplace_back(2, strprintf("DSCTy=%d", dscty));
- if (ca_org_flag) {
- if (user_app_len < 4) {
- r.errors.push_back("User Application Data Length too short to contain CAOrg!");
- }
- else {
- uint16_t ca_org = (f[k] << 8) | f[k+1];
- k += 2;
- effective_uadata_len -= 2;
- r.msgs.emplace_back(2, strprintf("ca_org=%u", ca_org));
+ k += 2;
+ effective_uadata_len -= 2;
+
+ if (ca_org_flag) {
+ if (user_app_len < 4) {
+ r.errors.push_back("User Application Data Length too short to contain CAOrg!");
+ }
+ else {
+ uint16_t ca_org = (f[k] << 8) | f[k+1];
+ k += 2;
+ effective_uadata_len -= 2;
+ r.msgs.emplace_back(2, strprintf("ca_org=%u", ca_org));
+ }
}
}