s3:idmap: don't call idmap_new_mapping idmap_sid_to_unixid.
authorMichael Adam <obnox@samba.org>
Fri, 14 May 2010 14:18:16 +0000 (16:18 +0200)
committerMichael Adam <obnox@samba.org>
Sat, 14 Aug 2010 00:10:36 +0000 (02:10 +0200)
The setting of a new mapping is moved into the backend code
to achieve atomicity and greater flexibility.

Michael

source3/winbindd/idmap_util.c

index a8974a902451ac4a7b46075406889528176efd69..68b3250e8defcd3cfe14d42cce3d8a0ee09df42f 100644 (file)
@@ -178,45 +178,35 @@ backend:
 
        ret = idmap_backends_sid_to_unixid(dom_name, &map);
 
-       if (NT_STATUS_IS_OK(ret) && (map.status == ID_MAPPED)) {
-               if (map.xid.type != ID_TYPE_UID) {
-                       DEBUG(10, ("sid [%s] not mapped to a uid "
-                                  "[%u,%u,%u]\n",
-                                  sid_string_dbg(sid),
-                                  map.status,
-                                  map.xid.type,
-                                  map.xid.id));
-                       if (winbindd_use_idmap_cache()) {
-                               idmap_cache_set_sid2uid(sid, -1);
-                       }
-                       return NT_STATUS_NONE_MAPPED;
+       if (!NT_STATUS_IS_OK(ret)) {
+               DEBUG(10, ("idmap_backends_sid_to_unixid failed: %s\n",
+                          nt_errstr(ret)));
+               if (winbindd_use_idmap_cache()) {
+                       idmap_cache_set_sid2uid(sid, -1);
                }
-               goto done;
+               return ret;
        }
 
-       if (dom_name[0] != '\0') {
-               /*
-                * We had the task to go to a specific domain which
-                * could not answer our request. Fail.
-                */
+       if (map.status != ID_MAPPED) {
                if (winbindd_use_idmap_cache()) {
                        idmap_cache_set_sid2uid(sid, -1);
                }
                return NT_STATUS_NONE_MAPPED;
        }
 
-       ret = idmap_new_mapping(sid, ID_TYPE_UID, &map.xid);
-
-       if (!NT_STATUS_IS_OK(ret)) {
-               DEBUG(10, ("idmap_new_mapping failed: %s\n",
-                          nt_errstr(ret)));
+       if (map.xid.type != ID_TYPE_UID) {
+               DEBUG(10, ("sid [%s] not mapped to a uid "
+                          "[%u,%u,%u]\n",
+                          sid_string_dbg(sid),
+                          map.status,
+                          map.xid.type,
+                          map.xid.id));
                if (winbindd_use_idmap_cache()) {
                        idmap_cache_set_sid2uid(sid, -1);
                }
-               return ret;
+               return NT_STATUS_NONE_MAPPED;
        }
 
-done:
        *uid = (uid_t)map.xid.id;
        if (winbindd_use_idmap_cache()) {
                idmap_cache_set_sid2uid(sid, *uid);