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