r23051: sid_to_[ug]id fixes for smbd
authorSimo Sorce <idra@samba.org>
Mon, 21 May 2007 20:51:15 +0000 (20:51 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:22:17 +0000 (12:22 -0500)
source/passdb/lookup_sid.c

index 12b25413c2a8a6efa81e5581c91e0daa9c451eec..05d7989c45523440e15cbb63fe4b4e5d05379762 100644 (file)
@@ -1208,12 +1208,6 @@ BOOL legacy_sid_to_uid(const DOM_SID *psid, uid_t *puid)
        enum lsa_SidType type;
        uint32 rid;
 
-       if (sid_peek_check_rid(&global_sid_Unix_Users, psid, &rid)) {
-               uid_t uid = rid;
-               *puid = uid;
-               goto done;
-       }
-
        if (sid_peek_check_rid(get_global_sam_sid(), psid, &rid)) {
                union unid_t id;
                BOOL ret;
@@ -1259,12 +1253,6 @@ BOOL legacy_sid_to_gid(const DOM_SID *psid, gid_t *pgid)
        union unid_t id;
        enum lsa_SidType type;
 
-       if (sid_peek_check_rid(&global_sid_Unix_Groups, psid, &rid)) {
-               gid_t gid = rid;
-               *pgid = gid;
-               goto done;
-       }
-
        if ((sid_check_is_in_builtin(psid) ||
             sid_check_is_in_wellknown_domain(psid))) {
                BOOL ret;
@@ -1379,6 +1367,7 @@ void gid_to_sid(DOM_SID *psid, gid_t gid)
 
 BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid)
 {
+       uint32 rid;
        gid_t gid;
 
        if (fetch_uid_from_cache(puid, psid))
@@ -1388,6 +1377,18 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid)
                return False;
        }
 
+       /* Optimize for the Unix Users Domain
+        * as the conversion is straightforward */
+       if (sid_peek_check_rid(&global_sid_Unix_Users, psid, &rid)) {
+               uid_t uid = rid;
+               *puid = uid;
+
+               /* return here, don't cache */
+               DEBUG(10,("sid %s -> uid %u\n", sid_string_static(psid),
+                       (unsigned int)*puid ));
+               return True;
+       }
+
        if (!winbind_sid_to_uid(puid, psid)) {
                if (!winbind_ping()) {
                        return legacy_sid_to_uid(psid, puid);
@@ -1415,6 +1416,7 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid)
 
 BOOL sid_to_gid(const DOM_SID *psid, gid_t *pgid)
 {
+       uint32 rid;
        uid_t uid;
 
        if (fetch_gid_from_cache(pgid, psid))
@@ -1423,6 +1425,18 @@ BOOL sid_to_gid(const DOM_SID *psid, gid_t *pgid)
        if (fetch_uid_from_cache(&uid, psid))
                return False;
 
+       /* Optimize for the Unix Groups Domain
+        * as the conversion is straightforward */
+       if (sid_peek_check_rid(&global_sid_Unix_Groups, psid, &rid)) {
+               gid_t gid = rid;
+               *pgid = gid;
+
+               /* return here, don't cache */
+               DEBUG(10,("sid %s -> gid %u\n", sid_string_static(psid),
+                       (unsigned int)*pgid ));
+               return True;
+       }
+
        /* Ask winbindd if it can map this sid to a gid.
         * (Idmap will check it is a valid SID and of the right type) */