getncchanges: improve get_nc_changes_build_object() by checking uSNChanged
authorStefan Metzmacher <metze@samba.org>
Tue, 7 Feb 2017 11:28:33 +0000 (12:28 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 8 Feb 2017 22:20:18 +0000 (23:20 +0100)
This will make a difference once we handle DRSUAPI_DRS_GET_ANC correctly.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12398

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/rpc_server/drsuapi/getncchanges.c

index f0e556793afc1aa77ec6168c31b6521b5d8fa7df..6fe115d247d003700a3a339c5f5478e348bb6e56 100644 (file)
@@ -212,6 +212,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
        uint32_t *attids;
        const char *rdn;
        const struct dsdb_attribute *rdn_sa;
+       uint64_t uSNChanged;
        unsigned int instanceType;
        struct dsdb_syntax_ctx syntax_ctx;
 
@@ -219,6 +220,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
        dsdb_syntax_ctx_init(&syntax_ctx, sam_ctx, schema);
        syntax_ctx.is_schema_nc = is_schema_nc;
 
+       uSNChanged = ldb_msg_find_attr_as_uint64(msg, "uSNChanged", 0);
        instanceType = ldb_msg_find_attr_as_uint(msg, "instanceType", 0);
        if (instanceType & INSTANCE_TYPE_IS_NC_HEAD) {
                obj->is_nc_prefix = true;
@@ -249,6 +251,11 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
                return WERR_OK;
        }
 
+       if (uSNChanged <= highest_usn) {
+               /* nothing to send */
+               return WERR_OK;
+       }
+
        ndr_err = ndr_pull_struct_blob(md_value, obj, &md,
                                       (ndr_pull_flags_fn_t)ndr_pull_replPropertyMetaDataBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {