diff options
-rw-r--r-- | source3/passdb/secrets.c | 92 |
1 files changed, 55 insertions, 37 deletions
diff --git a/source3/passdb/secrets.c b/source3/passdb/secrets.c index 63e67aa16a..5df0edc29a 100644 --- a/source3/passdb/secrets.c +++ b/source3/passdb/secrets.c @@ -284,38 +284,46 @@ BOOL secrets_fetch_trust_account_password(const char *domain, uint8 ret_pwd[16], ************************************************************************/ BOOL secrets_fetch_trusted_domain_password(const char *domain, char** pwd, - DOM_SID *sid, time_t *pass_last_set_time) + DOM_SID *sid, time_t *pass_last_set_time) { - struct trusted_dom_pass *pass; + struct trusted_dom_pass pass; size_t size; + + /* unpacking structures */ + char* pass_buf; + int pass_len = 0; + + ZERO_STRUCT(pass); /* fetching trusted domain password structure */ - if (!(pass = secrets_fetch(trustdom_keystr(domain), &size))) { + if (!(pass_buf = secrets_fetch(trustdom_keystr(domain), &size))) { DEBUG(5, ("secrets_fetch failed!\n")); return False; } - if (size != sizeof(*pass)) { - DEBUG(0, ("secrets were of incorrect size!\n")); + /* unpack trusted domain password */ + pass_len = tdb_trusted_dom_pass_unpack(pass_buf, size, &pass); + SAFE_FREE(pass_buf); + + if (pass_len != size) { + DEBUG(5, ("Invalid secrets size. Unpacked data doesn't match trusted_dom_pass structure.\n")); return False; } - + /* the trust's password */ if (pwd) { - *pwd = strdup(pass->pass); + *pwd = strdup(pass.pass); if (!*pwd) { return False; } } /* last change time */ - if (pass_last_set_time) *pass_last_set_time = pass->mod_time; + if (pass_last_set_time) *pass_last_set_time = pass.mod_time; /* domain sid */ - memcpy(&sid, &(pass->domain_sid), sizeof(sid)); - - SAFE_FREE(pass); - + sid_copy(sid, &pass.domain_sid); + return True; } @@ -334,7 +342,7 @@ BOOL secrets_store_trust_account_password(const char *domain, uint8 new_pwd[16]) } /** - * Routine to set the password for trusted domain + * Routine to store the password for trusted domain * * @param domain remote domain name * @param pwd plain text password of trust relationship @@ -344,12 +352,17 @@ BOOL secrets_store_trust_account_password(const char *domain, uint8 new_pwd[16]) **/ BOOL secrets_store_trusted_domain_password(const char* domain, smb_ucs2_t *uni_dom_name, - size_t uni_name_len, const char* pwd, - DOM_SID sid) -{ + size_t uni_name_len, const char* pwd, + DOM_SID sid) +{ + /* packing structures */ + pstring pass_buf; + int pass_len = 0; + int pass_buf_len = sizeof(pass_buf); + struct trusted_dom_pass pass; ZERO_STRUCT(pass); - + /* unicode domain name and its length */ if (!uni_dom_name) return False; @@ -365,9 +378,11 @@ BOOL secrets_store_trusted_domain_password(const char* domain, smb_ucs2_t *uni_d fstrcpy(pass.pass, pwd); /* domain sid */ - memcpy(&(pass.domain_sid), &sid, sizeof(sid)); + sid_copy(&pass.domain_sid, &sid); + + pass_len = tdb_trusted_dom_pass_pack(pass_buf, pass_buf_len, &pass); - return secrets_store(trustdom_keystr(domain), (void *)&pass, sizeof(pass)); + return secrets_store(trustdom_keystr(domain), (void *)&pass_buf, pass_len); } /************************************************************************ @@ -553,13 +568,19 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in char *pattern; unsigned int start_idx; uint32 idx = 0; - size_t size; + size_t size, packed_size = 0; fstring dom_name; - struct trusted_dom_pass *pass; + char *packed_pass; + struct trusted_dom_pass *pass = talloc_zero(ctx, sizeof(struct trusted_dom_pass)); NTSTATUS status; if (!secrets_init()) return NT_STATUS_ACCESS_DENIED; - + + if (!pass) { + DEBUG(0, ("talloc_zero failed!\n")); + return NT_STATUS_NO_MEMORY; + } + *num_domains = 0; start_idx = *enum_ctx; @@ -583,7 +604,7 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in */ status = NT_STATUS_NO_MORE_ENTRIES; - /* searching for keys in sectrets db -- way to go ... */ + /* searching for keys in secrets db -- way to go ... */ for (k = keys; k; k = k->next) { char *secrets_key; @@ -594,11 +615,13 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in return NT_STATUS_NO_MEMORY; } - pass = secrets_fetch(secrets_key, &size); + packed_pass = secrets_fetch(secrets_key, &size); + packed_size = tdb_trusted_dom_pass_unpack(packed_pass, size, pass); + /* packed representation isn't needed anymore */ + SAFE_FREE(packed_pass); - if (size != sizeof(*pass)) { + if (size != packed_size) { DEBUG(2, ("Secrets record %s is invalid!\n", secrets_key)); - SAFE_FREE(pass); continue; } @@ -612,8 +635,6 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in dom = talloc_zero(ctx, sizeof(*dom)); if (!dom) { /* free returned tdb record */ - SAFE_FREE(pass); - return NT_STATUS_NO_MEMORY; } @@ -647,10 +668,7 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in start_idx, max_num_domains)); } - idx++; - - /* free returned tdb record */ - SAFE_FREE(pass); + idx++; } DEBUG(5, ("secrets_get_trusted_domains: got %d domains\n", *num_domains)); @@ -673,9 +691,9 @@ BOOL secrets_named_mutex(const char *name, unsigned int timeout) if (!message_init()) return False; - ret = tdb_lock_bystring(tdb, name, timeout); - if (ret == 0) - DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); + ret = tdb_lock_bystring(tdb, name, timeout); + if (ret == 0) + DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); return (ret == 0); } @@ -686,8 +704,8 @@ BOOL secrets_named_mutex(const char *name, unsigned int timeout) void secrets_named_mutex_release(const char *name) { - tdb_unlock_bystring(tdb, name); - DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); + tdb_unlock_bystring(tdb, name); + DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); } /********************************************************* |