smbd: avoid double chdir() in chdir_current_service()
authorRalph Boehme <slow@samba.org>
Wed, 22 Jan 2020 09:52:39 +0000 (10:52 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 7 Apr 2020 09:37:25 +0000 (09:37 +0000)
Since 8e81090789e4cc3ba9e5aa792d4e52971909c894 we're doing chdir() twice, first
into conn->connectpath, then into conn->origpath.

Before commit 8e81090789e4cc3ba9e5aa792d4e52971909c894 if
chdir(conn->connectpath) succeeded, we wouldn't do the second chdir().

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14256
RN: smbd does a chdir() twice per request

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Thu Feb  6 11:44:07 UTC 2020 on sn-devel-184

(backported from commit f705629a171c1411131164f3adff36175154c093)

source3/smbd/service.c

index fd23d1a2d6066d980b1f1badafb4c08f94118099..a4f7f8985261a6bd285f633785340755912f1c89 100644 (file)
@@ -146,27 +146,30 @@ bool chdir_current_service(connection_struct *conn)
        const struct smb_filename origpath_fname = {
                .base_name = conn->origpath,
        };
+       int saved_errno = 0;
        int ret;
 
        conn->lastused_count++;
 
        ret = vfs_ChDir(conn, &connectpath_fname);
-       if (ret != 0) {
-               DEBUG(((errno!=EACCES)?0:3),
-                     ("chdir (%s) failed, reason: %s\n",
-                      conn->connectpath, strerror(errno)));
-               return false;
+       if (ret == 0) {
+               return true;
        }
+       saved_errno = errno;
+       DEBUG(((errno!=EACCES)?0:3),
+             ("chdir (%s) failed, reason: %s\n",
+              conn->connectpath, strerror(errno)));
 
        ret = vfs_ChDir(conn, &origpath_fname);
-       if (ret != 0) {
-               DEBUG(((errno!=EACCES)?0:3),
-                       ("chdir (%s) failed, reason: %s\n",
-                       conn->origpath, strerror(errno)));
-               return false;
+       if (ret == 0) {
+               return true;
        }
+       DEBUG(((errno!=EACCES)?0:3),
+             ("chdir (%s) failed, reason: %s\n",
+              conn->origpath, strerror(errno)));
 
-       return true;
+       errno = saved_errno;
+       return false;
 }
 
 /****************************************************************************