s3:winbind:idmap_ldap: warn about duplicate SID->XID mappings (bug #6387)
authorMichael Adam <obnox@samba.org>
Mon, 25 May 2009 09:54:43 +0000 (11:54 +0200)
committerMichael Adam <obnox@samba.org>
Mon, 25 May 2009 13:21:29 +0000 (15:21 +0200)
With the current infrastructure, we should not return error on
duplicate mappings but just warn instead (because an error would
trigger the attempt to create yet another mapping).

Michael
(cherry picked from commit 3111d78001f458cfcaf81123a1d1c23d5927a6c2)

source3/winbindd/idmap_ldap.c

index 63108040fd0b633d9de4e783ac24f0721c3c0d86..88ece8c7de4706d0eff30a38da73524a3165fec0 100644 (file)
@@ -1257,8 +1257,6 @@ again:
                        continue;
                }
 
-               TALLOC_FREE(sidstr);
-
                /* now try to see if it is a uid, if not try with a gid
                 * (gid is more common, but in case both uidNumber and
                 * gidNumber are returned the SID is mapped to the uid
@@ -1276,6 +1274,7 @@ again:
                if ( ! tmp) { /* no ids ?? */
                        DEBUG(5, ("no uidNumber, "
                                  "nor gidNumber attributes found\n"));
+                       TALLOC_FREE(sidstr);
                        continue;
                }
 
@@ -1286,11 +1285,21 @@ again:
                        DEBUG(5, ("Requested id (%u) out of range (%u - %u). "
                                  "Filtered!\n", id,
                                  ctx->filter_low_id, ctx->filter_high_id));
+                       TALLOC_FREE(sidstr);
                        TALLOC_FREE(tmp);
                        continue;
                }
                TALLOC_FREE(tmp);
 
+               if (map->status == ID_MAPPED) {
+                       DEBUG(1, ("WARNING: duplicate %s mapping in LDAP. "
+                             "overwriting mapping %s -> %u with %s -> %u\n",
+                             (type == ID_TYPE_UID) ? "UID" : "GID",
+                             sidstr, map->xid.id, sidstr, id));
+               }
+
+               TALLOC_FREE(sidstr);
+
                /* mapped */
                map->xid.type = type;
                map->xid.id = id;