Read the error code separately in a recv call.
Read the error code in a new recv call. Trying to read more data
than required to cover the error scenario was causing problems
when a NEW STREAM was being started.
diff --git a/audio/liba2dp.c b/audio/liba2dp.c
index 0cd66b4..5bd88e3 100755
--- a/audio/liba2dp.c
+++ b/audio/liba2dp.c
@@ -716,7 +716,7 @@
const char *type, *name;
uint16_t length;
- length = BT_SUGGESTED_BUFFER_SIZE;
+ length = inmsg->length ? inmsg->length : BT_SUGGESTED_BUFFER_SIZE;
ret = recv(data->server.fd, inmsg, length, 0);
if (ret < 0) {
@@ -728,6 +728,23 @@
} else if ((size_t) ret < sizeof(bt_audio_msg_header_t)) {
ERR("Too short (%d bytes) IPC packet from bluetoothd", ret);
err = -EINVAL;
+ } else if (inmsg->type == BT_ERROR) {
+ bt_audio_error_t *error = (bt_audio_error_t *)inmsg;
+ ret = recv(data->server.fd, &error->posix_errno,
+ sizeof(error->posix_errno), 0);
+ if (ret < 0) {
+ err = -errno;
+ ERR("Error receiving error code for BT_ERROR: %s (%d)",
+ strerror(errno), errno);
+ if (err == -EPIPE)
+ bluetooth_close(data);
+ } else {
+ ERR("%s failed : %s(%d)",
+ bt_audio_strname(error->h.name),
+ strerror(error->posix_errno),
+ error->posix_errno);
+ err = -error->posix_errno;
+ }
} else {
type = bt_audio_strtype(inmsg->type);
name = bt_audio_strname(inmsg->name);
@@ -748,7 +765,6 @@
static int audioservice_expect(struct bluetooth_data *data,
bt_audio_msg_header_t *rsp_hdr, int expected_name)
{
- bt_audio_error_t *error;
int err = audioservice_recv(data, rsp_hdr);
if (err != 0)
@@ -760,16 +776,6 @@
bt_audio_strname(rsp_hdr->name),
bt_audio_strname(expected_name));
}
-
- if (rsp_hdr->type == BT_ERROR) {
- error = (void *) rsp_hdr;
- ERR("%s failed : %s(%d)",
- bt_audio_strname(rsp_hdr->name),
- strerror(error->posix_errno),
- error->posix_errno);
- return -error->posix_errno;
- }
-
return err;
}