1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-08 05:57:51 +03:00

Fix more use of VFS_STAT when posix pathnames selected.

Jeremy.
This commit is contained in:
Jeremy Allison 2009-10-02 11:05:03 -07:00
parent a076d9fb59
commit 1e322cf6a9
3 changed files with 51 additions and 20 deletions

View File

@ -170,7 +170,7 @@ static int smbacl4_GetFileOwner(struct connection_struct *conn,
/* Get the stat struct for the owner info. */ /* Get the stat struct for the owner info. */
if (vfs_stat_smb_fname(conn, filename, psbuf) != 0) if (vfs_stat_smb_fname(conn, filename, psbuf) != 0)
{ {
DEBUG(8, ("SMB_VFS_STAT failed with error %s\n", DEBUG(8, ("vfs_stat_smb_fname failed with error %s\n",
strerror(errno))); strerror(errno)));
return -1; return -1;
} }

View File

@ -3377,6 +3377,7 @@ NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name,
struct pai_val *pal; struct pai_val *pal;
struct smb_filename *smb_fname = NULL; struct smb_filename *smb_fname = NULL;
NTSTATUS status; NTSTATUS status;
int ret;
*ppdesc = NULL; *ppdesc = NULL;
@ -3389,7 +3390,13 @@ NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name,
} }
/* Get the stat struct for the owner info. */ /* Get the stat struct for the owner info. */
if(SMB_VFS_STAT(conn, smb_fname) != 0) { if (lp_posix_pathnames()) {
ret = SMB_VFS_LSTAT(conn, smb_fname);
} else {
ret = SMB_VFS_STAT(conn, smb_fname);
}
if (ret == -1) {
status = map_nt_error_from_unix(errno); status = map_nt_error_from_unix(errno);
goto out; goto out;
} }
@ -3435,7 +3442,12 @@ int try_chown(connection_struct *conn, struct smb_filename *smb_fname,
/* Case (1). */ /* Case (1). */
/* try the direct way first */ /* try the direct way first */
ret = SMB_VFS_CHOWN(conn, smb_fname->base_name, uid, gid); if (lp_posix_pathnames()) {
ret = SMB_VFS_LCHOWN(conn, smb_fname->base_name, uid, gid);
} else {
ret = SMB_VFS_CHOWN(conn, smb_fname->base_name, uid, gid);
}
if (ret == 0) if (ret == 0)
return 0; return 0;
@ -3454,8 +3466,13 @@ int try_chown(connection_struct *conn, struct smb_filename *smb_fname,
become_root(); become_root();
/* Keep the current file gid the same - take ownership doesn't imply group change. */ /* Keep the current file gid the same - take ownership doesn't imply group change. */
ret = SMB_VFS_CHOWN(conn, smb_fname->base_name, uid, if (lp_posix_pathnames()) {
(gid_t)-1); ret = SMB_VFS_LCHOWN(conn, smb_fname->base_name, uid,
(gid_t)-1);
} else {
ret = SMB_VFS_CHOWN(conn, smb_fname->base_name, uid,
(gid_t)-1);
}
unbecome_root(); unbecome_root();
return ret; return ret;
} }
@ -3476,7 +3493,13 @@ int try_chown(connection_struct *conn, struct smb_filename *smb_fname,
return -1; return -1;
} }
if (SMB_VFS_STAT(conn, smb_fname)) { if (lp_posix_pathnames()) {
ret = SMB_VFS_STAT(conn, smb_fname);
} else {
ret = SMB_VFS_STAT(conn, smb_fname);
}
if (ret == -1) {
return -1; return -1;
} }
@ -3716,6 +3739,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
bool set_acl_as_root = false; bool set_acl_as_root = false;
bool acl_set_support = false; bool acl_set_support = false;
bool ret = false; bool ret = false;
int sret;
DEBUG(10,("set_nt_acl: called for file %s\n", DEBUG(10,("set_nt_acl: called for file %s\n",
fsp_str_dbg(fsp))); fsp_str_dbg(fsp)));
@ -3730,7 +3754,12 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
*/ */
if(fsp->is_directory || fsp->fh->fd == -1) { if(fsp->is_directory || fsp->fh->fd == -1) {
if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) { if (fsp->posix_open) {
sret = SMB_VFS_LSTAT(fsp->conn, fsp->fsp_name);
} else {
sret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
}
if (sret == -1) {
return map_nt_error_from_unix(errno); return map_nt_error_from_unix(errno);
} }
} else { } else {
@ -3780,21 +3809,18 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
* (suid/sgid bits, for instance) * (suid/sgid bits, for instance)
*/ */
if(fsp->is_directory) { if(fsp->is_directory || fsp->fh->fd == -1) {
if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) { if (fsp->posix_open) {
return map_nt_error_from_unix(errno); sret = SMB_VFS_LSTAT(fsp->conn, fsp->fsp_name);
} else {
sret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
} }
} else { } else {
sret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
}
int sret; if(sret == -1) {
return map_nt_error_from_unix(errno);
if(fsp->fh->fd == -1)
sret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
else
sret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
if(sret != 0)
return map_nt_error_from_unix(errno);
} }
/* Save the original element we check against. */ /* Save the original element we check against. */

View File

@ -1008,7 +1008,12 @@ int vfs_stat_smb_fname(struct connection_struct *conn, const char *fname,
return -1; return -1;
} }
ret = SMB_VFS_STAT(conn, smb_fname); if (lp_posix_pathnames()) {
ret = SMB_VFS_LSTAT(conn, smb_fname);
} else {
ret = SMB_VFS_STAT(conn, smb_fname);
}
if (ret != -1) { if (ret != -1) {
*psbuf = smb_fname->st; *psbuf = smb_fname->st;
} }