From 69b3d1944501f65427fbd12e4ddd3b66e67deedd Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 9 Apr 2013 21:18:34 +0200 Subject: vfs_fake_perms: Fix bug 9775, segfault for "artificial" conn_structs Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Wed Apr 10 00:12:06 CEST 2013 on sn-devel-104 --- source3/modules/vfs_fake_perms.c | 33 +++++++++++++++++++++++++++++---- 1 file 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; } -- cgit