Fix of potential memory leaks at lapdm.c
diff --git a/src/gsm/lapdm.c b/src/gsm/lapdm.c
index 2bda48a..71045aa 100644
--- a/src/gsm/lapdm.c
+++ b/src/gsm/lapdm.c
@@ -687,7 +687,8 @@
 	if (oph->sap != SAP_GSM_PH) {
 		LOGP(DLLAPD, LOGL_ERROR, "primitive for unknown SAP %u\n",
 			oph->sap);
-		return -ENODEV;
+		rc = -ENODEV;
+		goto free;
 	}
 
 	switch (oph->primitive) {
@@ -695,7 +696,8 @@
 		if (oph->operation != PRIM_OP_INDICATION) {
 			LOGP(DLLAPD, LOGL_ERROR, "PH_DATA is not INDICATION %u\n",
 				oph->operation);
-			return -ENODEV;
+			rc = -ENODEV;
+			goto free;
 		}
 		rc = l2_ph_data_ind(oph->msg, le, pp->u.data.chan_nr,
 				    pp->u.data.link_id);
@@ -704,7 +706,8 @@
 		if (oph->operation != PRIM_OP_INDICATION) {
 			LOGP(DLLAPD, LOGL_ERROR, "PH_RTS is not INDICATION %u\n",
 				oph->operation);
-			return -ENODEV;
+			rc = -ENODEV;
+			goto free;
 		}
 		rc = l2_ph_data_conf(oph->msg, le);
 		break;
@@ -718,12 +721,22 @@
 			rc = l2_ph_chan_conf(oph->msg, le, pp->u.rach_ind.fn);
 			break;
 		default:
-			return -EIO;
+			rc = -EIO;
+			goto free;
 		}
 		break;
+	default:
+		LOGP(DLLAPD, LOGL_ERROR, "Unknown primitive %u\n",
+			oph->primitive);
+		rc = -EINVAL;
+		goto free;
 	}
 
 	return rc;
+
+free:
+	msgb_free(oph->msg);
+	return rc;
 }