From b332e75b751b28d979e94b49639c49e0879b3ce3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 27 Jan 2010 16:55:47 -0800 Subject: [PATCH] Fix bug #7072 - Accounts can't be unlocked from ldap. Fix suggested by Andy Hanton . The LOGIN_CACHE struct contains two time_t entries, but was being written to and read from via tdb_pack/tdb_unpack functions using explicit 32-bit int specifiers. This would break on machines with a 64-bit time_t. Use correct int sizes for tdb_pack/tdb_unpack. We have to fix this properly before 2037 :-). Contains fixes from master 627fb85092f728065b6d772c41aeb75018154e86 and 69fd8461b8792f4fee1b61db03953044565492c6. Jeremy. --- source3/passdb/login_cache.c | 25 +++++++++++++++++-------- 1 files changed, 17 insertions(+), 8 deletions(-) diff --git a/source3/passdb/login_cache.c b/source3/passdb/login_cache.c index 2a63500..5630372 100644 --- a/source3/passdb/login_cache.c +++ b/source3/passdb/login_cache.c @@ -68,6 +68,7 @@ LOGIN_CACHE * login_cache_read(struct samu *sampass) char *keystr; TDB_DATA databuf; LOGIN_CACHE *entry; + uint32_t entry_timestamp = 0, bad_password_time = 0; if (!login_cache_init()) return NULL; @@ -92,17 +93,23 @@ LOGIN_CACHE * login_cache_read(struct samu *sampass) SAFE_FREE(databuf.dptr); return NULL; } + ZERO_STRUCTP(entry); if (tdb_unpack (databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT, - &entry->entry_timestamp, &entry->acct_ctrl, - &entry->bad_password_count, - &entry->bad_password_time) == -1) { + &entry_timestamp, + &entry->acct_ctrl, + &entry->bad_password_count, + &bad_password_time) == -1) { DEBUG(7, ("No cache entry found\n")); SAFE_FREE(entry); SAFE_FREE(databuf.dptr); return NULL; } + /* Deal with possible 64-bit time_t. */ + entry->entry_timestamp = (time_t)entry_timestamp; + entry->bad_password_time = (time_t)bad_password_time; + SAFE_FREE(databuf.dptr); DEBUG(5, ("Found login cache entry: timestamp %12u, flags 0x%x, count %d, time %12u\n", @@ -116,6 +123,8 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry) char *keystr; TDB_DATA databuf; bool ret; + uint32_t entry_timestamp; + uint32_t bad_password_time = (uint32_t)entry.bad_password_time; if (!login_cache_init()) return False; @@ -130,14 +139,14 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry) return False; } - entry.entry_timestamp = time(NULL); + entry_timestamp = (uint32_t)time(NULL); databuf.dsize = tdb_pack(NULL, 0, SAM_CACHE_FORMAT, - entry.entry_timestamp, + entry_timestamp, entry.acct_ctrl, entry.bad_password_count, - entry.bad_password_time); + bad_password_time); databuf.dptr = SMB_MALLOC_ARRAY(uint8, databuf.dsize); if (!databuf.dptr) { SAFE_FREE(keystr); @@ -145,10 +154,10 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry) } if (tdb_pack(databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT, - entry.entry_timestamp, + entry_timestamp, entry.acct_ctrl, entry.bad_password_count, - entry.bad_password_time) + bad_password_time) != databuf.dsize) { SAFE_FREE(keystr); SAFE_FREE(databuf.dptr); -- 1.6.6