diff options
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/dbus-rfcomm.c | 72 | ||||
-rw-r--r-- | hcid/dbus-sdp.c | 41 | ||||
-rw-r--r-- | hcid/dbus.h | 4 |
3 files changed, 52 insertions, 65 deletions
diff --git a/hcid/dbus-rfcomm.c b/hcid/dbus-rfcomm.c index 558d2c5d..2aa93be8 100644 --- a/hcid/dbus-rfcomm.c +++ b/hcid/dbus-rfcomm.c @@ -634,19 +634,16 @@ failed: rfcomm_continue_data_free(cdata); } -static uuid_t *str2uuid(const char *string) +static int str2uuid(uuid_t *uuid, const char *string) { uint16_t svclass, data1, data2, data3, data5; uint32_t data0, data4; - uuid_t *uuid; - - uuid = malloc(sizeof(uuid_t)); - if (!uuid) - return NULL; svclass = sdp_str2svclass(string); - if (svclass) - return sdp_uuid16_create(uuid, sdp_str2svclass(string)); + if (svclass) { + sdp_uuid16_create(uuid, sdp_str2svclass(string)); + return 0; + } if (strlen(string) == 36 && string[8] == '-' && @@ -671,28 +668,11 @@ static uuid_t *str2uuid(const char *string) memcpy(&val[10], &data4, 4); memcpy(&val[14], &data5, 2); - return sdp_uuid128_create(uuid, val); + sdp_uuid128_create(uuid, val); + return 0; } - free(uuid); - - return NULL; -} - -static uint32_t *str2handle(const char *string) -{ - uint32_t *handle; - - handle = malloc(sizeof(*handle)); - if (!handle) - return NULL; - - *handle = strtol(string, NULL, 0); - if (*handle) - return handle; - - free(handle); - return NULL; + return -1; } static DBusHandlerResult rfcomm_connect_req(DBusConnection *conn, @@ -700,8 +680,8 @@ static DBusHandlerResult rfcomm_connect_req(DBusConnection *conn, { struct hci_dbus_data *dbus_data = data; rfcomm_continue_data_t *cdata; - uint32_t *handle = NULL; - uuid_t *uuid = NULL; + uint32_t handle; + uuid_t uuid; const char *string; const char *dst; int err; @@ -716,10 +696,10 @@ static DBusHandlerResult rfcomm_connect_req(DBusConnection *conn, if (!cdata) return DBUS_HANDLER_RESULT_NEED_MEMORY; - if ((uuid = str2uuid(string))) + if (str2uuid(&uuid, string) == 0) err = get_record_with_uuid(conn, msg, dbus_data->dev_id, dst, - uuid, rfcomm_conn_req_continue, cdata); - else if ((handle = str2handle(string))) + &uuid, rfcomm_conn_req_continue, cdata); + else if ((handle = strtol(string, NULL, 0))) err = get_record_with_handle(conn, msg, dbus_data->dev_id, dst, handle, rfcomm_conn_req_continue, cdata); else { @@ -730,13 +710,11 @@ static DBusHandlerResult rfcomm_connect_req(DBusConnection *conn, if (!err) return DBUS_HANDLER_RESULT_HANDLED; - if (uuid) - free(uuid); - if (handle) - free(handle); - rfcomm_continue_data_free(cdata); + if (err == -ENOMEM) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + return error_failed(conn, msg, err); } @@ -925,8 +903,8 @@ static DBusHandlerResult rfcomm_bind_req(DBusConnection *conn, { struct hci_dbus_data *dbus_data = data; rfcomm_continue_data_t *cdata; - uint32_t *handle = NULL; - uuid_t *uuid = NULL; + uint32_t handle; + uuid_t uuid; const char *string; const char *dst; int err; @@ -941,10 +919,10 @@ static DBusHandlerResult rfcomm_bind_req(DBusConnection *conn, if (!cdata) return DBUS_HANDLER_RESULT_NEED_MEMORY; - if ((uuid = str2uuid(string))) + if (str2uuid(&uuid, string) == 0) err = get_record_with_uuid(conn, msg, dbus_data->dev_id, dst, - uuid, rfcomm_bind_req_continue, cdata); - else if ((handle = str2handle(string))) + &uuid, rfcomm_bind_req_continue, cdata); + else if ((handle = strtol(string, NULL, 0))) err = get_record_with_handle(conn, msg, dbus_data->dev_id, dst, handle, rfcomm_bind_req_continue, cdata); else { @@ -955,13 +933,11 @@ static DBusHandlerResult rfcomm_bind_req(DBusConnection *conn, if (!err) return DBUS_HANDLER_RESULT_HANDLED; - if (uuid) - free(uuid); - if (handle) - free(handle); - rfcomm_continue_data_free(cdata); + if (err == -ENOMEM) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + return error_failed(conn, msg, err); } diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index bd724dc4..fce4cf90 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -1551,10 +1551,11 @@ failed: int get_record_with_handle(DBusConnection *conn, DBusMessage *msg, uint16_t dev_id, const char *dst, - uint32_t *handle, get_record_cb_t *cb, void *data) + uint32_t handle, get_record_cb_t *cb, void *data) { struct pending_connect *c; get_record_data_t *d; + uint32_t *rec_handle; int err; /* FIXME: search the cache first! */ @@ -1564,10 +1565,18 @@ int get_record_with_handle(DBusConnection *conn, DBusMessage *msg, return -EINPROGRESS; } - d = get_record_data_new(dev_id, dst, handle, cb, data); - if (!d) + rec_handle = malloc(sizeof(uint32_t)); + if (!rec_handle) return -ENOMEM; + *rec_handle = handle; + + d = get_record_data_new(dev_id, dst, rec_handle, cb, data); + if (!d) { + free(rec_handle); + return -ENOMEM; + } + if (!(c = connect_request(conn, msg, dev_id, dst, get_rec_with_handle_conn_cb, &err))) { error("Search request failed: %s (%d)", strerror(err), err); @@ -1587,7 +1596,7 @@ static void get_rec_with_uuid_comp_cb(uint8_t type, uint16_t err, get_record_data_t *d = ctxt->priv; int csrc, tsrc, cb_err = 0; sdp_record_t *rec = NULL; - uint32_t *handle; + uint32_t handle; uint8_t *pdata; if (err == 0xffff) { @@ -1619,14 +1628,7 @@ static void get_rec_with_uuid_comp_cb(uint8_t type, uint16_t err, goto failed; pdata += sizeof(uint16_t); - /* FIXME: what should we do with the other handles?? */ - handle = malloc(sizeof(*handle)); - if (!handle) { - cb_err = ENOMEM; - goto failed; - } - - *handle = ntohl(bt_get_unaligned((uint32_t*)pdata)); + handle = ntohl(bt_get_unaligned((uint32_t*)pdata)); get_record_with_handle(ctxt->conn, ctxt->rq, d->dev_id, d->dst, handle, d->cb, d->data); get_record_data_free(ctxt->priv); @@ -1668,11 +1670,12 @@ failed: int get_record_with_uuid(DBusConnection *conn, DBusMessage *msg, uint16_t dev_id, const char *dst, - uuid_t *uuid, get_record_cb_t *cb, void *data) + const uuid_t *uuid, get_record_cb_t *cb, void *data) { struct pending_connect *c; get_record_data_t *d; int err; + uuid_t *sdp_uuid; /* FIXME: search the cache first! */ @@ -1681,9 +1684,17 @@ int get_record_with_uuid(DBusConnection *conn, DBusMessage *msg, return -EINPROGRESS; } - d = get_record_data_new(dev_id, dst, uuid, cb, data); - if (!d) + sdp_uuid = malloc(sizeof(uuid_t)); + if (!sdp_uuid) + return -ENOMEM; + + memcpy(sdp_uuid, uuid, sizeof(uuid_t)); + + d = get_record_data_new(dev_id, dst, sdp_uuid, cb, data); + if (!d) { + free(sdp_uuid); return -ENOMEM; + } if (!(c = connect_request(conn, msg, dev_id, dst, get_rec_with_uuid_conn_cb, &err))) { diff --git a/hcid/dbus.h b/hcid/dbus.h index f83b5ca8..64f6a002 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -244,9 +244,9 @@ uint16_t sdp_str2svclass(const char *str); typedef void get_record_cb_t(sdp_record_t *rec, void *data, int err); int get_record_with_uuid(DBusConnection *conn, DBusMessage *msg, uint16_t dev_id, const char *dst, - uuid_t *uuid, get_record_cb_t *cb, void *data); + const uuid_t *uuid, get_record_cb_t *cb, void *data); int get_record_with_handle(DBusConnection *conn, DBusMessage *msg, uint16_t dev_id, const char *dst, - uint32_t *handle, get_record_cb_t *cb, void *data); + uint32_t handle, get_record_cb_t *cb, void *data); #endif /* __H_BLUEZ_DBUS_H__ */ |