diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-02-08 16:49:20 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-02-14 12:20:57 +0100 |
commit | b609190369bdf96eefedacc012503d7b55823302 (patch) | |
tree | 02075e68bd029252cca08af4f98112e0637643f8 /src/rlc.cpp | |
parent | 49b83ec3a350d08437522ab4c1a9d67cfb05e935 (diff) |
dl tbf: initialize punct values and verify
Solves a sanitizer issue where punct2 is unset when passed to
gprs_rlc_mcs_cps() and thus takes a value not defined in the enum.
Change-Id: I004cbbab15e6ffa2749f4b7f1df651517c2ae693
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r-- | src/rlc.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp index d13045e8..acd41693 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -378,6 +378,36 @@ unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, enum egprs_puncturing_values punct, enum egprs_puncturing_values punct2, int with_padding) { + /* validate that punct and punct2 are as expected */ + switch (GprsCodingScheme::Scheme(cs)) { + case GprsCodingScheme::MCS9: + case GprsCodingScheme::MCS8: + case GprsCodingScheme::MCS7: + if (punct2 == EGPRS_PS_INVALID) { + LOGP(DRLCMACDL, LOGL_ERROR, + "Invalid punct2 value for coding scheme %d: %d\n", + GprsCodingScheme::Scheme(cs), punct2); + return -1; + } + /* fall through */ + case GprsCodingScheme::MCS6: + case GprsCodingScheme::MCS5: + case GprsCodingScheme::MCS4: + case GprsCodingScheme::MCS3: + case GprsCodingScheme::MCS2: + case GprsCodingScheme::MCS1: + if (punct == EGPRS_PS_INVALID) { + LOGP(DRLCMACDL, LOGL_ERROR, + "Invalid punct value for coding scheme %d: %d\n", + GprsCodingScheme::Scheme(cs), punct); + return -1; + } + break; + default: + return -1; + } + + /* See 3GPP TS 44.060 10.4.8a.3.1, 10.4.8a.2.1, 10.4.8a.1.1 */ switch (GprsCodingScheme::Scheme(cs)) { case GprsCodingScheme::MCS1: return 0b1011 + punct % EGPRS_MAX_PS_NUM_2; |