s3:winbindd: do not expose negative cache idmap entries as valid mappings (bug #9002)
authorStefan Metzmacher <metze@samba.org>
Thu, 24 May 2012 07:08:21 +0000 (09:08 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 21 Jun 2012 14:07:15 +0000 (16:07 +0200)
metze

source3/winbindd/winbindd_sids_to_xids.c

index aa179b7db0ab62630dac48f1cd825bfa38309037..09d9a9b9231b142a5c98e50a9db440eb2a5ef0ac 100644 (file)
@@ -240,22 +240,30 @@ NTSTATUS winbindd_sids_to_xids_recv(struct tevent_req *req,
 
        for (i=0; i<state->num_sids; i++) {
                char type;
-               uint64_t unix_id = (uint64_t)-1;
+               uint32_t unix_id = UINT32_MAX;
                bool found = true;
 
                if (state->cached[i].sid != NULL) {
                        unix_id = state->cached[i].xid.id;
-                       if (state->cached[i].xid.type == ID_TYPE_UID) {
+
+                       switch (state->cached[i].xid.type) {
+                       case ID_TYPE_UID:
                                type = 'U';
-                       } else {
+                               break;
+                       case ID_TYPE_GID:
                                type = 'G';
+                               break;
+                       case ID_TYPE_BOTH:
+                               type = 'B';
+                               break;
+                       default:
+                               found = false;
+                               break;
                        }
                } else {
                        struct unixid id;
+
                        unix_id = state->ids.ids[num_non_cached].unix_id;
-                       if (unix_id == -1) {
-                               found = false;
-                       }
 
                        id.id = unix_id;
                        id.type = state->ids.ids[num_non_cached].type;
@@ -275,10 +283,15 @@ NTSTATUS winbindd_sids_to_xids_recv(struct tevent_req *req,
                                break;
                        default:
                                found = false;
+                               break;
                        }
                        num_non_cached += 1;
                }
 
+               if (unix_id == UINT32_MAX) {
+                       found = false;
+               }
+
                if (found) {
                        result = talloc_asprintf_append_buffer(
                                result, "%c%lu\n", type,