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
diff --git a/src/rlc.cpp b/src/rlc.cpp
index d13045e..acd4169 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -378,6 +378,36 @@
 	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;