osmo_trau_frame_encode(): Check for sufficiently sized output buffer

Change-Id: Ie14399b2271aba9ff81f62d593a0ddd9d3e83d98
diff --git a/src/trau/trau_frame.c b/src/trau/trau_frame.c
index ea63938..0a8faf9 100644
--- a/src/trau/trau_frame.c
+++ b/src/trau/trau_frame.c
@@ -1223,6 +1223,43 @@
  *  \return 0 number of unpacked output bits generated; negative in case of error */
 int osmo_trau_frame_encode(ubit_t *bits, size_t n_bits, const struct osmo_trau_frame *fr)
 {
+	/* check for sufficient space provided by caller in output buffer */
+	switch (fr->type) {
+	case OSMO_TRAU16_FT_FR:
+	case OSMO_TRAU16_FT_EFR:
+	case OSMO_TRAU16_FT_HR:
+	case OSMO_TRAU16_FT_AMR:
+		/* timing alignment may happen: increased space requirement */
+		if (n_bits < 2 * 40 * 8 - 1)
+			return -ENOSPC;
+		break;
+	case OSMO_TRAU16_FT_OAM:
+	case OSMO_TRAU16_FT_IDLE:
+	case OSMO_TRAU16_FT_DATA_HR:
+	case OSMO_TRAU16_FT_DATA:
+	case OSMO_TRAU16_FT_D145_SYNC:
+	case OSMO_TRAU16_FT_EDATA:
+		if (n_bits < 1 * 40 * 8)
+			return -ENOSPC;
+		break;
+	case OSMO_TRAU8_SPEECH:
+	case OSMO_TRAU8_AMR_LOW:
+	case OSMO_TRAU8_AMR_6k7:
+	case OSMO_TRAU8_AMR_7k4:
+		/* timing alignment may happen: increased space requirement */
+		if (n_bits < 2 * 20 * 8 - 1)
+			return -ENOSPC;
+	case OSMO_TRAU8_DATA:
+	case OSMO_TRAU8_OAM:
+		if (n_bits < 1 * 20 * 8)
+			return -ENOSPC;
+		break;
+	case OSMO_TRAU_FT_NONE:
+		break;
+	default:
+		return -EINVAL;
+	}
+
 	switch (fr->type) {
 	case OSMO_TRAU16_FT_FR:
 	case OSMO_TRAU16_FT_EFR: