mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
Fix bug #7072 - Accounts can't be unlocked from ldap.
Fix suggested by Andy Hanton <andyhanton@gmail.com>. 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 :-). Jeremy.
This commit is contained in:
parent
8e26aa3d7c
commit
627fb85092
@ -68,6 +68,7 @@ LOGIN_CACHE * login_cache_read(struct samu *sampass)
|
|||||||
char *keystr;
|
char *keystr;
|
||||||
TDB_DATA databuf;
|
TDB_DATA databuf;
|
||||||
LOGIN_CACHE *entry;
|
LOGIN_CACHE *entry;
|
||||||
|
uint32_t entry_timestamp = 0, bad_password_time = 0;
|
||||||
|
|
||||||
if (!login_cache_init())
|
if (!login_cache_init())
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -92,17 +93,22 @@ LOGIN_CACHE * login_cache_read(struct samu *sampass)
|
|||||||
SAFE_FREE(databuf.dptr);
|
SAFE_FREE(databuf.dptr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
ZERO_STRUCTP(entry);
|
||||||
|
|
||||||
if (tdb_unpack (databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,
|
if (tdb_unpack (databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,
|
||||||
&entry->entry_timestamp, &entry->acct_ctrl,
|
&entry->entry_timestamp, &entry->acct_ctrl,
|
||||||
&entry->bad_password_count,
|
&entry->bad_password_count,
|
||||||
&entry->bad_password_time) == -1) {
|
&bad_password_time) == -1) {
|
||||||
DEBUG(7, ("No cache entry found\n"));
|
DEBUG(7, ("No cache entry found\n"));
|
||||||
SAFE_FREE(entry);
|
SAFE_FREE(entry);
|
||||||
SAFE_FREE(databuf.dptr);
|
SAFE_FREE(databuf.dptr);
|
||||||
return NULL;
|
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);
|
SAFE_FREE(databuf.dptr);
|
||||||
|
|
||||||
DEBUG(5, ("Found login cache entry: timestamp %12u, flags 0x%x, count %d, time %12u\n",
|
DEBUG(5, ("Found login cache entry: timestamp %12u, flags 0x%x, count %d, time %12u\n",
|
||||||
@ -116,6 +122,8 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry)
|
|||||||
char *keystr;
|
char *keystr;
|
||||||
TDB_DATA databuf;
|
TDB_DATA databuf;
|
||||||
bool ret;
|
bool ret;
|
||||||
|
uint32_t entry_timestamp;
|
||||||
|
uint32_t bad_password_time = (uint32_t)entry.bad_password_time;
|
||||||
|
|
||||||
if (!login_cache_init())
|
if (!login_cache_init())
|
||||||
return False;
|
return False;
|
||||||
@ -130,14 +138,14 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry)
|
|||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.entry_timestamp = time(NULL);
|
entry_timestamp = (uint32_t)time(NULL);
|
||||||
|
|
||||||
databuf.dsize =
|
databuf.dsize =
|
||||||
tdb_pack(NULL, 0, SAM_CACHE_FORMAT,
|
tdb_pack(NULL, 0, SAM_CACHE_FORMAT,
|
||||||
entry.entry_timestamp,
|
entry_timestamp,
|
||||||
entry.acct_ctrl,
|
entry.acct_ctrl,
|
||||||
entry.bad_password_count,
|
entry.bad_password_count,
|
||||||
entry.bad_password_time);
|
bad_password_time);
|
||||||
databuf.dptr = SMB_MALLOC_ARRAY(uint8, databuf.dsize);
|
databuf.dptr = SMB_MALLOC_ARRAY(uint8, databuf.dsize);
|
||||||
if (!databuf.dptr) {
|
if (!databuf.dptr) {
|
||||||
SAFE_FREE(keystr);
|
SAFE_FREE(keystr);
|
||||||
@ -145,10 +153,10 @@ bool login_cache_write(const struct samu *sampass, LOGIN_CACHE entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tdb_pack(databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,
|
if (tdb_pack(databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,
|
||||||
entry.entry_timestamp,
|
entry_timestamp,
|
||||||
entry.acct_ctrl,
|
entry.acct_ctrl,
|
||||||
entry.bad_password_count,
|
entry.bad_password_count,
|
||||||
entry.bad_password_time)
|
bad_password_time)
|
||||||
!= databuf.dsize) {
|
!= databuf.dsize) {
|
||||||
SAFE_FREE(keystr);
|
SAFE_FREE(keystr);
|
||||||
SAFE_FREE(databuf.dptr);
|
SAFE_FREE(databuf.dptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user