Re: NullPointerException in Dfs.resolve

Michael B Allen <[email protected]> Sun, 14 Jun 2015 11:37:48 -0400
Newsgroups gmane.network.samba.java
Message-ID <CAGMFw4hGL7JKvczNw7-MP7_EZOAo44NEmi+4J2UD5QTbaSvJSQ@mail.gmail.com>
I have added this post to the list of people who have reported it to
the TODO list so that it can be considered when I get around to
looking at this.

Note that the 1.3.18b mentioned in the link cited is here:

   http://jcifs.samba.org/old/jcifs-1.3.18b.jar

Although I cannot recall what it actually does anymore it might be
worth a try. We never received feedback about it.

Mike

On Sun, Jun 14, 2015 at 5:00 AM, Conrad Herrmann <[email protected]> wro=
te:
> Martin,
>
>
>
> I have recently run into the same problem.
>
>
>
> I think the problem is that SmbFile.resolveDfs() uses the currently
> connected transport as the DFS resolver/domain server
> (tree.session.transport.tconHostName), but it is very possible that there=
 is
> no currently connected transport.  In your case, that happens when the fi=
le
> server forces the TCP connection to close, and the transport tears itself
> down.
>
>
>
> And, although the resolveDfs() method calls connect0(), in fact this does
> nothing because doConnect() doesn't force creation of a new connection if=
 we
> are talking about a DFS resolved path.
>
>
>
> It seems to me that in that case, we have to start over again at the top =
of
> the referral tree, with the Domain.
>
>
>
> So my solution has this:  change the code for SmbFile.resolveDfs() lines =
671
> (or so) so that it says:
>
>
>
>         connect0();
>
>
>
>>        String hostName =3D tree.session.transport.tconHostName;
>
>>        String domainDfsServerName =3D getServerWithDfs();
>
>>        if (hostName =3D=3D null)
>
>>            hostName =3D domainDfsServerName;
>
>
>
>         DfsReferral dr =3D dfs.resolve(
>
>>                    hostName,
>
>                     tree.share,
>
>                     unc,
>
>                     auth);
>
>
>
> The code comes from the other use of tconHostName, in SmbFile.doConnect()=
:
>
>         String hostName =3D getServerWithDfs();
>
>         tree.inDomainDfs =3D dfs.resolve(hostName, tree.share, null, auth=
) !=3D
> null;
>
> In this code, we are getting the DFS resolver (which might be the domain
> server) as the hostName, and asking it to resolve our share.
>
>
>
> Basically what this new code is saying is that:
>
> - in the case where the transport has closed (ie, because of a timeout or
> TCP close on the DFS server side) reconnect to the DFS domain server in
> order to resolve a share's DFS server.
>
>
>
> I can imagine a case where this doesn't work--if we have multiple levels =
of
> DFS redirection, where the domain server cannot redirect the client to a
> deep subdirectory.  But, I don't even know if this is possible in DFS.  I=
f
> it is, then at least this solution removes the top level case and identif=
ies
> the problem, which would require walking down the DFS resolution path to
> resolve the actual file server.
>
>
>
> Conrad Herrmann
>
> Primdaesk, Inc.
>
>
>
>> Hi,
>
>>
>
>> I encountered a NullpointerException similar to
>
>> https://lists.samba.org/archive/jcifs/2012-January/009856.html - at
>
>> least the stack traces are similar.
>
>>
>
>> My Environment (Client side):
>
>> - jcifs 1.3.18
>
>> - IBM JDK 7
>
>> - AIX 7.1
>
>>
>
>> The NPE occured in a (in-house) plugin for the Jenkins build server. In
>
>> this system, JCIFs is used to recursively copy files from a Windows
>
>> share to an AIX machine.
>
>>
>
>> Re-running a build shortly after it finished triggered the NPE.
>
>>
>
>> After some debugging, it seems to me like the SmbFile=E2=80=99s underlyi=
ng
>
>> transport is closed (by timeout), and when SmbFile.resolveDfs is called,
>
>> the transport is not reconnected (unlike, for example, later in
>
>> SmbFile.resolve, or in SmbSession.getChallenge).
>
>>
>
>> I was able to reproduce the NPE during debugging using the following
>
>> steps:
>
>> - Trigger a build (recursively copying from a CIFS DFS tree)
>
>> - Wait until the transport objects disconnect by timeout (tracked by
>
>> breakpoint)
>
>> - Retrigger the build (recursively copying the same directory structure)
>
>>
>
>> The Jenkins plugin usually runs the second JCIFS copy operation in the
>
>> same thread than the first (though that's not guaranteed).
>
>> Each run uses a new SmbFile object.
>
>>
>
>> Am I missing something (like some close operation on SmbFile)?
>
>> Is this a known error?
>
>> Can I do something to fix it?
>
>>
>
>> Best regards,
>
>>
>
>> Martin
>
>>



--=20
Michael B Allen
Java Active Directory Integration
http://www.ioplex.com/