r23982: Fix use-after-realloc() found by valgrind and mwallnoefer@yahoo.de.
[ira/wip.git] / source4 / dsdb / samdb / ldb_modules / repl_meta_data.c
index bbd8a1e8a2f14859f3163799c21bbb6da8c7a261..42c91d03cce0f9ebde0fb013e5cdafde2e4507ca 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) Simo Sorce  2004-2006
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005
    Copyright (C) Andrew Tridgell 2005
-   Copyright (C) Stefan Metzmacher 2007
+   Copyright (C) Stefan Metzmacher <metze@samba.org> 2007
 
      ** NOTE! The following LGPL license applies to the ldb
      ** library. This does NOT imply that all of Samba is released
@@ -13,7 +13,7 @@
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 2 of the License, or (at your option) any later version.
+   version 3 of the License, or (at your option) any later version.
 
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,8 +21,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
 /*
@@ -483,6 +482,8 @@ static int replmd_add_originating(struct ldb_module *module,
                struct replPropertyMetaData1 *m = &nmd.ctr.ctr1.array[ni];
                const struct dsdb_attribute *sa;
 
+               if (e->name[0] == '@') continue;
+
                sa = dsdb_attribute_by_lDAPDisplayName(schema, e->name);
                if (!sa) {
                        ldb_debug_set(module->ldb, LDB_DEBUG_ERROR,
@@ -700,7 +701,7 @@ static int replmd_replicated_apply_add_callback(struct ldb_context *ldb,
                                                void *private_data,
                                                struct ldb_reply *ares)
 {
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        struct replmd_replicated_request *ar = talloc_get_type(private_data,
                                               struct replmd_replicated_request);
 
@@ -794,7 +795,7 @@ static int replmd_replicated_apply_add(struct replmd_replicated_request *ar)
                                replmd_replicated_apply_add_callback);
        if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return ldb_next_request(ar->module, ar->sub.change_req);
 #else
        ret = ldb_next_request(ar->module, ar->sub.change_req);
@@ -839,7 +840,7 @@ static int replmd_replicated_apply_merge_callback(struct ldb_context *ldb,
                                                  void *private_data,
                                                  struct ldb_reply *ares)
 {
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        struct replmd_replicated_request *ar = talloc_get_type(private_data,
                                               struct replmd_replicated_request);
 
@@ -1034,7 +1035,7 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
                                replmd_replicated_apply_merge_callback);
        if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return ldb_next_request(ar->module, ar->sub.change_req);
 #else
        ret = ldb_next_request(ar->module, ar->sub.change_req);
@@ -1077,7 +1078,7 @@ static int replmd_replicated_apply_search_callback(struct ldb_context *ldb,
 
        talloc_free(ares);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        if (is_done) {
                ar->sub.search_ret = ldb_wait(ar->sub.search_req->handle, LDB_WAIT_ALL);
                if (ar->sub.search_ret != LDB_SUCCESS) {
@@ -1117,7 +1118,7 @@ static int replmd_replicated_apply_search(struct replmd_replicated_request *ar)
                                   replmd_replicated_apply_search_callback);
        if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return ldb_next_request(ar->module, ar->sub.search_req);
 #else
        ret = ldb_next_request(ar->module, ar->sub.search_req);
@@ -1137,7 +1138,7 @@ static int replmd_replicated_apply_search(struct replmd_replicated_request *ar)
 
 static int replmd_replicated_apply_next(struct replmd_replicated_request *ar)
 {
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        if (ar->index_current >= ar->objs->num_objects) {
                return replmd_replicated_uptodate_vector(ar);
        }
@@ -1153,7 +1154,7 @@ static int replmd_replicated_uptodate_modify_callback(struct ldb_context *ldb,
                                                      void *private_data,
                                                      struct ldb_reply *ares)
 {
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        struct replmd_replicated_request *ar = talloc_get_type(private_data,
                                               struct replmd_replicated_request);
 
@@ -1453,7 +1454,7 @@ static int replmd_replicated_uptodate_modify(struct replmd_replicated_request *a
                                replmd_replicated_uptodate_modify_callback);
        if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return ldb_next_request(ar->module, ar->sub.change_req);
 #else
        ret = ldb_next_request(ar->module, ar->sub.change_req);
@@ -1493,7 +1494,7 @@ static int replmd_replicated_uptodate_search_callback(struct ldb_context *ldb,
 
        talloc_free(ares);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        if (is_done) {
                ar->sub.search_ret = ldb_wait(ar->sub.search_req->handle, LDB_WAIT_ALL);
                if (ar->sub.search_ret != LDB_SUCCESS) {
@@ -1530,7 +1531,7 @@ static int replmd_replicated_uptodate_search(struct replmd_replicated_request *a
                                   replmd_replicated_uptodate_search_callback);
        if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return ldb_next_request(ar->module, ar->sub.search_req);
 #else
        ret = ldb_next_request(ar->module, ar->sub.search_req);
@@ -1580,7 +1581,7 @@ static int replmd_extended_replicated_objects(struct ldb_module *module, struct
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
-#ifdef REPLMD_FULL_ASYNC /* TODO: active this code when ldb support full async code */ 
+#ifdef REPLMD_FULL_ASYNC /* TODO: activate this code when ldb support full async code */ 
        return replmd_replicated_apply_next(ar);
 #else
        while (ar->index_current < ar->objs->num_objects &&