[PATCH] Fix smbd panic if we chdir() to an unreadable directory.
Ralph Böhme
slow at samba.org
Sun Oct 8 16:51:25 UTC 2017
Howdy!
On Fri, Oct 06, 2017 at 09:56:50PM +0000, Jeremy Allison wrote:
> Please review and push if happy.
generally looks good, but, while at it, can we use an early return and reduce the
indentation level please?
-slow
-------------- next part --------------
From cae435c8a948c1a39ab750aba24fe749e79601a2 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Sun, 8 Oct 2017 18:48:23 +0200
Subject: [PATCH] FIXUP: early return from failing SMB_VFS_CHDIR, reducing
indentation level
---
source3/smbd/vfs.c | 92 +++++++++++++++++++++++++++++-------------------------
1 file changed, 49 insertions(+), 43 deletions(-)
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 817e69b484b..d4fccb7eda9 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -888,57 +888,63 @@ int vfs_ChDir(connection_struct *conn, const struct smb_filename *smb_fname)
DEBUG(4,("vfs_ChDir to %s\n", smb_fname->base_name));
ret = SMB_VFS_CHDIR(conn, smb_fname);
- if (ret == 0) {
+ if (ret != 0) {
+ saved_errno = errno;
+ TALLOC_FREE(saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+
+ /*
+ * Always replace conn->cwd_fname. We
+ * don't know if it's been modified by
+ * VFS modules in the stack.
+ */
+
+ /* conn cache. */
+ TALLOC_FREE(conn->cwd_fname);
+ conn->cwd_fname = vfs_GetWd(conn, conn);
+ if (conn->cwd_fname == NULL) {
/*
- * Always replace conn->cwd_fname. We
- * don't know if it's been modified by
- * VFS modules in the stack.
+ * vfs_GetWd() failed.
+ * We must be able to read cwd.
+ * Return to original directory
+ * and return -1.
*/
- /* conn cache. */
- TALLOC_FREE(conn->cwd_fname);
- conn->cwd_fname = vfs_GetWd(conn, conn);
- if (conn->cwd_fname == NULL) {
+ saved_errno = errno;
+
+ if (saved_cwd == NULL) {
/*
- * vfs_GetWd() failed.
- * We must be able to read cwd.
- * Return to original directory
- * and return -1.
+ * Failed on the very first chdir()+getwd()
+ * for this connection. We can't
+ * continue.
*/
- saved_errno = errno;
-
- if (saved_cwd == NULL) {
- /*
- * Failed on the very first chdir()+getwd()
- * for this connection. We can't
- * continue.
- */
- smb_panic("conn->cwd getwd failed\n");
- /* NOTREACHED */
- return -1;
- }
-
- /* Return to the previous $cwd. */
- ret = SMB_VFS_CHDIR(conn, saved_cwd);
- if (ret != 0) {
- smb_panic("conn->cwd getwd failed\n");
- /* NOTREACHED */
- return -1;
- }
- /* Restore original conn->cwd_fname. */
- conn->cwd_fname = saved_cwd;
- errno = saved_errno;
- /* And fail the chdir(). */
+ smb_panic("conn->cwd getwd failed\n");
+ /* NOTREACHED */
return -1;
}
- /* vfs_GetWd() succeeded. */
- /* Replace global cache. */
- SAFE_FREE(LastDir);
- LastDir = SMB_STRDUP(smb_fname->base_name);
- DEBUG(4,("vfs_ChDir got %s\n", conn->cwd_fname->base_name));
- } else {
- saved_errno = errno;
+ /* Return to the previous $cwd. */
+ ret = SMB_VFS_CHDIR(conn, saved_cwd);
+ if (ret != 0) {
+ smb_panic("conn->cwd getwd failed\n");
+ /* NOTREACHED */
+ return -1;
+ }
+ /* Restore original conn->cwd_fname. */
+ conn->cwd_fname = saved_cwd;
+ errno = saved_errno;
+ /* And fail the chdir(). */
+ return -1;
}
+
+ /* vfs_GetWd() succeeded. */
+ /* Replace global cache. */
+ SAFE_FREE(LastDir);
+ LastDir = SMB_STRDUP(smb_fname->base_name);
+
+ DEBUG(4,("vfs_ChDir got %s\n", conn->cwd_fname->base_name));
+
TALLOC_FREE(saved_cwd);
if (saved_errno != 0) {
errno = saved_errno;
--
2.13.5
More information about the samba-technical
mailing list