s3:winbind: in idmap_tdb2_sid_to_id(), use transaction wrapped stores.
authorMichael Adam <obnox@samba.org>
Wed, 29 Jul 2009 11:43:29 +0000 (13:43 +0200)
committerMichael Adam <obnox@samba.org>
Wed, 29 Jul 2009 14:26:20 +0000 (16:26 +0200)
When a mapping is not found, then the idmap script is called (if defined).
When this gives a reply for the desired sid, this reply is stored in the db.

This patch wraps theses two store operations into a transaction by re-using
the idmap_tdb2_set_mapping_action() function previously defined
for idmap_tdb2_set_mapping().

Michael

source3/winbindd/idmap_tdb2.c

index 6ae13d9777b1071ec84235d00ce9eb62580a7500..92e1db8460e03d973dc8fc6fc1915bb69b010fd7 100644 (file)
@@ -704,7 +704,8 @@ static NTSTATUS idmap_tdb2_sid_to_id(struct idmap_tdb2_context *ctx, struct id_m
        /* Check if sid is present in database */
        data = dbwrap_fetch_bystring(idmap_tdb2, tmp_ctx, keystr);
        if (!data.dptr) {
-               fstring idstr;
+               char *idstr;
+               struct idmap_tdb2_set_mapping_context store_state;
 
                DEBUG(10,(__location__ " Record %s not found\n", keystr));
 
@@ -719,14 +720,19 @@ static NTSTATUS idmap_tdb2_sid_to_id(struct idmap_tdb2_context *ctx, struct id_m
                        goto done;
                }
 
-               snprintf(idstr, sizeof(idstr), "%cID %lu", 
-                        map->xid.type == ID_TYPE_UID?'U':'G',
-                        (unsigned long)map->xid.id);
-               /* store both forward and reverse mappings */
-               dbwrap_store_bystring(idmap_tdb2, keystr, string_term_tdb_data(idstr),
-                                   TDB_REPLACE);
-               dbwrap_store_bystring(idmap_tdb2, idstr, string_term_tdb_data(keystr),
-                                   TDB_REPLACE);
+               idstr = talloc_asprintf(tmp_ctx, "%cID %lu",
+                                       map->xid.type == ID_TYPE_UID?'U':'G',
+                                       (unsigned long)map->xid.id);
+               if (idstr == NULL) {
+                       ret = NT_STATUS_NO_MEMORY;
+                       goto done;
+               }
+
+               store_state.ksidstr = keystr;
+               store_state.kidstr = idstr;
+
+               ret = dbwrap_trans_do(idmap_tdb2, idmap_tdb2_set_mapping_action,
+                                     &store_state);
                goto done;
        }