diff options
| -rw-r--r-- | audio/control.c | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/audio/control.c b/audio/control.c index c8480197..3e4e776a 100644 --- a/audio/control.c +++ b/audio/control.c @@ -755,12 +755,20 @@ static GIOChannel *avctp_server_socket(const bdaddr_t *src, gboolean master)  static void avctp_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,  			const bdaddr_t *dst, gpointer data)  { -	struct avctp *session = data; +	struct control *control = data; +	struct avctp *session = control->session;  	struct l2cap_options l2o;  	socklen_t len;  	int sk;  	char address[18]; +	if (!session) { +		debug("avctp_connect_cb: session removed while connecting"); +		g_io_channel_close(chan); +		g_io_channel_unref(chan); +		return; +	} +  	ba2str(&session->dst, address);  	if (err < 0) { @@ -780,6 +788,7 @@ static void avctp_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,  	len = sizeof(l2o);  	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {  		err = errno; +		g_io_channel_unref(chan);  		avctp_unref(session);  		error("getsockopt(L2CAP_OPTIONS): %s (%d)", strerror(err),  				err); @@ -797,6 +806,7 @@ static void avctp_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,  	session->io = g_io_add_watch(chan,  				G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,  				(GIOFunc) session_cb, session); +	g_io_channel_unref(chan);  }  gboolean avrcp_connect(struct audio_device *dev) @@ -818,7 +828,7 @@ gboolean avrcp_connect(struct audio_device *dev)  	session->state = AVCTP_STATE_CONNECTING;  	err = bt_l2cap_connect(&dev->src, &dev->dst, AVCTP_PSM, 0, -				avctp_connect_cb, session); +				avctp_connect_cb, control);  	if (err < 0) {  		avctp_unref(session);  		error("Connect failed. %s(%d)", strerror(-err), -err); | 
