r4088: Get medieval on our ass about malloc.... :-). Take control of all our allocation
[samba.git] / source3 / lib / util_sid.c
index 824987f1892ec2d2e58a73d65c33a45668dc6a77..197157a2f72356dec98befa84b48e14ba87e6adf 100644 (file)
@@ -91,8 +91,9 @@ static const struct {
        {SID_NAME_DELETED, "Deleted Account"},
        {SID_NAME_INVALID, "Invalid Account"},
        {SID_NAME_UNKNOWN, "UNKNOWN"},
+       {SID_NAME_COMPUTER, "Computer"},
 
-       {SID_NAME_USE_NONE, NULL}
+       {(enum SID_NAME_USE)0, NULL}
 };
 
 const char *sid_type_lookup(uint32 sid_type) 
@@ -173,6 +174,19 @@ NT_USER_TOKEN *get_system_token(void)
        return &system_token;
 }
 
+/******************************************************************
+ get the default domain/netbios name to be used when dealing 
+ with our passdb list of accounts
+******************************************************************/
+
+const char *get_global_sam_name(void) 
+{
+       if ((lp_server_role() == ROLE_DOMAIN_PDC) || (lp_server_role() == ROLE_DOMAIN_BDC)) {
+               return lp_workgroup();
+       }
+       return global_myname();
+}
+
 /**************************************************************************
  Splits a name of format \DOMAIN\name or name into its two components.
  Sets the DOMAIN name to global_myname() if it has not been specified.
@@ -200,7 +214,7 @@ void split_domain_name(const char *fullname, char *domain, char *name)
                fstrcpy(domain, full_name);
                fstrcpy(name, p+1);
        } else {
-               fstrcpy(domain, global_myname());
+               fstrcpy(domain, get_global_sam_name());
                fstrcpy(name, full_name);
        }
 
@@ -290,7 +304,7 @@ BOOL string_to_sid(DOM_SID *sidout, const char *sidstr)
 
        memset((char *)sidout, '\0', sizeof(DOM_SID));
 
-       p = q = strdup(sidstr + 2);
+       p = q = SMB_STRDUP(sidstr + 2);
        if (p == NULL) {
                DEBUG(0, ("string_to_sid: out of memory!\n"));
                return False;
@@ -390,6 +404,9 @@ BOOL sid_peek_check_rid(const DOM_SID *exp_dom_sid, const DOM_SID *sid, uint32 *
        if (!exp_dom_sid || !sid || !rid)
                return False;
                        
+       if (sid->num_auths != (exp_dom_sid->num_auths+1)) {
+               return False;
+       }
 
        if (sid_compare_domain(exp_dom_sid, sid)!=0){
                *rid=(-1);
@@ -604,7 +621,7 @@ char *sid_binstring(const DOM_SID *sid)
 {
        char *buf, *s;
        int len = sid_size(sid);
-       buf = malloc(len);
+       buf = SMB_MALLOC(len);
        if (!buf)
                return NULL;
        sid_linearize(buf, len, sid);
@@ -613,19 +630,20 @@ char *sid_binstring(const DOM_SID *sid)
        return s;
 }
 
+/*******************************************************************
+ Tallocs a duplicate SID. 
+********************************************************************/ 
 
-/*****************************************************************
- Print a GUID structure for debugging.
-*****************************************************************/
-
-void print_guid(GUID *guid)
+DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, const DOM_SID *src)
 {
-       int i;
-
-       d_printf("%08x-%04x-%04x", 
-                IVAL(guid->info, 0), SVAL(guid->info, 4), SVAL(guid->info, 6));
-       d_printf("-%02x%02x-", guid->info[8], guid->info[9]);
-       for (i=10;i<GUID_SIZE;i++)
-               d_printf("%02x", guid->info[i]);
-       d_printf("\n");
+       DOM_SID *dst;
+       
+       if(!src)
+               return NULL;
+       
+       if((dst = TALLOC_ZERO_P(ctx, DOM_SID)) != NULL) {
+               sid_copy( dst, src);
+       }
+       
+       return dst;
 }