Author: abartlet
Date: 2006-09-07 03:24:08 +0000 (Thu, 07 Sep 2006)
New Revision: 18198

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=18198

Log:
Fix callbacks to use allocated or constant memory, not the stack.
These values are used by SASL at a later time, and must remain valid.

Make the password callback actually return the password.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/auth/gensec/cyrus_sasl.c


Changeset:
Modified: branches/SAMBA_4_0/source/auth/gensec/cyrus_sasl.c
===================================================================
--- branches/SAMBA_4_0/source/auth/gensec/cyrus_sasl.c  2006-09-07 02:15:31 UTC 
(rev 18197)
+++ branches/SAMBA_4_0/source/auth/gensec/cyrus_sasl.c  2006-09-07 03:24:08 UTC 
(rev 18198)
@@ -101,6 +101,7 @@
        }
        secret->len = strlen(password);
        safe_strcpy(secret->data, password, secret->len+1);
+       *psecret = secret;
        return SASL_OK;
 }
 
@@ -119,9 +120,16 @@
        struct socket_address *remote_socket_addr = 
gensec_get_peer_addr(gensec_security);
        char *local_addr = NULL;
        char *remote_addr = NULL;
-       sasl_callback_t callbacks[5];
        int sasl_ret;
 
+       sasl_callback_t *callbacks;
+
+       gensec_sasl_state = talloc(gensec_security, struct gensec_sasl_state);
+       if (!gensec_sasl_state) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       callbacks = talloc_array(gensec_sasl_state, sasl_callback_t, 5);
        callbacks[0].id = SASL_CB_USER;
        callbacks[0].proc = gensec_sasl_get_user;
        callbacks[0].context = gensec_security;
@@ -142,11 +150,6 @@
        callbacks[4].proc = NULL;
        callbacks[4].context = NULL;
 
-       gensec_sasl_state = talloc(gensec_security, struct gensec_sasl_state);
-       if (!gensec_sasl_state) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
        gensec_security->private_data = gensec_sasl_state;
 
        if (local_socket_addr) {
@@ -342,7 +345,7 @@
                debug_level = 0;
                break;
        }
-       DEBUG(debug_level, ("gensec_sasl: %s", message));
+       DEBUG(debug_level, ("gensec_sasl: %s\n", message));
 
        return SASL_OK;
 }
@@ -351,17 +354,20 @@
 {
        NTSTATUS ret;
        int sasl_ret, i;
-       sasl_callback_t callbacks[2];
        const char **sasl_mechs;
        
-       callbacks[0].id = SASL_CB_LOG;
-       callbacks[0].proc = gensec_sasl_log;
-       callbacks[0].context = NULL;
-
-       callbacks[1].id = SASL_CB_LIST_END;
-       callbacks[1].proc = gensec_sasl_log;
-       callbacks[1].context = NULL;
-
+       static const sasl_callback_t callbacks[] = {
+               { 
+                       .id = SASL_CB_LOG,
+                       .proc = gensec_sasl_log,
+                       .context = NULL,
+               },
+               {
+                       .id = SASL_CB_LIST_END,
+                       .proc = gensec_sasl_log,
+                       .context = NULL,
+               }
+       };
        sasl_ret = sasl_client_init(callbacks);
        
        if (sasl_ret == SASL_NOMECH) {

Reply via email to