Ignore:
Timestamp:
Nov 29, 2012, 1:59:04 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/auth/server_info.c

    r745 r751  
    274274                ok = sid_peek_check_rid(domain_sid, &sids[i], &rid);
    275275                if (ok) {
    276 
    277                         /* if it is the primary gid, skip it, we
    278                          * obviously already have it */
    279                         if (info3->base.primary_gid == rid) continue;
    280 
    281276                        /* store domain group rid */
    282                         groups->rids[i].rid = rid;
    283                         groups->rids[i].attributes = attributes;
     277                        groups->rids[groups->count].rid = rid;
     278                        groups->rids[groups->count].attributes = attributes;
    284279                        groups->count++;
    285280                        continue;
     
    439434        info3->base.bad_password_count = pdb_get_bad_password_count(samu);
    440435
     436        info3->base.domain.string = talloc_strdup(info3,
     437                                                  pdb_get_domain(samu));
     438        RET_NOMEM(info3->base.domain.string);
     439
     440        info3->base.domain_sid = dom_sid_dup(info3, &domain_sid);
     441        RET_NOMEM(info3->base.domain_sid);
     442
    441443        status = pdb_enum_group_memberships(mem_ctx, samu,
    442444                                            &group_sids, &gids,
     
    468470                RET_NOMEM(info3->base.logon_server.string);
    469471        }
    470 
    471         info3->base.domain.string = talloc_strdup(info3,
    472                                                   pdb_get_domain(samu));
    473         RET_NOMEM(info3->base.domain.string);
    474 
    475         info3->base.domain_sid = dom_sid_dup(info3, &domain_sid);
    476         RET_NOMEM(info3->base.domain_sid);
    477472
    478473        info3->base.acct_flags = pdb_get_acct_ctrl(samu);
     
    530525                                size_t num_sids)
    531526{
    532         unsigned int i;
     527        unsigned int i, j = 0;
    533528        bool ok;
    534529
     
    543538                ok = sid_peek_check_rid(domain_sid,
    544539                                        (const struct dom_sid *)&sids[i].sid,
    545                                         &groups->rids[i].rid);
     540                                        &groups->rids[j].rid);
    546541                if (!ok) continue;
    547542
    548                 groups->rids[i].attributes = SE_GROUP_MANDATORY |
     543                groups->rids[j].attributes = SE_GROUP_MANDATORY |
    549544                                             SE_GROUP_ENABLED_BY_DEFAULT |
    550545                                             SE_GROUP_ENABLED;
    551                 groups->count++;
    552         }
    553 
     546                j++;
     547        }
     548
     549        groups->count = j;
     550        return NT_STATUS_OK;
     551}
     552
     553static NTSTATUS wbcsids_to_netr_SidAttrArray(
     554                                const struct dom_sid *domain_sid,
     555                                const struct wbcSidWithAttr *sids,
     556                                size_t num_sids,
     557                                TALLOC_CTX *mem_ctx,
     558                                struct netr_SidAttr **_info3_sids,
     559                                uint32_t *info3_num_sids)
     560{
     561        unsigned int i, j = 0;
     562        struct netr_SidAttr *info3_sids;
     563
     564        info3_sids = talloc_array(mem_ctx, struct netr_SidAttr, num_sids);
     565        if (info3_sids == NULL) {
     566                return NT_STATUS_NO_MEMORY;
     567        }
     568
     569        /* a wbcDomainSid is the same as a dom_sid */
     570        for (i = 0; i < num_sids; i++) {
     571                const struct dom_sid *sid;
     572
     573                sid = (const struct dom_sid *)&sids[i].sid;
     574
     575                if (dom_sid_in_domain(domain_sid, sid)) {
     576                        continue;
     577                }
     578
     579                info3_sids[j].sid = dom_sid_dup(info3_sids, sid);
     580                if (info3_sids[j].sid == NULL) {
     581                        talloc_free(info3_sids);
     582                        return NT_STATUS_NO_MEMORY;
     583                }
     584                info3_sids[j].attributes = SE_GROUP_MANDATORY |
     585                                           SE_GROUP_ENABLED_BY_DEFAULT |
     586                                           SE_GROUP_ENABLED;
     587                j++;
     588        }
     589
     590        *info3_num_sids = j;
     591        *_info3_sids = info3_sids;
    554592        return NT_STATUS_OK;
    555593}
     
    637675        }
    638676
     677        status = wbcsids_to_netr_SidAttrArray(&domain_sid,
     678                                              &info->sids[1],
     679                                              info->num_sids - 1,
     680                                              info3,
     681                                              &info3->sids,
     682                                              &info3->sidcount);
     683        if (!NT_STATUS_IS_OK(status)) {
     684                TALLOC_FREE(info3);
     685                return NULL;
     686        }
     687
    639688        info3->base.user_flags = info->user_flags;
    640689        memcpy(info3->base.key.key, info->user_session_key, 16);
Note: See TracChangeset for help on using the changeset viewer.