check_parent_exists() can change errno. Ensure we preserve it across calls.
authorAnand Avati <avati@redhat.com>
Mon, 29 Apr 2013 22:21:00 +0000 (15:21 -0700)
committerKarolin Seeger <kseeger@samba.org>
Tue, 7 May 2013 08:32:42 +0000 (10:32 +0200)
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Tue Apr 30 11:00:11 CEST 2013 on sn-devel-104
(cherry picked from commit 7e807934e6550308efed814a20ce6d6dabbad557)

Fix bug #9833 - Function called in unix_convert() path can overwrite errno.

Autobuild-User(v4-0-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-0-test): Tue May  7 10:32:43 CEST 2013 on sn-devel-104

source3/smbd/filename.c

index 0be566f8975406fb6299d1f8ae55cec030062d79..9b05de368c15bc9a69ef7152770a6009e48f12d7 100644 (file)
@@ -450,13 +450,17 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 
                if (errno == ENOENT) {
                        /* Optimization when creating a new file - only
-                          the last component doesn't exist. */
+                          the last component doesn't exist.
+                          NOTE : check_parent_exists() doesn't preserve errno.
+                       */
+                       int saved_errno = errno;
                        status = check_parent_exists(ctx,
                                                conn,
                                                posix_pathnames,
                                                smb_fname,
                                                &dirpath,
                                                &start);
+                       errno = saved_errno;
                        if (!NT_STATUS_IS_OK(status)) {
                                goto fail;
                        }
@@ -529,13 +533,16 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                 * Optimization for common case where the wildcard
                 * is in the last component and the client already
                 * sent the correct case.
+                * NOTE : check_parent_exists() doesn't preserve errno.
                 */
+               int saved_errno = errno;
                status = check_parent_exists(ctx,
                                        conn,
                                        posix_pathnames,
                                        smb_fname,
                                        &dirpath,
                                        &start);
+               errno = saved_errno;
                if (!NT_STATUS_IS_OK(status)) {
                        goto fail;
                }