]> arthur.barton.de Git - netatalk.git/commitdiff
Fix dalloc_add() calls, change string handling in dalloc
authorFrank Lahm <franklahm@googlemail.com>
Tue, 25 Sep 2012 20:41:39 +0000 (22:41 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Tue, 25 Sep 2012 20:41:39 +0000 (22:41 +0200)
etc/afpd/spotlight.c
etc/afpd/spotlight_marshalling.c
etc/afpd/spotlight_module.c
include/atalk/dalloc.h
libatalk/talloc/dalloc.c

index 4b5fdd248d5363c78c85547b1870532456bc9f98..0945f7140cb23e223ddcb56d57c1765ff5673cda 100644 (file)
@@ -73,9 +73,7 @@ static int dd_dump(DALLOC_CTX *dd, int nestinglevel)
             memcpy(&i, dd->dd_talloc_array[n], sizeof(uint64_t));
             LOG(log_debug, logtype_sl, "%suint64_t: 0x%04x", neststrings[nestinglevel + 1], i);
         } else if (STRCMP(type, ==, "char *")) {
-            char *s;
-            memcpy(&s, dd->dd_talloc_array[n], sizeof(char *));
-            LOG(log_debug, logtype_sl, "%sstring: %s", neststrings[nestinglevel + 1], s);
+            LOG(log_debug, logtype_sl, "%sstring: %s", neststrings[nestinglevel + 1], (char *)dd->dd_talloc_array[n]);
         } else if (STRCMP(type, ==, "sl_bool_t")) {
             sl_bool_t bl;
             memcpy(&bl, dd->dd_talloc_array[n], sizeof(sl_bool_t));
@@ -89,6 +87,8 @@ static int dd_dump(DALLOC_CTX *dd, int nestinglevel)
                    neststrings[nestinglevel + 1], cnids.ca_unkn1, cnids.ca_context);
             if (cnids.ca_cnids)
                 dd_dump(cnids.ca_cnids, nestinglevel + 2);
+        } else {
+            LOG(log_debug, logtype_sl, "%stype: %s", neststrings[nestinglevel + 1], type);
         }
     }
     LOG(log_debug, logtype_sl, "%s}", neststrings[nestinglevel]);
@@ -158,37 +158,37 @@ static int sl_rpc_fetchPropertiesForContext(const AFPObj *obj, const DALLOC_CTX
     dict = talloc_zero(reply, sl_dict_t);
 
     /* key/val 1 */
-    s = talloc_strdup(dict, "kMDSStoreMetaScopes");
-    dalloc_add_copy(dict, &s, char *);
+    s = dalloc_strdup(dict, "kMDSStoreMetaScopes");
+    dalloc_add(dict, s, char *);
 
     array = talloc_zero(dict, sl_array_t);
-    s = talloc_strdup(array, "kMDQueryScopeComputer");
-    dalloc_add_copy(array, &s, char *);
-    dalloc_add_copy(dict, array, sl_array_t);
+    s = dalloc_strdup(array, "kMDQueryScopeComputer");
+    dalloc_add(array, s, char *);
+    dalloc_add(dict, array, sl_array_t);
 
     /* key/val 2 */
-    s = talloc_strdup(dict, "kMDSStorePathScopes");
-    dalloc_add_copy(dict, &s, char *);
+    s = dalloc_strdup(dict, "kMDSStorePathScopes");
+    dalloc_add(dict, s, char *);
 
     array = talloc_zero(dict, sl_array_t);
-    s = talloc_strdup(array, v->v_path);
-    dalloc_add_copy(array, &s, char *);
-    dalloc_add_copy(dict, array, sl_array_t);
+    s = dalloc_strdup(array, v->v_path);
+    dalloc_add(array, s, char *);
+    dalloc_add(dict, array, sl_array_t);
 
     /* key/val 3 */
-    s = talloc_strdup(dict, "kMDSStoreUUID");
-    dalloc_add_copy(dict, &s, char *);
+    s = dalloc_strdup(dict, "kMDSStoreUUID");
+    dalloc_add(dict, s, char *);
 
     memcpy(uuid.sl_uuid, v->v_uuid, 16);
     dalloc_add_copy(dict, &uuid, sl_uuid_t);
 
     /* key/val 4 */
-    s = talloc_strdup(dict, "kMDSStoreHasPersistentUUID");
-    dalloc_add_copy(dict, &s, char *);
+    s = dalloc_strdup(dict, "kMDSStoreHasPersistentUUID");
+    dalloc_add(dict, s, char *);
     sl_bool_t b = true;
     dalloc_add_copy(dict, &b, sl_bool_t);
 
-    dalloc_add_copy(reply, dict, sl_dict_t);
+    dalloc_add(reply, dict, sl_dict_t);
 
 EC_CLEANUP:
     EC_EXIT;
@@ -197,7 +197,7 @@ EC_CLEANUP:
 static int sl_rpc_openQuery(AFPObj *obj, const DALLOC_CTX *query, DALLOC_CTX *reply, struct vol *v)
 {
     EC_INIT;
-    char **sl_query;
+    char *sl_query;
     uint64_t *uint64;
     DALLOC_CTX *reqinfo;
     sl_array_t *array;
@@ -208,8 +208,8 @@ static int sl_rpc_openQuery(AFPObj *obj, const DALLOC_CTX *query, DALLOC_CTX *re
     slq->slq_obj = obj;
     slq->slq_vol = v;
     EC_NULL_LOG( sl_query = dalloc_value_for_key(query, "DALLOC_CTX", 0, "DALLOC_CTX", 1, "kMDQueryString") );
-    LOG(log_debug, logtype_sl, "sl_rpc_openQuery: %s", *sl_query);
-    slq->slq_qstring = talloc_steal(slq, *sl_query);
+    LOG(log_debug, logtype_sl, "sl_rpc_openQuery: %s", sl_query);
+    slq->slq_qstring = talloc_steal(slq, sl_query);
     slq->slq_state = SLQ_STATE_NEW;
     slq->slq_time = time(NULL);
     EC_NULL_LOG( uint64 = dalloc_get(query, "DALLOC_CTX", 0, "DALLOC_CTX", 0, "uint64_t", 1) );
@@ -232,7 +232,7 @@ EC_CLEANUP:
     array = talloc_zero(reply, sl_array_t);
     uint64_t sl_res = ret == 0 ? 0 : UINT64_MAX;
     dalloc_add_copy(array, &sl_res, uint64_t);
-    dalloc_add_copy(reply, array, sl_array_t);
+    dalloc_add(reply, array, sl_array_t);
 
     EC_EXIT;
 }
@@ -265,7 +265,7 @@ static int sl_rpc_fetchQueryResultsForContext(const AFPObj *obj, const DALLOC_CT
 
 EC_CLEANUP:
 
-    dalloc_add_copy(reply, array, sl_array_t);
+    dalloc_add(reply, array, sl_array_t);
 
     EC_EXIT;
 }
@@ -357,14 +357,14 @@ int afp_spotlight_rpc(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_
         LOG(log_debug, logtype_sl, "afp_spotlight_rpc: Request dump:");
         dd_dump(query, 0);
 
-        char **cmd;
+        char *cmd;
         EC_NULL_LOG( cmd = dalloc_get(query, "DALLOC_CTX", 0, "DALLOC_CTX", 0, "char *", 0) );
 
-        if (STRCMP(*cmd, ==, "fetchPropertiesForContext:")) {
+        if (STRCMP(cmd, ==, "fetchPropertiesForContext:")) {
             EC_ZERO_LOG( sl_rpc_fetchPropertiesForContext(obj, query, reply, vol) );
-        } else if (STRCMP(*cmd, ==, "openQueryWithParams:forContext:")) {
+        } else if (STRCMP(cmd, ==, "openQueryWithParams:forContext:")) {
             EC_ZERO_LOG( sl_rpc_openQuery(obj, query, reply, vol) );
-        } else if (STRCMP(*cmd, ==, "fetchQueryResultsForContext:")) {
+        } else if (STRCMP(cmd, ==, "fetchQueryResultsForContext:")) {
             EC_ZERO_LOG( sl_rpc_fetchQueryResultsForContext(obj, query, reply, vol) );
         }
 
@@ -411,8 +411,8 @@ int main(int argc, char **argv)
 
     i = 1;
     dalloc_add_copy(dd, &i, uint64_t);
-    char *str = talloc_strdup(dd, "hello world");
-    dalloc_add_copy(dd, &str, char *);
+    char *str = dalloc_strdup(dd, "hello world");
+    dalloc_add(dd, str, char *);
     sl_bool_t b = true;
     dalloc_add_copy(dd, &b, sl_bool_t);
 
@@ -420,7 +420,7 @@ int main(int argc, char **argv)
     DALLOC_CTX *nested = talloc_zero(dd, DALLOC_CTX);
     i = 3;
     dalloc_add_copy(nested, &i, uint64_t);
-    dalloc_add_copy(dd, nested, DALLOC_CTX);
+    dalloc_add(dd, nested, DALLOC_CTX);
 
     /* test an allocated CNID array */
     uint64_t id = 16;
@@ -428,21 +428,20 @@ int main(int argc, char **argv)
     cnids->ca_cnids = talloc_zero(cnids, DALLOC_CTX);
     cnids->ca_unkn1 = 1;
     dalloc_add_copy(cnids->ca_cnids, &id, uint64_t);
-    dalloc_add_copy(dd, cnids, sl_cnids_t);
+    dalloc_add(dd, cnids, sl_cnids_t);
 
     /* Now the Spotlight types */
     sl_array_t *sl_array = talloc_zero(dd, sl_array_t);
     i = 0x1234;
     dalloc_add_copy(sl_array, &i, uint64_t);
-    i = 0x5678;
-    dalloc_add_copy(sl_array, &i, uint64_t);
 
     sl_dict_t *sl_dict = talloc_zero(dd, sl_dict_t);
     i = 0xffff;
     dalloc_add_copy(sl_dict, &i, uint64_t);
-    dalloc_add_copy(sl_array, sl_dict, sl_dict_t);
+    dalloc_add(sl_array, sl_dict, sl_dict_t);
+
+    dalloc_add(dd, sl_array, sl_array_t);
 
-    dalloc_add_copy(dd, sl_array, sl_array_t);
     dd_dump(dd, 0);
 
     /* now parse a real spotlight packet */
index f291fc1cc4c555760846eca69538a0e3149c555a..6ca92b19006235b36d141ad7ae3654c824e0792b 100644 (file)
@@ -236,10 +236,9 @@ static int sl_pack_filemeta(sl_filemeta_t *fm, char *buf, int offset, char *toc_
     return offset;
 }
 
-static int sl_pack_string(char **string, char *buf, int offset, char *toc_buf, int *toc_idx)
+static int sl_pack_string(char *s, char *buf, int offset, char *toc_buf, int *toc_idx)
 {
     int len, octets, used_in_last_octet;
-    char *s = *string;
     len = strlen(s);
     octets = (len / 8) + (len & 7 ? 1 : 0);
     used_in_last_octet = 8 - (octets * 8 - len);
@@ -421,9 +420,10 @@ static int sl_unpack_CNID(DALLOC_CTX *query, const char *buf, int offset, int le
     EC_INIT;
     int count;
     uint64_t query_data64;
-    sl_cnids_t cnids;
+    sl_cnids_t *cnids;
 
-    EC_NULL( cnids.ca_cnids = talloc_zero(query, DALLOC_CTX) );
+    EC_NULL( cnids = talloc_zero(query, sl_cnids_t) );
+    EC_NULL( cnids->ca_cnids = talloc_zero(cnids, DALLOC_CTX) );
 
     if (length <= 16)
         /* that's permitted, it's an empty array */
@@ -432,18 +432,18 @@ static int sl_unpack_CNID(DALLOC_CTX *query, const char *buf, int offset, int le
     query_data64 = sl_unpack_uint64(buf, offset, encoding);
     count = query_data64 & 0xffff;
 
-    cnids.ca_unkn1 = (query_data64 & 0xffff0000) >> 16;
-    cnids.ca_context = query_data64 >> 32;
+    cnids->ca_unkn1 = (query_data64 & 0xffff0000) >> 16;
+    cnids->ca_context = query_data64 >> 32;
 
     offset += 8;
 
     while (count --) {
         query_data64 = sl_unpack_uint64(buf, offset, encoding);
-        dalloc_add_copy(cnids.ca_cnids, &query_data64, uint64_t);
+        dalloc_add_copy(cnids->ca_cnids, &query_data64, uint64_t);
         offset += 8;
     }
 
-    dalloc_add_copy(query, &cnids, sl_cnids_t);
+    dalloc_add(query, cnids, sl_cnids_t);
 
 EC_CLEANUP:
     EC_EXIT;
@@ -515,13 +515,13 @@ static int sl_unpack_cpx(DALLOC_CTX *query,
     case SQ_CPX_TYPE_ARRAY:
         sl_array = talloc_zero(query, sl_array_t);
         EC_NEG1_LOG( roffset = sl_unpack_loop(sl_array, buf, offset, cpx_query_count, toc_offset, encoding) );
-        dalloc_add_copy(query, sl_array, sl_array_t);
+        dalloc_add(query, sl_array, sl_array_t);
         break;
 
     case SQ_CPX_TYPE_DICT:
         sl_dict = talloc_zero(query, sl_dict_t);
         EC_NEG1_LOG( roffset = sl_unpack_loop(sl_dict, buf, offset, cpx_query_count, toc_offset, encoding) );
-        dalloc_add_copy(query, sl_dict, sl_dict_t);
+        dalloc_add(query, sl_dict, sl_dict_t);
         break;
 
     case SQ_CPX_TYPE_STRING:
@@ -532,7 +532,7 @@ static int sl_unpack_cpx(DALLOC_CTX *query,
         slen = qlen - 8 + used_in_last_block;
 
         if (cpx_query_type == SQ_CPX_TYPE_STRING) {
-            p = talloc_strndup(query, buf + offset + 8, slen);
+            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);
@@ -540,7 +540,7 @@ static int sl_unpack_cpx(DALLOC_CTX *query,
             EC_NEG1( convert_string_allocate(CH_UCS2, CH_UTF8, buf + offset + (mark_exists ? 18 : 16), slen, &p) );
         }
 
-        dalloc_add_copy(query, &p, char *);
+        dalloc_add(query, p, char *);
         roffset += qlen;
         break;
 
@@ -552,7 +552,7 @@ static int sl_unpack_cpx(DALLOC_CTX *query,
         } else {
             sl_fm = talloc_zero(query, sl_filemeta_t);
             EC_NEG1_LOG( sl_unpack(sl_fm, buf + offset + 8) );
-            dalloc_add_copy(query, sl_fm, sl_filemeta_t);
+            dalloc_add(query, sl_fm, sl_filemeta_t);
         }
         roffset += qlen;
         break;
index df914a3f2b069fe19a09fc3567a9d13b3892b931..d9a3280b5de5ae44b20dfac15baa9d15dc529425 100644 (file)
@@ -72,7 +72,7 @@ static const gchar *map_spotlight_to_sparql_query(slq_t *slq)
 
     EC_NULL_LOG( word = strstr(slquery, "*==") );
     word += 4; /* skip *== and the left enclosing quote */
-    EC_NULL( word = talloc_strdup(slq, word) );
+    EC_NULL( word = dalloc_strdup(slq, word) );
     /* Search asterisk */
     EC_NULL_LOG( p = strchr(word, '*') );
     *p = 0;
@@ -151,7 +151,7 @@ static int add_filemeta(DALLOC_CTX *reqinfo, const int metacount, sl_array_t *fm
         dalloc_add_copy(meta, &nil, sl_nil_t);
     }
 
-    dalloc_add_copy(fm_array, meta, sl_array_t);
+    dalloc_add(fm_array, meta, sl_array_t);
 
 EC_CLEANUP:
     EC_EXIT;
@@ -184,7 +184,7 @@ static int sl_mod_fetch_result(void *p)
     /* Prepare FileMeta */
     fm = talloc_zero(slq->slq_reply, sl_filemeta_t);
     fm_array = talloc_zero(fm, sl_array_t);
-    dalloc_add_copy(fm, fm_array, sl_array_t);
+    dalloc_add(fm, fm_array, sl_array_t);
 
     while (tracker_sparql_cursor_next(slq->slq_tracker_cursor, NULL, &error)) {
         EC_NULL_LOG( path = tracker_sparql_cursor_get_string(slq->slq_tracker_cursor, 0, NULL) );
@@ -199,8 +199,8 @@ static int sl_mod_fetch_result(void *p)
         dalloc_add_copy(cnids->ca_cnids, &uint64, uint64_t);
         add_filemeta(slq->slq_reqinfo, slq->slq_metacount, fm_array, id, path);
     }
-    dalloc_add_copy(slq->slq_reply, cnids, sl_cnids_t);
-    dalloc_add_copy(slq->slq_reply, fm, sl_filemeta_t);
+    dalloc_add(slq->slq_reply, cnids, sl_cnids_t);
+    dalloc_add(slq->slq_reply, fm, sl_filemeta_t);
 
 EC_CLEANUP:
     if (slq->slq_tracker_cursor)
index 8784f9eb0f16911010fc98ef361ea29da3f73264..4e963cd6d0654f8d166f2499b56f50b4f3a3dd0d 100644 (file)
@@ -34,4 +34,6 @@ extern int dalloc_add_talloc_chunk(DALLOC_CTX *dd, void *talloc_chunk, void *obj
 extern void *dalloc_get(const DALLOC_CTX *d, ...);
 extern void *dalloc_value_for_key(const DALLOC_CTX *d, ...);
 extern int dalloc_size(DALLOC_CTX *d);
+extern char *dalloc_strdup(const void *ctx, const char *string);
+extern char *dalloc_strndup(const void *ctx, const char *string, size_t n);
 #endif  /* DALLOC_H */
index 37af665c1b8556a09f608ea6578b8a4d9287decf..4c06f0656e501275e40d241a976580436f2d9139 100644 (file)
@@ -121,8 +121,12 @@ void *dalloc_value_for_key(const DALLOC_CTX *d, ...)
     }
 
     for (elem = 0; elem + 1 < talloc_array_length(d->dd_talloc_array); elem += 2) {
-        memcpy(&s, d->dd_talloc_array[elem], sizeof(char *));
-        if (STRCMP(s, ==, type)) {
+        if (STRCMP(talloc_get_name(d->dd_talloc_array[elem]), !=, "char *")) {
+            LOG(log_error, logtype_default, "dalloc_value_for_key: key not a string: %s",
+                talloc_get_name(d->dd_talloc_array[elem]));
+            EC_FAIL;
+        }
+        if (STRCMP((char *)d->dd_talloc_array[elem], ==, type)) {
             p = d->dd_talloc_array[elem + 1];
             break;
         }            
@@ -134,3 +138,37 @@ EC_CLEANUP:
         p = NULL;
     return p;
 }
+
+char *dalloc_strdup(const void *ctx, const char *string)
+{
+    EC_INIT;
+    char *p;
+
+    EC_NULL( p = talloc_strdup(ctx, string) );
+    talloc_set_name(p, "char *");
+
+EC_CLEANUP:
+    if (ret != 0) {
+        if (p)
+            talloc_free(p);
+        p = NULL;
+    }
+    return p;
+}
+
+char *dalloc_strndup(const void *ctx, const char *string, size_t n)
+{
+    EC_INIT;
+    char *p;
+
+    EC_NULL( p = talloc_strndup(ctx, string, n) );
+    talloc_set_name(p, "char *");
+
+EC_CLEANUP:
+    if (ret != 0) {
+        if (p)
+            talloc_free(p);
+        p = NULL;
+    }
+    return p;
+}