[jcifs] Possible deadlocking between jcifs.smb.Dfs and jcifs.smb.SmbTransport

Xavier Roche roche at exalead.com
Wed Feb 29 09:33:13 MST 2012


Hi folks!

[ Issue found in jcifs 1.3.17 ]

jcifs.smb.Dfs and jcifs.smb.SmbTransport seems to be deadlocking due to 
Mutex ordering mismatch in the code.

[ Is it safe to use SmbFile in two different threads simultaneously, or 
does it need to be synchronized too ? ]

Typical example: in the following two threads, the locking ordering is 
different

Thread 1:
	jcifs.smb.SmbTransport.getSmbSession(SmbTransport.java:126)
		**** LOCKED(SmbTransport):
			synchronized SmbSession getSmbSession
	jcifs.smb.SmbTransport.getDfsReferrals(SmbTransport.java:701)
	jcifs.smb.Dfs.getReferral(Dfs.java:143)
	jcifs.smb.Dfs.resolve(Dfs.java:191)
		**** LOCKED(Dfs):
			public synchronized DfsReferral
	jcifs.smb.SmbFile.doConnect(SmbFile.java:902)
	jcifs.smb.SmbFile.connect(SmbFile.java:954)
	jcifs.smb.SmbFile.connect0(SmbFile.java:880)
	jcifs.smb.SmbFile.queryPath(SmbFile.java:1335)
	jcifs.smb.SmbFile.exists(SmbFile.java:1417)
	jcifs.smb.SmbFile.isDirectory(SmbFile.java:1490)
	<client code>

Thread 2:
	jcifs.smb.Dfs.insert(Dfs.java:289)
		**** LOCKED(Dfs):
			synchronized void insert
	jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:556)
	jcifs.smb.SmbTransport.send(SmbTransport.java:640)
		**** LOCKED(SmbTransport):
			synchronized (this)
	jcifs.smb.SmbSession.send(SmbSession.java:238)
	jcifs.smb.SmbTree.send(SmbTree.java:119)
	jcifs.smb.SmbFile.send(SmbFile.java:775)
	jcifs.smb.SmbFile.queryPath(SmbFile.java:1363)
	jcifs.smb.SmbFile.exists(SmbFile.java:1417)
	jcifs.smb.SmbFile.isDirectory(SmbFile.java:1490)
	<client code>

I'm available to do more testing if necessary!



More information about the jCIFS mailing list