Memory leak in libsmb/smbc_opendir() [reformatted]

Richard Sharpe sharpe at ns.aus.com
Tue Feb 26 11:29:03 GMT 2002


Hi,

Thanks for this.

I will try to apply this patch today.

Ong Kian Win wrote:

>Hi.
>
>smbc_opendir() would call cli_initialise() (through smbc_server()). However,
>cli_shutdown() would not be called at all. As such, there would be a memory
>leak.
>
>I suggest that smbc_closedir() call smbc_remove_unused_server().
>
>For depth-first traversals, calling smbc_opendir() would not result in
>additional connections being made, since the connection would have been
>established higher up in the file system. For smbc_opendir() and
>smbc_closedir() pairs which are *not nested*, however, there could
>potentially be a degradation in performance. smbc_closedir() would close the
>connection, requiring a new connection to be made every time.
>
>I am not sure if there is a good solution to this caveat. libsmb has
>abstracted away establishing a connection. Where you would normally do
>
>connect(share)
>	opendir
>	closedir
>	opendir
>	closedir
>disconnect(share)
>
>you would now do
>
>opendir(share)
>closedir (share)
>opendir
>closedir
>opendir
>closedir
>
>Regards,
>Kian Win
>
>Samba CVS HEAD, Feb 25 10:09 +0800
>
>--- libsmbclient.c.bkp.0	Wed Jan 30 14:08:19 2002
>+++ libsmbclient.c	Tue Feb 26 20:52:16 2002
>@@ -1508,6 +1508,36 @@
>
> }
>
>+/*
>+ * Routine to open a directory
>+ *
>+ * We want to allow:
>+ *
>+ * smb: which should list all the workgroups available
>+ * smb:workgroup
>+ * smb:workgroup//server
>+ * smb://server
>+ * smb://server/share
>+ * smb://<IP-addr> which should list shares on server
>+ * smb://<IP-addr>/share which should list files on share
>+ *
>+ */
>+
>+/*
>+ * Note that smbc_opendir("smb://server/share") and
>+ * smbc_opendir("smb://server/share/dir") would cache
>+ * the connection to the target share.
>+ *
>+ * smbc_closedir will remove that connection from
>+ * the cache immediately.
>+ *
>+ * This should not degrade performance for depth-first
>+ * traversals of shares. If you need breadth-first
>+ * traversals, you might want to do a dummy smbc_opendir,
>+ * and smbc_closedir only when you are done with the
>+ * entire share.
>+ */
>+
> int smbc_opendir(const char *fname)
> {
> 	fstring server, share, user, password, workgroup;
>@@ -1811,6 +1841,7 @@
> int smbc_closedir(int fd)
> {
> 	struct smbc_file *fe;
>+	struct smbc_server *srv;
>
> 	if (!smbc_initialized) {
>
>@@ -1837,14 +1868,11 @@
>
> 	smbc_remove_dir(fe); /* Clean it up */
>
>-	if (fe) {
>-
>-		SAFE_FREE(fe->fname);
>-		SAFE_FREE(fe);    /* Free the space too */
>-
>-	}
>-
>+	srv = fe->srv;
>+	SAFE_FREE(fe->fname);
>+	SAFE_FREE(fe);       /* Free the space too */
> 	smbc_file_table[fd - smbc_start_fd] = NULL;
>+	smbc_remove_unused_server(srv);
>
> 	return 0;
>
>
>
>

-- 
Richard Sharpe, rsharpe at ns.aus.com, rsharpe at samba.org, sharpe at ethereal.com
www.samba.org, www.ethereal.com, SAMS Teach Yourself Samba 
in 24 Hours, Special Edition, Using Samba







More information about the samba-technical mailing list