diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gsm/lapdm.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/src/gsm/lapdm.c b/src/gsm/lapdm.c index 2bda48ae..71045aa1 100644 --- a/src/gsm/lapdm.c +++ b/src/gsm/lapdm.c @@ -687,7 +687,8 @@ int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le)  	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 @@ int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le)  		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 @@ int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le)  		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 @@ int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le)  			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;  } | 
