write_queue: Check the result of osmo_wqueue_enqueue and free

The write_queue is designed to have a maximum amount of pending
messages and will refuse to take new messages when it has been
reached. The caller can decide if it wants to flush the queue
and add the message again, create a log. But in all cases the
ownership of the msgb has not been transferred. Fix the potential
memory leak in the failure situation.
diff --git a/openbsc/src/libmsc/meas_feed.c b/openbsc/src/libmsc/meas_feed.c
index 86ba3b7..86d679a 100644
--- a/openbsc/src/libmsc/meas_feed.c
+++ b/openbsc/src/libmsc/meas_feed.c
@@ -61,7 +61,8 @@
 	memcpy(&mfm->mr, mr, sizeof(mfm->mr));
 
 	/* and send it to the socket */
-	osmo_wqueue_enqueue(&g_mfs.wqueue, msg);
+	if (osmo_wqueue_enqueue(&g_mfs.wqueue, msg) != 0)
+		msgb_free(msg);
 
 	return 0;
 }
diff --git a/openbsc/src/libmsc/smpp_smsc.c b/openbsc/src/libmsc/smpp_smsc.c
index 048c1b8..c1ec22f 100644
--- a/openbsc/src/libmsc/smpp_smsc.c
+++ b/openbsc/src/libmsc/smpp_smsc.c
@@ -352,7 +352,13 @@
 	}
 	msgb_put(msg, rlen);
 
-	return osmo_wqueue_enqueue(&esme->wqueue, msg);
+	if (osmo_wqueue_enqueue(&esme->wqueue, msg) != 0) {
+		LOGP(DSMPP, LOGL_ERROR, "[%s] Write queue full. Dropping message\n",
+		     esme->system_id);
+		msgb_free(msg);
+		return -EAGAIN;
+	}
+	return 0;
 }
 
 /*! \brief transmit a generic NACK to a remote ESME */
diff --git a/openbsc/src/utils/smpp_mirror.c b/openbsc/src/utils/smpp_mirror.c
index cf3657e..2f154db 100644
--- a/openbsc/src/utils/smpp_mirror.c
+++ b/openbsc/src/utils/smpp_mirror.c
@@ -85,7 +85,13 @@
 	}
 	msgb_put(msg, rlen);
 
-	return osmo_wqueue_enqueue(&esme->wqueue, msg);
+	if (osmo_wqueue_enqueue(&esme->wqueue, msg) != 0) {
+		LOGP(DSMPP, LOGL_ERROR, "[%s] Write queue full. Dropping message\n",
+		     esme->system_id);
+		msgb_free(msg);
+		return -EAGAIN;
+	}
+	return 0;
 }
 /* FIXME: merge with smpp_smsc.c */