summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-08-08 20:35:17 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:38:36 -0500
commit4fb4ef919827eb6ba9fdbfdbe9b2c0d4bb43170e (patch)
tree5d5f98a72978fbba15b8ff48c06a28ba124a0596
parente1e62d89999629d41cc2b66b12eb37ce190d5db0 (diff)
downloadsamba-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.c48
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));