|
From: Gordon M. <gm...@us...> - 2001-03-24 21:12:09
|
The following files were modified in apps/bluetooth/sdp_server:
Name Old version New version Comment
---- ----------- ----------- -------
sdp_parser.c 1.11 1.11.2.1=20=20=20=20=20=20=20=20
sdp_parser.h 1.3 1.3.2.1=20=20=20=20=20=20=20=20=20
The accompanying log:
Merged from trunk
The diff of the modified file(s):
--- sdp_parser.c 2001/03/06 11:07:37 1.11
+++ sdp_parser.c 2001/03/24 21:11:38 1.11.2.1
@@ -52,6 +52,7 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/ioctl.h>
+#include <sys/uio.h>
=20
#include "sdp_server.h"
#include "sdp_parser.h"
@@ -163,20 +164,23 @@
int sdp_con_id;
data_struct *db_hdl;
=20
+ PRINTPKT(FNC, data, len);=20=20
+
db_hdl =3D (data_struct*) data;
+ data +=3D sizeof *db_hdl;
+ len -=3D sizeof *db_hdl;
=20
- PRINTPKT(FNC, data, len);=20=20
sdp_con_id =3D db_hdl->sdp_con_id;
pkt_len =3D db_hdl->len;
=20
- id =3D db_hdl->data[0];
- trans_id =3D CHAR2INT16(db_hdl->data[1], db_hdl->data[2]);
- par_len =3D CHAR2INT16(db_hdl->data[3], db_hdl->data[4]);
+ id =3D data[0];
+ trans_id =3D CHAR2INT16(data[1], data[2]);
+ par_len =3D CHAR2INT16(data[3], data[4]);
=20
- if (par_len > (len - SDP_HDR_SIZE - sizeof(data_struct)))
+ if (par_len > (len - SDP_HDR_SIZE))
{
- D_XMIT(FNC"Packetlength don't match recievd data length par_len%d, pkt=
_len %d\n", par_len, len);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ D_XMIT(FNC"Packet length does not match received data length par_len %=
d, pkt_len %d\n", par_len, len);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
=20
@@ -185,65 +189,67 @@
switch (id)
{
case SDP_ERROR_RSP:
- switch (CHAR2INT16(db_hdl->data[5], db_hdl->data[6]))
+ switch (CHAR2INT16(data[5], data[6]))
{
- case 0x0001: D_ERR(FNC"Got Invalid/unsupported SDP version\n");
+ case SDP_INVALID_SDP_VERSION:
+ D_ERR(FNC"Got Invalid/unsupported SDP version\n");
break;
- case 0x0002: D_ERR(FNC"Got Invalid Service Record Handle\n");
+ case SDP_INVALID_SERVICE_RECORD_HANDLE:
+ D_ERR(FNC"Got Invalid Service Record Handle\n");
break;
- case 0x0003: D_ERR(FNC"Got Invalid request syntax\n");
+ case SDP_INVALID_REQUEST_SYNTAX:
+ D_ERR(FNC"Got Invalid Request Syntax\n");
break;
- case 0x0004: D_ERR(FNC"Got Invalid PDU Size\n");
+ case SDP_INVALID_PDU_SIZE:
+ D_ERR(FNC"Got Invalid PDU Size\n");
break;
- case 0x0005: D_ERR(FNC"Got Invalid Continuation State\n");
+ case SDP_INVALID_CONTINUATION_STATE:
+ D_ERR(FNC"Got Invalid Continuation State\n");
break;
- case 0x0006: D_ERR(FNC"Got Insufficient Resources to satisfy Request\n=
");
+ case SDP_INSUFFICIENT_RESOURCES:
+ D_ERR(FNC"Got Insufficient Resources to satisfy Request\n");
break;
default:
D_ERR(FNC" Error code 0x%04x is not specified\n",
- CHAR2INT16(db_hdl->data[5], db_hdl->data[6]));
+ CHAR2INT16(data[5], data[6]));
break;
}
break;
=20=09=09
case SDP_SERVICESEARCH_REQ:
D_REC(FNC"SDP_SERVICESEARCH_REQ %d bytes\n", par_len);
- process_service_search_req(sdp_con_id, db_hdl->data + 5, par_len,
- trans_id);
+ process_service_search_req(sdp_con_id, data + 5, par_len, trans_id);
break;
=20=20=20=20=20
case SDP_SERVICESEARCH_RSP:
D_REC(FNC"SDP_SERVICESEARCH_RSP\n");
- process_service_search_rsp(sdp_con_id, db_hdl->data + 5);
+ process_service_search_rsp(sdp_con_id, data + 5);
break;
=20=20=20=20=20
case SDP_SERVICEATTR_REQ:
D_REC(FNC"SDP_SERVICEATTR_REQ\n");
- process_service_attr_req(sdp_con_id, db_hdl->data + 5, par_len,
- trans_id);
+ process_service_attr_req(sdp_con_id, data + 5, par_len, trans_id);
break;
=20=20=20=20=20
case SDP_SERVICEATTR_RSP:
D_REC(FNC"SDP_SERVICEATTR_RSP\n");
- process_service_attr_rsp(sdp_con_id, db_hdl->data + 5);
+ process_service_attr_rsp(sdp_con_id, data + 5);
break;
=20=20=20=20=20
case SDP_SERVICESEARCHATTR_REQ:
D_REC(FNC"SDP_SERVICESEARCHATTR_REQ\n");
- process_service_search_attr_req(sdp_con_id, db_hdl->data + 5, par_len,
- trans_id);
+ process_service_search_attr_req(sdp_con_id, data + 5, par_len, trans_i=
d);
break;
=20=20=20=20=20
case SDP_SERVICESEARCHATTR_RSP:
D_REC(FNC"SDP_SERVICESEARCHATTR_RSP\n");
- process_service_search_attr_rsp(sdp_con_id, db_hdl->data + 5);
+ process_service_search_attr_rsp(sdp_con_id, data + 5);
break;
=20=20=20=20=20
default:
D_REC(FNC"ERROR Invalid pdu type\n");
- /* Send an error response with error code Invalid request
- syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ /* Send an error response with error code Invalid request syntax */
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
break;
}
#undef FNC
@@ -253,8 +259,6 @@
process_service_search_req(int sdp_con_id, unsigned char *data, unsigned s=
hort len, unsigned int trans_id)
{
#define FNC "process_service_search_req: "
- service_search_struct *db_hdl;
-=09
unsigned int service_search_uuid[12];
int service_search_uuid_cnt;
unsigned char des_len;
@@ -268,7 +272,7 @@
{
D_REC(FNC"Incorrect packet: Data Element Sequence expected\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20
@@ -280,7 +284,7 @@
{
D_REC(FNC"Incorrect packet: Incorrect length field or whole packet was=
not received\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20=09
@@ -293,7 +297,7 @@
D_REC(FNC"More than 12 UUID in one request\n");
/* Send an error msg with error code Invalid request
syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
break;
}
=20=09=09
@@ -333,7 +337,7 @@
D_REC(FNC"Unknown UUID size 0x%02x\n",data[cur_pos]);
/* Send an error msg with error code Invalid request
syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
}
@@ -350,13 +354,13 @@
if (len < cur_pos)
{
D_ERR(__FUNCTION__", packet len shorter than actual packet lengthlen:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
else if (len > cur_pos)
{
D_ERR(__FUNCTION__", packet len longer than actual packet length len:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
=20=20=20
@@ -370,28 +374,20 @@
}
else
{
- len =3D sizeof(service_search_struct);
-=20=20=20=20
- db_hdl =3D (service_search_struct*) malloc(len);
- D_MEM("---> malloc%d %d bytes at 0x%08x\n", malloc_dbg++,len, (int)db_=
hdl);
+ service_search_struct db_hdl;
=20=20=20=20=20
- db_hdl->db.sdp_con_id =3D sdp_con_id;
- db_hdl->db.trans_id =3D trans_id;
- db_hdl->db.pkt_type =3D SDP_SERVICESEARCH_REQ;
+ db_hdl.db.sdp_con_id =3D sdp_con_id;
+ db_hdl.db.trans_id =3D trans_id;
+ db_hdl.db.pkt_type =3D SDP_SERVICESEARCH_REQ;
=20=20=20=20=20
- db_hdl->max_rec_cnt =3D max_rec_cnt;
- db_hdl->service_class_cnt =3D service_search_uuid_cnt;
- memcpy(db_hdl->service_class_list, service_search_uuid,
- service_search_uuid_cnt * 4);
+ db_hdl.max_rec_cnt =3D max_rec_cnt;
+ db_hdl.service_class_cnt =3D service_search_uuid_cnt;
+ memcpy(db_hdl.service_class_list, service_search_uuid,
+ service_search_uuid_cnt * sizeof *service_search_uuid);
=20=20=20=20=20
/* Here we ask the database for the requested attributes */
-=20=20=20=20
- handle_query((database_query_struct*) db_hdl);
-=20=20=20=20
- D_MEM("<--- free%d 0x%08x\n",malloc_dbg--, (int) db_hdl);
- free(db_hdl);
+ handle_query(&db_hdl.db);
}
-=20=20=20=20
#undef FNC
}
=20
@@ -429,7 +425,7 @@
{
D_REC(FNC"Incorrect packet: Data Element Sequence expected\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20
@@ -441,7 +437,7 @@
{
D_REC(FNC"Incorrect packet: Incorrect length field or whole packet was=
not received\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20
@@ -485,13 +481,13 @@
if (len < cur_pos)
{
D_ERR(__FUNCTION__", packet len shorter than actual packet lengthlen:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
else if (len > cur_pos)
{
D_ERR(__FUNCTION__", packet len longer than actual packet length len:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
=20=20=20
@@ -503,9 +499,14 @@
}
else
{
- len =3D sizeof(service_attr_struct) + attr_list_pos * 4;
+ len =3D sizeof(service_attr_struct) + attr_list_pos * sizeof *attr_lis=
t;
=20=09
- db_hdl =3D (service_attr_struct*) malloc(len);
+ if (!(db_hdl =3D malloc(len))) {
+ D_ERR(__FUNCTION__ ": malloc failed to allocate %d bytes!\n", =
len);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INSUFFICIENT_RESOURCE=
S);
+ return;
+ }
+
D_MEM("---> malloc%d %d bytes at 0x%08x\n",malloc_dbg++, len, (int)db_=
hdl);
=20=20=20=20=20
db_hdl->db.sdp_con_id =3D sdp_con_id;
@@ -515,11 +516,11 @@
db_hdl->max_attr_byte_cnt =3D max_attr_cnt;
db_hdl->rec_hdl =3D rec_hdl;
db_hdl->attr_cnt =3D attr_list_pos;
- memcpy(db_hdl->attr_list, attr_list, attr_list_pos * 4);
+ memcpy(db_hdl->attr_list, attr_list, attr_list_pos * sizeof *attr_list=
);
=20=20=20=20=20
/* Here we ask the database for the requested attributes */
=20=20=20=20=20
- handle_query((database_query_struct*) db_hdl);
+ handle_query(&db_hdl->db);
=20=20=20=20=20
D_MEM("<--- free%d 0x%08x\n",malloc_dbg--, (int) db_hdl);
free(db_hdl);
@@ -551,7 +552,7 @@
{
D_REC(FNC"Incorrect packet: Data Element Sequence expected\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20
@@ -563,7 +564,7 @@
{
D_REC(FNC"Incorrect packet: Incorrect length field or whole packet was=
not received\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20=20=20
@@ -609,7 +610,7 @@
else
{
D_REC(FNC"Unknown UUID size 0x%02x\n",data[cur_pos]);
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
}
@@ -623,7 +624,7 @@
{
D_REC(FNC"Incorrect packet: Data Element Sequence expected\n");
/* Send an error msg with error code Invalid request syntax */
- send_error_rsp(sdp_con_id, trans_id, 3);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_REQUEST_SYNTAX);
return;
}
=20
@@ -674,13 +675,13 @@
if (len < cur_pos)
{
D_ERR(__FUNCTION__", packet len shorter than actual packet lengthlen:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
else if (len > cur_pos)
{
D_ERR(__FUNCTION__", packet len longer than actual packet length len:%=
d cur_pos:%d\n", len, cur_pos);
- send_error_rsp(sdp_con_id, trans_id, 4);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INVALID_PDU_SIZE);
return;
}
=20=20=20
@@ -692,9 +693,14 @@
}
else
{
- tmp_len =3D sizeof(service_search_attr_struct) + attr_list_pos * 4;
+ tmp_len =3D sizeof(service_search_attr_struct) + attr_list_pos * sizeo=
f *attr_list;
=20=09
- db_hdl =3D (service_search_attr_struct*) malloc(tmp_len);
+ if (!(db_hdl =3D malloc(tmp_len))) {
+ D_ERR(__FUNCTION__ ": malloc failed to allocate %d bytes!\n", =
tmp_len);
+ send_error_rsp(sdp_con_id, trans_id, SDP_INSUFFICIENT_RESOURCE=
S);
+ return;
+ }
+
D_MEM("---> malloc%d %d bytes at 0x%08x\n",malloc_dbg++, tmp_len, (int=
) db_hdl);
=20=20=20=20=20
db_hdl->db.sdp_con_id =3D sdp_con_id;
@@ -703,12 +709,12 @@
=20=20=20=20=20
db_hdl->max_attr_byte_cnt =3D max_attr_cnt;
db_hdl->service_class_cnt =3D service_search_uuid_cnt;
- memcpy(db_hdl->service_class_list, service_search_uuid, service_search=
_uuid_cnt * 4);
+ memcpy(db_hdl->service_class_list, service_search_uuid, service_search=
_uuid_cnt * sizeof *service_search_uuid);
db_hdl->attr_cnt =3D attr_list_pos;
- memcpy(db_hdl->attr_list, attr_list, attr_list_pos * 4);
+ memcpy(db_hdl->attr_list, attr_list, attr_list_pos * sizeof *attr_list=
);
=20=20=20=20=20
/* Here we ask the database for the requested attributes */
- handle_query((database_query_struct*) db_hdl);
+ handle_query(&db_hdl->db);
=20
D_MEM("<--- free%d 0x%08x\n",malloc_dbg--, (int) db_hdl);
free(db_hdl);
@@ -748,8 +754,8 @@
unsigned char sdp_data[7];
unsigned short pdu_len;
=20
- /* Since we not send any error information the pdu length is just the si=
ze
- of the error code length, whoch is two bytes */
+ /* Since we do not send any error information, the pdu length is just the
+ size of the error code length, which is two bytes */
=20
pdu_len =3D 2;
=20=20=20
@@ -794,7 +800,7 @@
return 16;
case 5:
*new_pos =3D 2;
- return *(data + 1);
+ return data[1];
case 6:
*new_pos =3D 3;
return CHAR2INT16(data[1], data[2]);
@@ -808,22 +814,20 @@
void
write2stack(int sdp_con_id, char *data, int len)
{
- data_struct *db_hdl;
- int send_len;
+ data_struct db_hdl;
+ struct iovec vec[2];
=20
D_XMIT("write2stack: writing %d bytes to sdp_con_id %d\n", len,sdp_con_i=
d);
=20=20=20
- send_len =3D sizeof(data_struct) + len;
- db_hdl =3D (data_struct*) malloc(send_len);
- D_MEM("---> malloc%d %d bytes at 0x%08x\n",malloc_dbg++, send_len, (int)=
db_hdl);
+ db_hdl.sdp_con_id =3D sdp_con_id;
+ db_hdl.len =3D len;
=20=20=20
- db_hdl->sdp_con_id =3D sdp_con_id;
- db_hdl->len =3D len;
- memcpy(db_hdl->data, data, len);
+ vec[0].iov_base =3D &db_hdl;
+ vec[0].iov_len =3D sizeof db_hdl;
+ vec[1].iov_base =3D data;
+ vec[1].iov_len =3D len;
=20=20=20
- write(stack_if_fd, (char*) db_hdl, send_len);
- D_MEM("<--- free%d 0x%08x\n",malloc_dbg--, (int) db_hdl);
- free(db_hdl);
+ writev(stack_if_fd, vec, 2);
}
=20
#ifndef BTD_USERSTACK
@@ -949,6 +953,8 @@
exit(1);
}
=20=20=20
+ syslog(LOG_INFO, "SDP Server starting");=20=20
+
xml_file =3D (argc >=3D 2 ? argv[1] : SDP_XML_FILE);
proc_file =3D (argc >=3D 3 ? argv[2] : SDP_PROC_FILE);
=20=20=20
--- sdp_parser.h 2001/03/04 15:46:08 1.3
+++ sdp_parser.h 2001/03/24 21:11:38 1.3.2.1
@@ -70,12 +70,18 @@
((unsigned int)((c1) & 0xff) << 8) + \
(unsigned int)((c0) &0xff))
=20
+#define SDP_INVALID_SDP_VERSION 0x0001
+#define SDP_INVALID_SERVICE_RECORD_HANDLE 0x0002
+#define SDP_INVALID_REQUEST_SYNTAX 0x0003
+#define SDP_INVALID_PDU_SIZE 0x0004
+#define SDP_INVALID_CONTINUATION_STATE 0x0005
+#define SDP_INSUFFICIENT_RESOURCES 0x0006
+
/****************** TYPE DEFINITION SECTION ******************************=
***/
=20
typedef struct data_struct {
unsigned int sdp_con_id;
int len;
- unsigned char data[0];
} data_struct;
=20
/****************** EXPORTED FUNCTION DECLARATION SECTION ****************=
***/
|