diff options
author | Jeremy Allison <jra@samba.org> | 2006-08-08 20:35:17 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:38:36 -0500 |
commit | 4fb4ef919827eb6ba9fdbfdbe9b2c0d4bb43170e (patch) | |
tree | 5d5f98a72978fbba15b8ff48c06a28ba124a0596 | |
parent | e1e62d89999629d41cc2b66b12eb37ce190d5db0 (diff) | |
download | samba-4fb4ef919827eb6ba9fdbfdbe9b2c0d4bb43170e.tar.gz samba-4fb4ef919827eb6ba9fdbfdbe9b2c0d4bb43170e.tar.bz2 samba-4fb4ef919827eb6ba9fdbfdbe9b2c0d4bb43170e.zip |
r17464: Ensure we use a hash16 data type, not a string,
for storing offline hashes.
Jeremy.
(This used to be commit c8e6f7e41c9db436b34dd127d77940d7b43bf13b)
-rw-r--r-- | source3/nsswitch/winbindd_cache.c | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/source3/nsswitch/winbindd_cache.c b/source3/nsswitch/winbindd_cache.c index 42206de055..865cf121b1 100644 --- a/source3/nsswitch/winbindd_cache.c +++ b/source3/nsswitch/winbindd_cache.c @@ -269,7 +269,38 @@ static char *centry_string(struct cache_entry *centry, TALLOC_CTX *mem_ctx) return ret; } -/* pull a string from a cache entry, using the supplied +/* pull a hash16 from a cache entry, using the supplied + talloc context +*/ +static char *centry_hash16(struct cache_entry *centry, TALLOC_CTX *mem_ctx) +{ + uint32 len; + char *ret; + + len = centry_uint8(centry); + + if (len != 16) { + DEBUG(0,("centry corruption? hash len (%u) != 16\n", + len )); + smb_panic("centry_hash16"); + } + + if (centry->len - centry->ofs < 16) { + DEBUG(0,("centry corruption? needed 16 bytes, have %d\n", + centry->len - centry->ofs)); + smb_panic("centry_hash16"); + } + + ret = TALLOC_ARRAY(mem_ctx, char, 16); + if (!ret) { + smb_panic("centry_hash out of memory\n"); + } + memcpy(ret,centry->data + centry->ofs, 16); + centry->ofs += 16; + return ret; +} + +/* pull a sid from a cache entry, using the supplied talloc context */ static BOOL centry_sid(struct cache_entry *centry, TALLOC_CTX *mem_ctx, DOM_SID *sid) @@ -630,6 +661,17 @@ static void centry_put_string(struct cache_entry *centry, const char *s) centry->ofs += len; } +/* + push a 16 byte hash into a centry - treat as 16 byte string. + */ +static void centry_put_hash16(struct cache_entry *centry, const uint8 val[16]) +{ + centry_put_uint8(centry, 16); + centry_expand(centry, 16); + memcpy(centry->data + centry->ofs, val, 16); + centry->ofs += 16; +} + static void centry_put_sid(struct cache_entry *centry, const DOM_SID *sid) { fstring sid_string; @@ -865,7 +907,7 @@ NTSTATUS wcache_get_creds(struct winbindd_domain *domain, } t = centry_time(centry); - *cached_nt_pass = (const uint8 *)centry_string(centry, mem_ctx); + *cached_nt_pass = (const uint8 *)centry_hash16(centry, mem_ctx); #if DEBUG_PASSWORD dump_data(100, (const char *)cached_nt_pass, NT_HASH_LEN); @@ -906,7 +948,7 @@ NTSTATUS wcache_save_creds(struct winbindd_domain *domain, #endif centry_put_time(centry, time(NULL)); - centry_put_string(centry, (const char *)nt_pass); + centry_put_hash16(centry, nt_pass); centry_end(centry, "CRED/%s", sid_to_string(sid_string, sid)); DEBUG(10,("wcache_save_creds: %s\n", sid_string)); |