Date: Tue, 07 Dec 2004 14:44:08 -0800 From: Maksim Yevmenkin <maksim.yevmenkin@savvis.net> To: freebsd-bluetooth@freebsd.org Subject: [patch] libsdp(3) - please test. Message-ID: <41B63238.8050209@savvis.net>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------010207060106030207040500 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hello, please try attached patch for libsdp(3). this patch adds workaround for devices that cannot handle sdp query with attribute id range that has only one attribute id. currently i know of one such device - audiovox smt5600. i suspect that palm treo 650 might have the same problem. if your device worked before it should continue to work. there should be no visible changes. if you have problems then please send me hcidump(1) binary dump (can be created with -w option). thanks, max --------------010207060106030207040500 Content-Type: text/plain; name="libsdp.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="libsdp.patch.txt" Index: search.c =================================================================== RCS file: /usr/local/cvs/lib/libsdp/search.c,v retrieving revision 1.6 diff -u -r1.6 search.c --- search.c 23 Aug 2004 17:52:46 -0000 1.6 +++ search.c 7 Dec 2004 22:22:58 -0000 @@ -55,7 +55,8 @@ sdp_session_p ss = (sdp_session_p) xss; uint8_t *req = NULL, *rsp = NULL, *rsp_tmp = NULL; - int32_t type, len; + int32_t t, len; + uint16_t lo, hi; if (ss == NULL) return (-1); @@ -66,11 +67,29 @@ return (-1); } - /* Calculate length of the request */ req = ss->req; + + /* Calculate ServiceSearchPattern length */ plen = plen * (sizeof(pp[0]) + 1); - alen = alen * (sizeof(ap[0]) + 1); + /* Calculate AttributeIDList length */ + for (len = 0, t = 0; t < alen; t ++) { + lo = (uint16_t) (ap[t] >> 16); + hi = (uint16_t) (ap[t]); + + if (lo > hi) { + ss->error = EINVAL; + return (-1); + } + + if (lo != hi) + len += (sizeof(ap[t]) + 1); + else + len += (sizeof(lo) + 1); + } + alen = len; + + /* Calculate length of the request */ len = plen + sizeof(uint8_t) + sizeof(uint16_t) + /* ServiceSearchPattern */ sizeof(uint16_t) + @@ -97,9 +116,21 @@ /* Put AttributeIDList */ SDP_PUT8(SDP_DATA_SEQ16, req); SDP_PUT16(alen, req); - for (; alen > 0; ap ++, alen -= (sizeof(ap[0]) + 1)) { - SDP_PUT8(SDP_DATA_UINT32, req); - SDP_PUT32(*ap, req); + for (; alen > 0; ap ++) { + lo = (uint16_t) (*ap >> 16); + hi = (uint16_t) (*ap); + + if (lo != hi) { + /* Put attribute range */ + SDP_PUT8(SDP_DATA_UINT32, req); + SDP_PUT32(*ap, req); + alen -= (sizeof(ap[0]) + 1); + } else { + /* Put attribute */ + SDP_PUT8(SDP_DATA_UINT16, req); + SDP_PUT16(lo, req); + alen -= (sizeof(lo) + 1); + } } /* Submit ServiceSearchAttributeRequest and wait for response */ @@ -241,8 +272,8 @@ rsp_tmp = ss->rsp; /* Skip the first SEQ */ - SDP_GET8(type, rsp_tmp); - switch (type) { + SDP_GET8(t, rsp_tmp); + switch (t) { case SDP_DATA_SEQ8: SDP_GET8(len, rsp_tmp); break; @@ -263,8 +294,8 @@ for (; rsp_tmp < rsp && vlen > 0; ) { /* Get set of attributes for the next record */ - SDP_GET8(type, rsp_tmp); - switch (type) { + SDP_GET8(t, rsp_tmp); + switch (t) { case SDP_DATA_SEQ8: SDP_GET8(len, rsp_tmp); break; @@ -286,8 +317,8 @@ /* Now rsp_tmp points to list of (attr,value) pairs */ for (; len > 0 && vlen > 0; vp ++, vlen --) { /* Attribute */ - SDP_GET8(type, rsp_tmp); - if (type != SDP_DATA_UINT16) { + SDP_GET8(t, rsp_tmp); + if (t != SDP_DATA_UINT16) { ss->error = ENOATTR; return (-1); } --------------010207060106030207040500--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?41B63238.8050209>