summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2013-04-09 21:18:34 +0200
committerJeremy Allison <jra@samba.org>2013-04-10 00:12:06 +0200
commit69b3d1944501f65427fbd12e4ddd3b66e67deedd (patch)
treeb11b8ebf3d6a22b608f47fa3ba7e66d65205ecf8
parentce2fb2d019b6f8304b81e2d4d68bdac31edcf025 (diff)
downloadsamba-69b3d1944501f65427fbd12e4ddd3b66e67deedd.tar.gz
samba-69b3d1944501f65427fbd12e4ddd3b66e67deedd.tar.bz2
samba-69b3d1944501f65427fbd12e4ddd3b66e67deedd.zip
vfs_fake_perms: Fix bug 9775, segfault for "artificial" conn_structs
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Wed Apr 10 00:12:06 CEST 2013 on sn-devel-104
-rw-r--r--source3/modules/vfs_fake_perms.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/source3/modules/vfs_fake_perms.c b/source3/modules/vfs_fake_perms.c
index f8d89019be..8eb6e3c779 100644
--- a/source3/modules/vfs_fake_perms.c
+++ b/source3/modules/vfs_fake_perms.c
@@ -44,8 +44,21 @@ static int fake_perms_stat(vfs_handle_struct *handle,
} else {
smb_fname->st.st_ex_mode = S_IRWXU;
}
- smb_fname->st.st_ex_uid = handle->conn->session_info->unix_token->uid;
- smb_fname->st.st_ex_gid = handle->conn->session_info->unix_token->gid;
+
+ if (handle->conn->session_info != NULL) {
+ struct security_unix_token *utok;
+
+ utok = handle->conn->session_info->unix_token;
+ smb_fname->st.st_ex_uid = utok->uid;
+ smb_fname->st.st_ex_gid = utok->gid;
+ } else {
+ /*
+ * We have an artificial connection for dfs for example. It
+ * sucks, but the current uid/gid is the best we have.
+ */
+ smb_fname->st.st_ex_uid = geteuid();
+ smb_fname->st.st_ex_gid = getegid();
+ }
return ret;
}
@@ -64,8 +77,20 @@ static int fake_perms_fstat(vfs_handle_struct *handle, files_struct *fsp, SMB_ST
} else {
sbuf->st_ex_mode = S_IRWXU;
}
- sbuf->st_ex_uid = handle->conn->session_info->unix_token->uid;
- sbuf->st_ex_gid = handle->conn->session_info->unix_token->gid;
+ if (handle->conn->session_info != NULL) {
+ struct security_unix_token *utok;
+
+ utok = handle->conn->session_info->unix_token;
+ sbuf->st_ex_uid = utok->uid;
+ sbuf->st_ex_gid = utok->gid;
+ } else {
+ /*
+ * We have an artificial connection for dfs for example. It
+ * sucks, but the current uid/gid is the best we have.
+ */
+ sbuf->st_ex_uid = geteuid();
+ sbuf->st_ex_gid = getegid();
+ }
return ret;
}