#include <atalk/netatalk_conf.h>
#include <atalk/volume.h>
#include <atalk/dsi.h>
-
-#include "spotlight.h"
+#include <atalk/spotlight.h>
#define MAX_SLQ_DAT (DSI_DATASIZ - 64)
#define MAX_SLQ_TOC 8192
static uint spotlight_get_utf16_string_encoding(const char *buf, int offset, int query_length, uint encoding) {
uint utf16_encoding;
- /* check for byte order mark */
- utf16_encoding = SL_ENC_BIG_ENDIAN;
- if (query_length >= 2) {
- uint16_t byte_order_mark;
- if (encoding == SL_ENC_LITTLE_ENDIAN)
- byte_order_mark = SVAL(buf, offset);
- else
- byte_order_mark = RSVAL(buf, offset);
+ /* Assumed encoding in absence of a bom is little endian */
+ utf16_encoding = SL_ENC_LITTLE_ENDIAN;
- if (byte_order_mark == 0xFFFE) {
- utf16_encoding = SL_ENC_BIG_ENDIAN | SL_ENC_UTF_16;
- }
- else if (byte_order_mark == 0xFEFF) {
+ if (query_length >= 2) {
+ uint8_t le_bom[] = {0xff, 0xfe};
+ uint8_t be_bom[] = {0xfe, 0xff};
+ if (memcmp(le_bom, buf + offset, sizeof(uint16_t)) == 0)
utf16_encoding = SL_ENC_LITTLE_ENDIAN | SL_ENC_UTF_16;
- }
+ else if (memcmp(be_bom, buf + offset, sizeof(uint16_t)) == 0)
+ utf16_encoding = SL_ENC_BIG_ENDIAN | SL_ENC_UTF_16;
}
return utf16_encoding;
uint64_t query_data64;
uint unicode_encoding;
uint8_t mark_exists;
- char *p;
+ char *p, *tmp;
int qlen, used_in_last_block, slen;
sl_array_t *sl_array;
sl_dict_t *sl_dict;
query_data64 = sl_unpack_uint64(buf, offset, encoding);
qlen = (query_data64 & 0xffff) * 8;
used_in_last_block = query_data64 >> 32;
- slen = qlen - 8 + used_in_last_block;
+ slen = qlen - 16 + used_in_last_block;
if (cpx_query_type == SQ_CPX_TYPE_STRING) {
p = dalloc_strndup(query, buf + offset + 8, slen);
} else {
unicode_encoding = spotlight_get_utf16_string_encoding(buf, offset + 8, slen, encoding);
mark_exists = (unicode_encoding & SL_ENC_UTF_16);
- unicode_encoding &= ~SL_ENC_UTF_16;
- EC_NEG1( convert_string_allocate(CH_UCS2, CH_UTF8, buf + offset + (mark_exists ? 18 : 16), slen, &p) );
+ if (unicode_encoding & SL_ENC_BIG_ENDIAN)
+ EC_FAIL_LOG("Unsupported big endian UTF16 string");
+ slen -= mark_exists ? 2 : 0;
+ EC_NEG1( convert_string_allocate(CH_UCS2,
+ CH_UTF8,
+ buf + offset + (mark_exists ? 10 : 8),
+ slen,
+ &tmp) );
+ p = dalloc_strndup(query, tmp, strlen(tmp));
+ free(tmp);
}
dalloc_add(query, p, char *);