diff options
author | Anand Avati <avati@redhat.com> | 2013-04-29 15:21:00 -0700 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2013-05-07 10:32:42 +0200 |
commit | ed22de6479971421b8e32188bfea4521a5f1c0cc (patch) | |
tree | 49b80f19018d493ab3aa675cca09fbbf71540b58 | |
parent | a752308b89677d571300487858ba2509fe37ee6d (diff) | |
download | samba-ed22de6479971421b8e32188bfea4521a5f1c0cc.tar.gz |
check_parent_exists() can change errno. Ensure we preserve it across calls.
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
-rw-r--r-- | source3/smbd/filename.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 0be566f8975..9b05de368c1 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -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; } |