diff options
author | Gerald Carter <jerry@samba.org> | 2007-02-22 17:21:27 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:18:08 -0500 |
commit | 43c290639ba96570f2906c12572475898de53be2 (patch) | |
tree | fd63218bc327560b63e5355cdde79758afa54112 /source3/nsswitch | |
parent | 9684e353a16cd18424f5b35a5d84ae3c2a03ae70 (diff) | |
download | samba-43c290639ba96570f2906c12572475898de53be2.tar.gz samba-43c290639ba96570f2906c12572475898de53be2.tar.bz2 samba-43c290639ba96570f2906c12572475898de53be2.zip |
r21505: make sure mlock()'d memory is aligned on a page boundary
(This used to be commit 52e6a2ceab794875781575ed17ec86808f6e26da)
Diffstat (limited to 'source3/nsswitch')
-rw-r--r-- | source3/nsswitch/winbindd_cred_cache.c | 31 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_nss.h | 2 |
2 files changed, 26 insertions, 7 deletions
diff --git a/source3/nsswitch/winbindd_cred_cache.c b/source3/nsswitch/winbindd_cred_cache.c index 50d39dd670..8dc8fab4ac 100644 --- a/source3/nsswitch/winbindd_cred_cache.c +++ b/source3/nsswitch/winbindd_cred_cache.c @@ -471,6 +471,8 @@ static NTSTATUS store_memory_creds(struct WINBINDD_MEMORY_CREDS *memcredp, const #if !defined(HAVE_MLOCK) return NT_STATUS_OK; #else + int psize = getpagesize(); + /* new_entry->nt_hash is the base pointer for the block of memory pointed into by new_entry->lm_hash and new_entry->pass (if we're storing plaintext). */ @@ -480,17 +482,29 @@ static NTSTATUS store_memory_creds(struct WINBINDD_MEMORY_CREDS *memcredp, const memcredp->len += strlen(pass)+1; } - memcredp->nt_hash = (unsigned char *)TALLOC_ZERO(memcredp, memcredp->len); - if (!memcredp->nt_hash) { + /* On non-linux platforms, mlock()'d memory must be aligned on + a page boundary so allocate a bit more so we can offset + enough */ + + memcredp->len += psize; + + memcredp->buffer = (unsigned char*)TALLOC_ZERO(memcredp, memcredp->len); + + if (!memcredp->buffer) { return NT_STATUS_NO_MEMORY; } + + + /* point the nt_hash at the page boundary in the buffer */ + memcredp->nt_hash = memcredp->buffer + + (psize - ((uint32)memcredp->buffer % psize)); memcredp->lm_hash = memcredp->nt_hash + NT_HASH_LEN; + #ifdef DEBUG_PASSWORD DEBUG(10,("mlocking memory: %p\n", memcredp->nt_hash)); #endif - - if ((mlock(memcredp->nt_hash, memcredp->len)) == -1) { + if ((mlock(memcredp->nt_hash, memcredp->len-psize)) == -1) { DEBUG(0,("failed to mlock memory: %s (%d)\n", strerror(errno), errno)); return map_nt_error_from_unix(errno); @@ -522,13 +536,16 @@ static NTSTATUS delete_memory_creds(struct WINBINDD_MEMORY_CREDS *memcredp) #if !defined(HAVE_MUNLOCK) return NT_STATUS_OK; #else - if (munlock(memcredp->nt_hash, memcredp->len) == -1) { + int psize = getpagesize(); + + if (munlock(memcredp->buffer, memcredp->len - psize) == -1) { DEBUG(0,("failed to munlock memory: %s (%d)\n", strerror(errno), errno)); return map_nt_error_from_unix(errno); } - memset(memcredp->nt_hash, '\0', memcredp->len); - TALLOC_FREE(memcredp->nt_hash); + memset(memcredp->buffer, '\0', memcredp->len); + TALLOC_FREE(memcredp->buffer); + memcredp->nt_hash = NULL; memcredp->lm_hash = NULL; memcredp->pass = NULL; memcredp->len = 0; diff --git a/source3/nsswitch/winbindd_nss.h b/source3/nsswitch/winbindd_nss.h index b6c262e466..919575d957 100644 --- a/source3/nsswitch/winbindd_nss.h +++ b/source3/nsswitch/winbindd_nss.h @@ -469,6 +469,8 @@ struct WINBINDD_MEMORY_CREDS { uid_t uid; int ref_count; size_t len; + unsigned char *buffer; /* buffer block containing the + following 3 */ unsigned char *nt_hash; /* Base pointer for the following 2 */ unsigned char *lm_hash; char *pass; |