libsmbclient - Thread Saftey
David Collier-Brown
davecb at sun.com
Sun Oct 5 22:34:21 GMT 2008
Derrell Lipman wrote:
> On Fri, Oct 3, 2008 at 9:15 PM, David Collier-Brown <davecb at sun.com
> <mailto:davecb at sun.com>> wrote:
>
> Ok, in GIT/v4-0-test/examples/libsmbclient there is a copy of smbclient,
> so I reran port on it instead, and indeed found some additional
> and/or differnt data.
>
>
> Ok, well it's good to see that all of these that you found are in test
> programs or in smbwrapper which is an example application that uses
> libsmbclient. None of these are in the libsmbclient library code, so
> that's good. However, I'm still not sure what code you're looking at
> since I don't see a top-level examples directory in my git tree for
> v4-0-test, and no smbclient directory anyplace in the tree:
>
> {dworkin} /home/derrell/=/samba.git/samba4 ---> git branch
> * v4-0-test
> {dworkin} /home/derrell/=/samba.git/samba4 ---> find . -name examples -print
> ./source/lib/ldb/examples
> ./source/lib/zlib/examples
> ./source/lib/netapi/examples
> ./source/scripting/python/examples
> {dworkin} /home/derrell/=/samba.git/samba4 ---> find . -name
> '*smbclient*' -print
> ./source/bin/smbclient
> ./source/pkgconfig/smbclient.pc
> ./source/client/tests/test_smbclient.sh
> {dworkin} /home/derrell/=/samba.git/samba4 --->
>
I created the est tree with the commands:
froggy> rm -rf v4-0-test
froggy> git-clone git://git.samba.org/samba.git v4-0-test
# cd v4-0-test
froggy> find . -name '*smbclient*'
./docs-xml/Samba4-HOWTO/smbclient.xml
./docs-xml/manpages-3/libsmbclient.7.xml
./docs-xml/manpages-3/smbclient.1.xml
./examples/libsmbclient
These were from ./examples/libsmbclient
smbclient*'
> libsmbclient is current in branch v3-2-test in source/libsmb, and in
> branch master insource3/libsmb.
Ok if I run
froggy> rm -rf v3-2-test
froggy> git-clone git://git.samba.org/samba.git v3-2-test
froggy> find v3-2-test -name '*smbclient*'
I don't find it, although ther are lost of libsmb
files there.
Do you want a review of them?
>
> What utility are you running to generate this report? It looks like a
> useful tool to have available...
It's "port", described in "Strength-Reducing the Task of Porting" at http://datacenterworks.com/stories/port.html
The hard part is having the database: I created this one by postprocessing
Solaris/Posix man pages's "Attributes" sections.
--dave
>
> Derrell
>
>
> lib
> froggy> more mtcheck.report
> ctermid - generate path name for controlling terminal
> MT-Level: The ctermid() function is unsafe in multithreaded
> applications.
> The ctermid_r() function is MT-Safe, and should be
> used instead. When compiling multithreaded
> applications, the _REENTRANT flag must be defined
> on the compile line. This flag should be used only
> with multithreaded applications.
>
> Found in:
> "/opt/csw/gcc3/lib/gcc/sparc-sun-solaris2.8/3.4.5/include/stdio.h",
> 284:
>
>
> ctime - convert date and time to string
> MT-Level: MT-Safe with exceptions
> use ctime_r
>
> Found in:
> "./testsmbc.c",
> 254:
> 257:
> "./tree.c",
> 285:
>
> getopt - get option letter from argument vector
> MT-Level: MT-Unsafe
>
> Found in:
> "./smbwrapper/smbsh.c",
> 66:
> "/opt/csw/gcc3/lib/gcc/sparc-sun-solaris2.8/3.4.5/include/stdio.h",
> 319:
>
>
> getpass - read a string of characters without echo
> MT-Level: MT-Unsafe
>
> Found in:
> "./smbwrapper/smbsh.c",
> 119:
>
>
> pclose - initiate a pipe to or from a process
> MT-Level: MT-Unsafe
>
> Found in:
> "/opt/csw/gcc3/lib/gcc/sparc-sun-solaris2.8/3.4.5/include/stdio.h",
> 311:
>
> popen - initiate a pipe to or from a process
> MT-Level: MT-Unsafe
>
> Found in:
> "/opt/csw/gcc3/lib/gcc/sparc-sun-solaris2.8/3.4.5/include/stdio.h",
> 309:
>
> readdir - read directory
> MT-Level: When compiling multithreaded programs, see Intro 3 ,
> Notes On Multithreaded Applications . The readdir()
> function is unsafe in
>
> multithreaded applications. The readdir_r() function is safe, and
> should be used instead.
>
> Found in:
> "./smbwrapper/opendir_smbsh.c",
> 36:
> "./smbwrapper/wrapper.c",
> 1209:
> 311:
>
> popen - initiate a pipe to or from a process
> MT-Level: MT-Unsafe
>
> Found in:
> "/opt/csw/gcc3/lib/gcc/sparc-sun-solaris2.8/3.4.5/include/stdio.h",
> 309:
>
> readdir - read directory
> MT-Level: When compiling multithreaded programs, see Intro 3 ,
> Notes On Multithreaded Applications . The readdir()
> function is unsafe in
>
> multithreaded applications. The readdir_r() function is safe, and
> should be used instead.
>
> Found in:
> "./smbwrapper/opendir_smbsh.c",
> 36:
> "./smbwrapper/wrapper.c",
> 1209:
> 1222: NC
> "./smbwrapper/wrapper.h",
> 132:
>
> --dave
>
>
>
> David Collier-Brown wrote:
>
> I did a scan from a copy of v4-0-test after a git-fetch. I'll
> clean my directory and refetch it and 3.2-test, unless there is
> a specific tree I should use...
>
> --dave
>
> Derrell Lipman wrote:
>
> On Fri, Oct 3, 2008 at 5:40 PM, David Collier-Brown
> <davec-b at rogers.com <mailto:davec-b at rogers.com>
> <mailto:davec-b at rogers.com <mailto:davec-b at rogers.com>>> wrote:
>
> I did a check for MT-safe versus merely
> async-signal-safe functions in
> the samba4 libsmbclient, and found a number that need
> attention:
>
>
> Hi David, thanks for reporting these!
>
> I'm not sure which libsmbclient you're basing this on.
> There is no libsmbclient in samba4 unless it's something
> ancient from the early days of samba4, and I can't find any
> calls to getpass -- one of the issues you raise -- anyplace
> in samba3 (master) libsmb_*.c. I did find one call to it in
> clidfs.c but I'm not sure if/when that's called by
> libsmbclient code.
>
> Please let me know what source tree you were looking at in
> locating these. I'm going to create a bug report to keep
> track of these things so that I can fix them when I have
> some time.
>
> Thanks again,
>
> Derrell
>
>
>
> 1) The MT-safe (or unsafe!) ones were:
>
> atof - convert string to double-precision number
> MT-Level: MT-Safe as long as setlocale(3C) is not
> called to change the locale.
>
> Found in:
> "./libsmbclient.c",
> 4697: 4730:
> ctime - convert date and time to string
> MT-Level: MT-Safe , but note that the return values
> for
> asctime(), ctime(), gmtime(), and
> localtime() point to thread-specific data whose
> content is
> overwritten by each call by the same thread.
>
> Found in:
> "./libsmbclient.c",
> 4044: 4050: getpass - read a string
> of characters without echo
> MT-Level: MT-Unsafe
> This one needs a buffer and a semaphore to protect it,
> and make it, in effect, a getpass_r
> Found in:
> "./clidfs.c",
> 203: inet_ntoa - Internet address manipulation
> MT-Level: MT-Unsafe, static buffer is overwritten on
> each call. Linux and Solaris *may* make this per-thread
> of the compiler is told to generate MT code...
>
> Found in:
> "./namequery.c",
> 716: 723: 1083: "./nmblib.c",
> 112: 802: 824: 839:
> readdir - read directory
> The readdir() function is unsafe in
> multithreaded applications. The readdir_r() function
> is safe, and
> should be used instead.
> Found in:
> "./libsmb_compat.c",
> 256: 2) The merely Async-Signal-Safe ones follow:
> as the change something
> external,
> two competing threads can fight over the results. If you
> really need
> to protect these, you need a semaphore that's visible to
> all callers
> of the library. In general, that's too much work for too
> little
> value (;-))
>
> chmod - change access permission mode of file
> close - close a file descriptor
> creat - create a new file or rewrite an existing one
> fstat - get file status
> geteuid - get real user, effective user, real group, and
> effective
> group IDs
> getuid - get real user, effective user, real group, and
> effective
> group IDs
> kill - send a signal to a process or a group of processes
> lseek - move read/write file pointer
> mkdir - make a directory
> open - open a file
> read - read from file
> rename - change the name of a file
> rmdir - remove a directory
> stat - get file status
> time - get time
> unlink - remove directory entry
> write - write on a file
>
> --dave
>
>
>
>
>
> Jeremy Allison wrote:
>
> On Fri, Oct 03, 2008 at 10:46:14AM -0400, Derrell
> Lipman wrote:
>
> On Fri, Oct 3, 2008 at 10:14 AM, Pane, Chris
> <cpane at vanteon.com <mailto:cpane at vanteon.com>
> <mailto:cpane at vanteon.com <mailto:cpane at vanteon.com>>> wrote:
>
>
> I have been using libsmbclient to do some smb
> share
> browsing in an
> application. I have read that it is currently
> not thread
> safe in samba-3.x.
> Anyone know if there are plans for it to be made
> thread-safe in samba4?
>
>
>
> Hi Chris,
>
> I believe I've eliminated all non-thread-safe
> issues from within
> libsmbclient itself (although that will require a
> thorough
> inspection to
> confirm), but the core functions within samba that
> libsmbclient calls have
> not been thread-safe. Samba4 interfaces are, I
> think,
> inherently
> thread-safe. Therefore, although no work has
> begun yet on
> creating a samba4
> version of libsmbclient (and it's not yet
> scheduled), I
> don't believe
> there's any reason why a samba4 libsmbclient
> can't or won't
> be thread-safe.
>
>
>
> The easiest thing to do at the moment is wrap the
> libsmbclient
> functions in a mutex. I'm looking at making the
> underlying
> functions thread safe, but that's a longer term job.
>
> Jeremy.
>
>
> -- David Collier-Brown, | Always do right.
> This will gratify
> System Programmer and Author | some people and astonish
> the rest
> davecb at spamcop.net <mailto:davecb at spamcop.net>
> <mailto:davecb at spamcop.net <mailto:davecb at spamcop.net>>
> | -- Mark Twain
> (416) 223-5943
>
>
>
>
> --
> David Collier-Brown | Always do right. This will gratify
> Sun Microsystems, Toronto | some people and astonish the rest
> davecb at sun.com <mailto:davecb at sun.com> |
> -- Mark Twain
> cell: (647) 833-9377, bridge: (877) 385-4099 code: 506 9191#
>
>
--
David Collier-Brown | Always do right. This will gratify
Sun Microsystems, Toronto | some people and astonish the rest
davecb at sun.com | -- Mark Twain
cell: (647) 833-9377, bridge: (877) 385-4099 code: 506 9191#
More information about the samba-technical
mailing list