On Sat, 2003-03-08 at 21:20, Tim Potter wrote:
> On Sat, Mar 08, 2003 at 09:10:23PM +1100, Andrew Bartlett wrote:
> 
> > Is there any reason I should not apply this patch to Samba HEAD?
> 
> I think the patch was eaten by Mailman.  Please re-send as text/plain.
> 
> Without even seeing the patch (-: it's definitely a good idea.

Actually, I think it was human error this time, but I'll blame mailman
if you like :-)

Andrew,

-- 
Andrew Bartlett                                 [EMAIL PROTECTED]
Manager, Authentication Subsystems, Samba Team  [EMAIL PROTECTED]
Student Network Administrator, Hawker College   [EMAIL PROTECTED]
http://samba.org     http://build.samba.org     http://hawkerc.net
? Makefile.in-
? config.abartlet
? print_err.patch
? sess_key
? to-3.0.diff
? user_ok.patch
? bin/st1q6nNC
? groupdb/mapping.po
? include/nmbd_dhcp_for_wins.h
? include/smb_interactive.h
? intl/Makefile
? intl/po
? intl/po2tbl.sed
? lib/get_password.c
? lib/rfc1738.c
? libads/libads_proto.h
? libsmb/cliconnect.
? nmbd/nmbd_dhcp_for_wins.c
? nsswitch/.libs
? nsswitch/ntlmauth.c
? pam_smbpass/pam_smb_acct.po
? pam_smbpass/pam_smb_auth.po
? pam_smbpass/pam_smb_passwd.po
? pam_smbpass/support.po
? po/Makefile
? po/POTFILES
? torture/map_extract.c
Index: lib/server_mutex.c
===================================================================
RCS file: /data/cvs/samba/source/lib/server_mutex.c,v
retrieving revision 1.3
diff -u -r1.3 server_mutex.c
--- lib/server_mutex.c  16 Jan 2003 20:08:33 -0000      1.3
+++ lib/server_mutex.c  8 Mar 2003 09:56:44 -0000
@@ -30,8 +30,6 @@
    like the single-connection that NT makes. */
 
 static char *mutex_server_name;
-/* FIXME. ref_count should be allocated per name... JRA. */
-size_t ref_count;
 
 BOOL grab_server_mutex(const char *name)
 {
@@ -40,7 +38,7 @@
                DEBUG(0,("grab_server_mutex: malloc failed for %s\n", name));
                return False;
        }
-       if (!secrets_named_mutex(mutex_server_name, 10, &ref_count)) {
+       if (!secrets_named_mutex(mutex_server_name, 10)) {
                DEBUG(10,("grab_server_mutex: failed for %s\n", name));
                SAFE_FREE(mutex_server_name);
                return False;
@@ -52,7 +50,7 @@
 void release_server_mutex(void)
 {
        if (mutex_server_name) {
-               secrets_named_mutex_release(mutex_server_name, &ref_count);
+               secrets_named_mutex_release(mutex_server_name);
                SAFE_FREE(mutex_server_name);
        }
 }
Index: nsswitch/winbindd_cm.c
===================================================================
RCS file: /data/cvs/samba/source/nsswitch/winbindd_cm.c,v
retrieving revision 1.61
diff -u -r1.61 winbindd_cm.c
--- nsswitch/winbindd_cm.c      16 Jan 2003 20:08:33 -0000      1.61
+++ nsswitch/winbindd_cm.c      8 Mar 2003 09:56:46 -0000
@@ -302,7 +302,7 @@
 /* Open a connction to the remote server, cache failures for 30 seconds */
 
 static NTSTATUS cm_open_connection(const char *domain, const int pipe_index,
-                              struct winbindd_cm_conn *new_conn, BOOL keep_mutex)
+                              struct winbindd_cm_conn *new_conn)
 {
        struct failed_connection_cache *fcc;
        NTSTATUS result;
@@ -310,7 +310,6 @@
        struct in_addr dc_ip;
        int i;
        BOOL retry = True;
-       BOOL got_mutex = False;
 
        ZERO_STRUCT(dc_ip);
 
@@ -366,24 +365,21 @@
              new_conn->controller, global_myname(), ipc_domain, ipc_username));
 
        for (i = 0; retry && (i < 3); i++) {
-               
-               if (!secrets_named_mutex(new_conn->controller, 
WINBIND_SERVER_MUTEX_WAIT_TIME, &new_conn->mutex_ref_count)) {
+               BOOL got_mutex;
+               if (!(got_mutex = secrets_named_mutex(new_conn->controller, 
WINBIND_SERVER_MUTEX_WAIT_TIME))) {
                        DEBUG(0,("cm_open_connection: mutex grab failed for %s\n", 
new_conn->controller));
                        result = NT_STATUS_POSSIBLE_DEADLOCK;
                        continue;
                }
-
-               got_mutex = True;
-
+               
                result = cli_full_connection(&new_conn->cli, global_myname(), 
new_conn->controller, 
-                       &dc_ip, 0, "IPC$", "IPC", ipc_username, ipc_domain, 
-                       ipc_password, 0, &retry);
+                                            &dc_ip, 
CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK, "IPC$", "IPC", ipc_username, ipc_domain, 
+                                            ipc_password, 0, &retry);
+               
+               secrets_named_mutex_release(new_conn->controller);
 
                if (NT_STATUS_IS_OK(result))
                        break;
-
-               secrets_named_mutex_release(new_conn->controller, 
&new_conn->mutex_ref_count);
-               got_mutex = False;
        }
 
        SAFE_FREE(ipc_username);
@@ -391,8 +387,6 @@
        SAFE_FREE(ipc_password);
 
        if (!NT_STATUS_IS_OK(result)) {
-               if (got_mutex)
-                       secrets_named_mutex_release(new_conn->controller, 
&new_conn->mutex_ref_count);
                add_failed_connection_entry(new_conn, result);
                return result;
        }
@@ -407,16 +401,12 @@
                 * if the PDC is an NT4 box.   but since there is only one 2k 
                 * specific UUID right now, i'm not going to bother.  --jerry
                 */
-               if (got_mutex)
-                       secrets_named_mutex_release(new_conn->controller, 
&new_conn->mutex_ref_count);
                if ( !is_win2k_pipe(pipe_index) )
                        add_failed_connection_entry(new_conn, result);
                cli_shutdown(new_conn->cli);
                return result;
        }
 
-       if ((got_mutex) && !keep_mutex)
-               secrets_named_mutex_release(new_conn->controller, 
&new_conn->mutex_ref_count);
        return NT_STATUS_OK;
 }
 
@@ -455,7 +445,7 @@
 /* Get a connection to the remote DC and open the pipe.  If there is already a 
connection, use that */
 
 static NTSTATUS get_connection_from_cache(const char *domain, const char *pipe_name,
-               struct winbindd_cm_conn **conn_out, BOOL keep_mutex) 
+               struct winbindd_cm_conn **conn_out) 
 {
        struct winbindd_cm_conn *conn, conn_temp;
        NTSTATUS result;
@@ -472,12 +462,6 @@
                                SAFE_FREE(conn);
                                conn = &conn_temp;  /* Just to keep the loop moving */
                        } else {
-                               if (keep_mutex) {
-                                       if (!secrets_named_mutex(conn->controller,
-                                                       
WINBIND_SERVER_MUTEX_WAIT_TIME, &conn->mutex_ref_count))
-                                               DEBUG(0,("get_connection_from_cache: 
mutex grab failed for %s\n",
-                                                       conn->controller));
-                               }
                                break;
                        }
                }
@@ -489,7 +473,7 @@
                
                ZERO_STRUCTP(conn);
                
-               if (!NT_STATUS_IS_OK(result = cm_open_connection(domain, 
get_pipe_index(pipe_name), conn, keep_mutex))) {
+               if (!NT_STATUS_IS_OK(result = cm_open_connection(domain, 
get_pipe_index(pipe_name), conn))) {
                        DEBUG(3, ("Could not open a connection to %s for %s (%s)\n", 
                                  domain, pipe_name, nt_errstr(result)));
                        SAFE_FREE(conn);
@@ -517,7 +501,7 @@
        ZERO_STRUCT( ctr );
        
        
-       if ( !NT_STATUS_IS_OK(result = cm_open_connection(domain, PI_LSARPC_DS, &conn, 
False)) ) {
+       if ( !NT_STATUS_IS_OK(result = cm_open_connection(domain, PI_LSARPC_DS, 
&conn)) ) {
                DEBUG(5, ("cm_check_for_native_mode_win2k: Could not open a connection 
to %s for PIPE_LSARPC (%s)\n", 
                          domain, nt_errstr(result)));
                return False;
@@ -555,7 +539,7 @@
 
        /* Look for existing connections */
 
-       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, 
&conn, False)))
+       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, 
&conn)))
                return NULL;
 
        /* This *shitty* code needs scrapping ! JRA */
@@ -571,7 +555,7 @@
        if (!NT_STATUS_IS_OK(result)) {
                /* Hit the cache code again.  This cleans out the old connection and 
gets a new one */
                if (conn->cli->fd == -1) { /* Try again, if the remote host disapeared 
*/
-                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_LSARPC, &conn, False)))
+                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_LSARPC, &conn)))
                                return NULL;
 
                        result = cli_lsa_open_policy(conn->cli, conn->cli->mem_ctx, 
False, 
@@ -603,7 +587,7 @@
 
        /* Look for existing connections */
 
-       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, 
&conn, False)))
+       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, 
&conn)))
                return NULL;
        
        /* This *shitty* code needs scrapping ! JRA */
@@ -618,7 +602,7 @@
        if (!NT_STATUS_IS_OK(result)) {
                /* Hit the cache code again.  This cleans out the old connection and 
gets a new one */
                if (conn->cli->fd == -1) { /* Try again, if the remote host disapeared 
*/
-                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_SAMR, &conn, False)))
+                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_SAMR, &conn)))
                                return NULL;
 
                        result = cli_samr_connect(conn->cli, conn->cli->mem_ctx,
@@ -875,35 +859,47 @@
        NTSTATUS result = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
        struct winbindd_cm_conn *conn;
        uint32 neg_flags = 0x000001ff;
+       fstring lock_name;
+       BOOL got_mutex;
 
        if (!cli)
                return NT_STATUS_INVALID_PARAMETER;
 
        /* Open an initial conection - keep the mutex. */
 
-       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, 
&conn, True)))
+       if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, 
&conn)))
                return result;
        
-       result = cli_nt_setup_creds(conn->cli, get_sec_chan(), trust_passwd, 
&neg_flags, 2);
-
-       if (conn->mutex_ref_count)
-               secrets_named_mutex_release(conn->controller, &conn->mutex_ref_count);
+       snprintf(lock_name, sizeof(lock_name), "NETLOGON\\%s", conn->controller);
 
+       if (!(got_mutex = secrets_named_mutex(lock_name, 
WINBIND_SERVER_MUTEX_WAIT_TIME))) {
+               DEBUG(0,("cm_get_netlogon_cli: mutex grab failed for %s\n", 
conn->controller));
+       }
+                       
+       result = cli_nt_setup_creds(conn->cli, get_sec_chan(), trust_passwd, 
&neg_flags, 2);
+       
+       if (got_mutex)
+               secrets_named_mutex_release(lock_name);
+                       
        if (!NT_STATUS_IS_OK(result)) {
                DEBUG(0, ("error connecting to domain password server: %s\n",
                          nt_errstr(result)));
                
                /* Hit the cache code again.  This cleans out the old connection and 
gets a new one */
                if (conn->cli->fd == -1) {
-
-                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_NETLOGON, &conn, True)))
+                       if (!NT_STATUS_IS_OK(result = 
get_connection_from_cache(domain, PIPE_NETLOGON, &conn)))
                                return result;
                        
+                       snprintf(lock_name, sizeof(lock_name), "NETLOGON\\%s", 
conn->controller);
+                       if (!(got_mutex = secrets_named_mutex(lock_name, 
WINBIND_SERVER_MUTEX_WAIT_TIME))) {
+                               DEBUG(0,("cm_get_netlogon_cli: mutex grab failed for 
%s\n", conn->controller));
+                       }
+                       
                        /* Try again */
                        result = cli_nt_setup_creds( conn->cli, 
get_sec_chan(),trust_passwd, &neg_flags, 2);
-
-                       if (conn->mutex_ref_count)
-                               secrets_named_mutex_release(conn->controller, 
&conn->mutex_ref_count);
+                       
+                       if (got_mutex)
+                               secrets_named_mutex_release(lock_name);
                }
                
                if (!NT_STATUS_IS_OK(result)) {
Index: passdb/secrets.c
===================================================================
RCS file: /data/cvs/samba/source/passdb/secrets.c,v
retrieving revision 1.54
diff -u -r1.54 secrets.c
--- passdb/secrets.c    1 Feb 2003 04:39:15 -0000       1.54
+++ passdb/secrets.c    8 Mar 2003 09:56:46 -0000
@@ -588,24 +588,17 @@
  between smbd instances.
 *******************************************************************************/
 
-BOOL secrets_named_mutex(const char *name, unsigned int timeout, size_t *p_ref_count)
+BOOL secrets_named_mutex(const char *name, unsigned int timeout)
 {
-       size_t ref_count = *p_ref_count;
        int ret = 0;
 
        if (!message_init())
                return False;
 
-       if (ref_count == 0) {
-               ret = tdb_lock_bystring(tdb, name, timeout);
-               if (ret == 0)
-                       DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name ));
-       }
+       ret = tdb_lock_bystring(tdb, name, timeout);
+       if (ret == 0)
+               DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name ));
 
-       if (ret == 0) {
-               *p_ref_count = ++ref_count;
-               DEBUG(10,("secrets_named_mutex: ref_count for mutex %s = %u\n", name, 
(unsigned int)ref_count ));
-       }
        return (ret == 0);
 }
 
@@ -613,19 +606,10 @@
  Unlock a named mutex.
 *******************************************************************************/
 
-void secrets_named_mutex_release(const char *name, size_t *p_ref_count)
+void secrets_named_mutex_release(const char *name)
 {
-       size_t ref_count = *p_ref_count;
-
-       SMB_ASSERT(ref_count != 0);
-
-       if (ref_count == 1) {
-               tdb_unlock_bystring(tdb, name);
-               DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name ));
-       }
-
-       *p_ref_count = --ref_count;
-       DEBUG(10,("secrets_named_mutex_release: ref_count for mutex %s = %u\n", name, 
(unsigned int)ref_count ));
+       tdb_unlock_bystring(tdb, name);
+       DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name ));
 }
 
 /*********************************************************

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to