]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
r21505: make sure mlock()'d memory is aligned on a page boundary
authorGerald Carter <jerry@samba.org>
Thu, 22 Feb 2007 17:21:27 +0000 (17:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:08 +0000 (12:18 -0500)
source/nsswitch/winbindd_cred_cache.c
source/nsswitch/winbindd_nss.h

index 50d39dd670b6ebe22b557707c57922f552723dfe..8dc8fab4ac140fb3c1b3bf7048582957a62e7c45 100644 (file)
@@ -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;
index b6c262e466799a3cf4c247d3a4de2c08ab541eb9..919575d95765de239baf9b76ef7a82f2fc150c35 100644 (file)
@@ -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;