const SMB_STRUCT_STAT *psbuf);
/****************************************************************************
- Check if an open file handle or smb_fname is a symlink.
+ Check if an open file handle is a symlink.
****************************************************************************/
-static NTSTATUS refuse_symlink(connection_struct *conn,
- const files_struct *fsp,
- const struct smb_filename *smb_fname)
+static NTSTATUS refuse_symlink_fsp(const files_struct *fsp)
{
- SMB_STRUCT_STAT sbuf;
- const SMB_STRUCT_STAT *pst = NULL;
- if (fsp) {
- pst = &fsp->fsp_name->st;
- } else {
- pst = &smb_fname->st;
+ if (!VALID_STAT(fsp->fsp_name->st)) {
+ return NT_STATUS_ACCESS_DENIED;
}
-
- if (!VALID_STAT(*pst)) {
- int ret = vfs_stat_smb_basename(conn,
- smb_fname,
- &sbuf);
- if (ret == -1 && errno != ENOENT) {
- return map_nt_error_from_unix(errno);
- } else if (ret == -1) {
- /* it's not a symlink.. */
- return NT_STATUS_OK;
- }
- pst = &sbuf;
+ if (S_ISLNK(fsp->fsp_name->st.st_ex_mode)) {
+ return NT_STATUS_ACCESS_DENIED;
}
-
- if (S_ISLNK(pst->st_ex_mode)) {
+ if (fsp_get_pathref_fd(fsp) == -1) {
return NT_STATUS_ACCESS_DENIED;
}
return NT_STATUS_OK;
posix_pathnames = (fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH);
- status = refuse_symlink(conn, fsp, fsp->fsp_name);
+ status = refuse_symlink_fsp(fsp);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
SMB_ASSERT(fsp != NULL);
- status = refuse_symlink(conn,
- fsp,
- fsp->fsp_name);
+ status = refuse_symlink_fsp(fsp);
if (!NT_STATUS_IS_OK(status)) {
goto out;
}
/* Here we know fsp != NULL */
SMB_ASSERT(fsp != NULL);
- status = refuse_symlink(conn, fsp, fsp->fsp_name);
+ status = refuse_symlink_fsp(fsp);
if (!NT_STATUS_IS_OK(status)) {
goto out;
}