summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/msdfs.h6
-rw-r--r--source3/smbd/blocking.c17
-rw-r--r--source3/smbd/trans2.c386
3 files changed, 197 insertions, 212 deletions
diff --git a/source3/include/msdfs.h b/source3/include/msdfs.h
index e9fef5430e..4e3487de0f 100644
--- a/source3/include/msdfs.h
+++ b/source3/include/msdfs.h
@@ -71,6 +71,12 @@ struct dfs_path {
return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, \
ERRSRV, ERRbadpath);; }
+#define RESOLVE_DFSPATH_STATUS(name, conn, inbuf, outbuf) \
+{ if ((SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES) && \
+ lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) && \
+ dfs_redirect(name, conn, False)) \
+ return NT_STATUS_PATH_NOT_COVERED;; }
+
#define RESOLVE_DFSPATH_WCARD(name, conn, inbuf, outbuf) \
{ if ((SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES) && \
lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) && \
diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c
index 7a71fc67e5..e0478fa762 100644
--- a/source3/smbd/blocking.c
+++ b/source3/smbd/blocking.c
@@ -560,6 +560,23 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum ));
}
/****************************************************************************
+ Is this mid a blocking lock request on the queue ?
+*****************************************************************************/
+
+BOOL blocking_lock_was_deferred(int mid)
+{
+ blocking_lock_record *blr, *next = NULL;
+
+ for(blr = blocking_lock_queue; blr; blr = next) {
+ next = blr->next;
+ if(SVAL(blr->inbuf,smb_mid) == mid) {
+ return True;
+ }
+ }
+ return False;
+}
+
+/****************************************************************************
Set a flag as an unlock request affects one of our pending locks.
*****************************************************************************/
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 063eca17e0..98ea6c111a 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -3745,13 +3745,9 @@ NTSTATUS hardlink_internals(connection_struct *conn, pstring oldname, pstring ne
Deal with SMB_INFO_SET_EA.
****************************************************************************/
-static int smb_info_set_ea(connection_struct *conn,
- char *outbuf,
- int bufsize,
- char *params,
+static NTSTATUS smb_info_set_ea(connection_struct *conn,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp,
const char *fname)
{
@@ -3766,53 +3762,40 @@ static int smb_info_set_ea(connection_struct *conn,
if ((total_data == 4) && (IVAL(pdata,0) == 4)) {
/* We're done. We only get EA info in this call. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (IVAL(pdata,0) > total_data) {
DEBUG(10,("smb_info_set_ea: bad total data size (%u) > %u\n",
IVAL(pdata,0), (unsigned int)total_data));
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
ctx = talloc_init("SMB_INFO_SET_EA");
if (!ctx) {
- return ERROR_NT(NT_STATUS_NO_MEMORY);
+ return NT_STATUS_NO_MEMORY;
}
ea_list = read_ea_list(ctx, pdata + 4, total_data - 4);
if (!ea_list) {
talloc_destroy(ctx);
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
status = set_ea(conn, fsp, fname, ea_list);
talloc_destroy(ctx);
- if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
- }
-
- /* We're done. We only get EA info in this call. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return status;
}
/****************************************************************************
Deal with SMB_SET_FILE_DISPOSITION_INFO.
****************************************************************************/
-static int smb_set_file_disposition_info(connection_struct *conn,
- char *outbuf,
- int bufsize,
- char *params,
+static NTSTATUS smb_set_file_disposition_info(connection_struct *conn,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp,
int dosmode)
{
@@ -3820,11 +3803,11 @@ static int smb_set_file_disposition_info(connection_struct *conn,
BOOL delete_on_close;
if (total_data < 1) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (fsp == NULL) {
- return(UNIXERROR(ERRDOS,ERRbadfid));
+ return NT_STATUS_INVALID_HANDLE;
}
delete_on_close = (CVAL(pdata,0) ? True : False);
@@ -3832,43 +3815,34 @@ static int smb_set_file_disposition_info(connection_struct *conn,
status = can_set_delete_on_close(fsp, delete_on_close, dosmode);
if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
+ return status;
}
/* The set is across all open files on this dev/inode pair. */
if (!set_delete_on_close(fsp, delete_on_close, &current_user.ut)) {
- return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+ return NT_STATUS_ACCESS_DENIED;
}
-
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
/****************************************************************************
Deal with SMB_FILE_POSITION_INFORMATION.
****************************************************************************/
-static int smb_file_position_information(connection_struct *conn,
- char *outbuf,
- int bufsize,
- char *params,
+static NTSTATUS smb_file_position_information(connection_struct *conn,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp)
{
SMB_BIG_UINT position_information;
if (total_data < 8) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
- if (!fsp) {
+ if (fsp == NULL) {
/* Ignore on pathname based set. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
position_information = (SMB_BIG_UINT)IVAL(pdata,0);
@@ -3884,53 +3858,37 @@ static int smb_file_position_information(connection_struct *conn,
DEBUG(10,("smb_file_position_information: Set file position information for file %s to %.0f\n",
fsp->fsp_name, (double)position_information ));
fsp->fh->position_information = position_information;
-
- /* We're done. We only set position info in this call. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
/****************************************************************************
Deal with SMB_FILE_MODE_INFORMATION.
****************************************************************************/
-static int smb_file_mode_information(connection_struct *conn,
- char *outbuf,
- int bufsize,
- char *params,
+static NTSTATUS smb_file_mode_information(connection_struct *conn,
const char *pdata,
- int total_data,
- unsigned int max_data_bytes)
+ int total_data)
{
uint32 mode;
if (total_data < 4) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
mode = IVAL(pdata,0);
if (mode != 0 && mode != 2 && mode != 4 && mode != 6) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
-
- /* We're done. We only set (?) mode info in this call. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
/****************************************************************************
Deal with SMB_SET_FILE_UNIX_LINK (create a UNIX symlink).
****************************************************************************/
-static int smb_set_file_unix_link(connection_struct *conn,
+static NTSTATUS smb_set_file_unix_link(connection_struct *conn,
char *inbuf,
- char *outbuf,
- int bufsize,
- char *params,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
const char *fname)
{
pstring link_target;
@@ -3941,11 +3899,11 @@ static int smb_set_file_unix_link(connection_struct *conn,
/* Don't allow this if follow links is false. */
if (total_data == 0) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (!lp_symlinks(SNUM(conn))) {
- return(ERROR_DOS(ERRDOS,ERRnoaccess));
+ return NT_STATUS_ACCESS_DENIED;
}
srvstr_pull(inbuf, link_target, pdata, sizeof(link_target), total_data, STR_TERMINATE);
@@ -3959,7 +3917,7 @@ static int smb_set_file_unix_link(connection_struct *conn,
unix_format(link_target);
if (*link_target == '/') {
/* No absolute paths allowed. */
- return(UNIXERROR(ERRDOS,ERRnoaccess));
+ return NT_STATUS_ACCESS_DENIED;
}
pstrcpy(rel_name, newname);
last_dirp = strrchr_m(rel_name, '/');
@@ -3972,7 +3930,7 @@ static int smb_set_file_unix_link(connection_struct *conn,
status = check_name(conn, rel_name);
if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
+ return status;
}
}
@@ -3980,26 +3938,20 @@ static int smb_set_file_unix_link(connection_struct *conn,
newname, link_target ));
if (SMB_VFS_SYMLINK(conn,link_target,newname) != 0) {
- return(UNIXERROR(ERRDOS,ERRnoaccess));
+ return map_nt_error_from_unix(errno);
}
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
/****************************************************************************
Deal with SMB_SET_FILE_UNIX_HLINK (create a UNIX hard link).
****************************************************************************/
-static int smb_set_file_unix_hlink(connection_struct *conn,
+static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn,
char *inbuf,
- char *outbuf,
- int bufsize,
- char *params,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
pstring fname)
{
pstring oldname;
@@ -4007,39 +3959,29 @@ static int smb_set_file_unix_hlink(connection_struct *conn,
/* Set a hard link. */
if (total_data == 0) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
srvstr_get_path(inbuf, oldname, pdata, sizeof(oldname), total_data, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
+ return status;
}
DEBUG(10,("smb_set_file_unix_hlink: SMB_SET_FILE_UNIX_LINK doing hard link %s -> %s\n",
fname, oldname));
- status = hardlink_internals(conn, oldname, fname);
- if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
- }
-
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return hardlink_internals(conn, oldname, fname);
}
/****************************************************************************
Deal with SMB_FILE_RENAME_INFORMATION.
****************************************************************************/
-static int smb_file_rename_information(connection_struct *conn,
+static NTSTATUS smb_file_rename_information(connection_struct *conn,
char *inbuf,
char *outbuf,
- int bufsize,
- char *params,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp,
pstring fname)
{
@@ -4052,7 +3994,7 @@ static int smb_file_rename_information(connection_struct *conn,
char *p;
if (total_data < 13) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
overwrite = (CVAL(pdata,0) ? True : False);
@@ -4060,20 +4002,20 @@ static int smb_file_rename_information(connection_struct *conn,
len = IVAL(pdata,8);
if (len > (total_data - 12) || (len == 0)) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
srvstr_get_path(inbuf, newname, &pdata[12], sizeof(newname), len, 0, &status);
if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
+ return status;
}
/* Check the new name has no '/' characters. */
if (strchr_m(newname, '/')) {
- return ERROR_NT(NT_STATUS_NOT_SUPPORTED);
+ return NT_STATUS_NOT_SUPPORTED;
}
- RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
+ RESOLVE_DFSPATH_STATUS(newname, conn, inbuf, outbuf);
/* Create the base directory. */
pstrcpy(base_name, fname);
@@ -4095,17 +4037,7 @@ static int smb_file_rename_information(connection_struct *conn,
status = rename_internals(conn, fname, base_name, 0, overwrite, False);
}
- if (!NT_STATUS_IS_OK(status)) {
- if (open_was_deferred(SVAL(inbuf,smb_mid))) {
- /* We have re-scheduled this call. */
- return -1;
- }
- return ERROR_NT(status);
- }
-
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return status;
}
/****************************************************************************
@@ -4113,14 +4045,11 @@ static int smb_file_rename_information(connection_struct *conn,
****************************************************************************/
#if defined(HAVE_POSIX_ACLS)
-static int smb_set_posix_acl(connection_struct *conn,
- char *outbuf,
- int bufsize,
- char *params,
+static NTSTATUS smb_set_posix_acl(connection_struct *conn,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp,
+ SMB_STRUCT_STAT *psbuf,
const char *fname)
{
uint16 posix_acl_version;
@@ -4130,7 +4059,7 @@ static int smb_set_posix_acl(connection_struct *conn,
BOOL valid_def_acls = True;
if (total_data < SMB_POSIX_ACL_HEADER_SIZE) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
posix_acl_version = SVAL(pdata,0);
num_file_acls = SVAL(pdata,2);
@@ -4147,28 +4076,25 @@ static int smb_set_posix_acl(connection_struct *conn,
}
if (posix_acl_version != SMB_POSIX_ACL_VERSION) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (total_data < SMB_POSIX_ACL_HEADER_SIZE +
(num_file_acls+num_def_acls)*SMB_POSIX_ACL_ENTRY_SIZE) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (valid_file_acls && !set_unix_posix_acl(conn, fsp, fname, num_file_acls,
pdata + SMB_POSIX_ACL_HEADER_SIZE)) {
- return(UNIXERROR(ERRDOS,ERRnoaccess));
+ return map_nt_error_from_unix(errno);
}
- if (valid_def_acls && !set_unix_posix_default_acl(conn, fname, &sbuf, num_def_acls,
+ if (valid_def_acls && !set_unix_posix_default_acl(conn, fname, psbuf, num_def_acls,
pdata + SMB_POSIX_ACL_HEADER_SIZE +
(num_file_acls*SMB_POSIX_ACL_ENTRY_SIZE))) {
- return(UNIXERROR(ERRDOS,ERRnoaccess));
+ return map_nt_error_from_unix(errno);
}
-
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return NT_STATUS_OK;
}
#endif
@@ -4176,15 +4102,11 @@ static int smb_set_posix_acl(connection_struct *conn,
Deal with SMB_SET_POSIX_LOCK.
****************************************************************************/
-static int smb_set_posix_lock(connection_struct *conn,
+static NTSTATUS smb_set_posix_lock(connection_struct *conn,
char *inbuf,
- char *outbuf,
int length,
- int bufsize,
- char *params,
const char *pdata,
int total_data,
- unsigned int max_data_bytes,
files_struct *fsp)
{
SMB_BIG_UINT count;
@@ -4195,11 +4117,11 @@ static int smb_set_posix_lock(connection_struct *conn,
NTSTATUS status = NT_STATUS_OK;
if (fsp == NULL || fsp->fh->fd == -1) {
- return ERROR_NT(NT_STATUS_INVALID_HANDLE);
+ return NT_STATUS_INVALID_HANDLE;
}
if (total_data != POSIX_LOCK_DATA_SIZE) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
switch (SVAL(pdata, POSIX_LOCK_TYPE_OFFSET)) {
@@ -4209,7 +4131,7 @@ static int smb_set_posix_lock(connection_struct *conn,
case POSIX_LOCK_TYPE_WRITE:
/* Return the right POSIX-mappable error code for files opened read-only. */
if (!fsp->can_write) {
- return ERROR_NT(NT_STATUS_INVALID_HANDLE);
+ return NT_STATUS_INVALID_HANDLE;
}
lock_type = WRITE_LOCK;
break;
@@ -4217,7 +4139,7 @@ static int smb_set_posix_lock(connection_struct *conn,
lock_type = UNLOCK_LOCK;
break;
default:
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (SVAL(pdata,POSIX_LOCK_FLAGS_OFFSET) == POSIX_LOCK_FLAG_NOWAIT) {
@@ -4225,7 +4147,7 @@ static int smb_set_posix_lock(connection_struct *conn,
} else if (SVAL(pdata,POSIX_LOCK_FLAGS_OFFSET) == POSIX_LOCK_FLAG_WAIT) {
blocking_lock = True;
} else {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ return NT_STATUS_INVALID_PARAMETER;
}
if (!lp_blocking_locks(SNUM(conn))) {
@@ -4276,19 +4198,13 @@ static int smb_set_posix_lock(connection_struct *conn,
offset,
count)) {
TALLOC_FREE(br_lck);
- return -1;
+ return status;
}
}
TALLOC_FREE(br_lck);
}
- if (!NT_STATUS_IS_OK(status)) {
- return ERROR_NT(status);
- }
-
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
- return -1;
+ return status;
}
/****************************************************************************
@@ -4432,6 +4348,35 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
}
/****************************************************************************
+ Deal with SMB_SET_FILE_END_OF_FILE_INFO.
+****************************************************************************/
+
+static NTSTATUS smb_set_file_end_of_file_info(connection_struct *conn,
+ const char *pdata,
+ int total_data,
+ const char *fname,
+ SMB_OFF_T *p_size)
+{
+ if (total_data < 8) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
+ *p_size = IVAL(pdata,0);
+#ifdef LARGE_SMB_OFF_T
+ *p_size |= (((SMB_OFF_T)IVAL(pdata,4)) << 32);
+#else /* LARGE_SMB_OFF_T */
+ if (IVAL(pdata,4) != 0) {
+ /* more than 32 bits? */
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+#endif /* LARGE_SMB_OFF_T */
+ DEBUG(10,("smb_set_file_end_of_file_info: Set end of file info for "
+ "file %s to %.0f\n", fname, (double)*p_size ));
+ return NT_STATUS_OK;
+}
+
+
+/****************************************************************************
Reply to a TRANS2_SETFILEINFO (set file info by fileid or pathname).
****************************************************************************/
@@ -4455,8 +4400,9 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
mode_t unixmode = 0;
NTSTATUS status = NT_STATUS_OK;
- if (!params)
+ if (!params) {
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ }
ZERO_STRUCT(sbuf);
ZERO_STRUCT(tvs);
@@ -4547,8 +4493,9 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
return ERROR_NT(NT_STATUS_INVALID_LEVEL);
}
- if (VALID_STAT(sbuf))
+ if (VALID_STAT(sbuf)) {
unixmode = sbuf.st_mode;
+ }
DEBUG(3,("call_trans2setfilepathinfo(%d) %s (fnum %d) info_level=%d totdata=%d\n",
tran_call,fname, fsp ? fsp->fnum : -1, info_level,total_data));
@@ -4580,7 +4527,9 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_INFO_STANDARD:
{
- status = smb_set_info_standard(pdata, total_data, &tvs);
+ status = smb_set_info_standard(pdata,
+ total_data,
+ &tvs);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
@@ -4589,21 +4538,24 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_INFO_SET_EA:
{
- return smb_info_set_ea(conn,
- outbuf,
- bufsize,
- params,
- *ppdata,
+ status = smb_info_set_ea(conn,
+ pdata,
total_data,
- max_data_bytes,
fsp,
fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
case SMB_SET_FILE_BASIC_INFO:
case SMB_FILE_BASIC_INFORMATION:
{
- status = smb_set_file_basic_info(pdata, total_data, &tvs, &dosmode);
+ status = smb_set_file_basic_info(pdata,
+ total_data,
+ &tvs,
+ &dosmode);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
@@ -4633,20 +4585,14 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_FILE_END_OF_FILE_INFORMATION:
case SMB_SET_FILE_END_OF_FILE_INFO:
{
- if (total_data < 8) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
- }
-
- size = IVAL(pdata,0);
-#ifdef LARGE_SMB_OFF_T
- size |= (((SMB_OFF_T)IVAL(pdata,4)) << 32);
-#else /* LARGE_SMB_OFF_T */
- if (IVAL(pdata,4) != 0) {
- /* more than 32 bits? */
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ status = smb_set_file_end_of_file_info(conn,
+ pdata,
+ total_data,
+ fname,
+ &size);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
}
-#endif /* LARGE_SMB_OFF_T */
- DEBUG(10,("call_trans2setfilepathinfo: Set end of file info for file %s to %.0f\n", fname, (double)size ));
break;
}
@@ -4662,27 +4608,27 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
return ERROR_NT(NT_STATUS_INVALID_LEVEL);
}
#endif
- return smb_set_file_disposition_info(conn,
- outbuf,
- bufsize,
- params,
- *ppdata,
+ status = smb_set_file_disposition_info(conn,
+ pdata,
total_data,
- max_data_bytes,
fsp,
dosmode);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
case SMB_FILE_POSITION_INFORMATION:
{
- return smb_file_position_information(conn,
- outbuf,
- bufsize,
- params,
- *ppdata,
+ status = smb_file_position_information(conn,
+ pdata,
total_data,
- max_data_bytes,
fsp);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
/* From tridge Samba4 :
@@ -4693,13 +4639,13 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_FILE_MODE_INFORMATION:
{
- return smb_file_mode_information(conn,
- outbuf,
- bufsize,
- params,
- *ppdata,
- total_data,
- max_data_bytes);
+ status = smb_file_mode_information(conn,
+ pdata,
+ total_data);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
/*
@@ -4882,15 +4828,15 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
/* We must have a pathname for this. */
return ERROR_NT(NT_STATUS_INVALID_LEVEL);
}
- return smb_set_file_unix_link(conn,
+ status = smb_set_file_unix_link(conn,
inbuf,
- outbuf,
- bufsize,
- params,
- *ppdata,
+ pdata,
total_data,
- max_data_bytes,
fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
case SMB_SET_FILE_UNIX_HLINK:
@@ -4899,58 +4845,71 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
/* We must have a pathname for this. */
return ERROR_NT(NT_STATUS_INVALID_LEVEL);
}
- return smb_set_file_unix_hlink(conn,
+ status = smb_set_file_unix_hlink(conn,
inbuf,
- outbuf,
- bufsize,
- params,
- *ppdata,
+ pdata,
total_data,
- max_data_bytes,
fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
case SMB_FILE_RENAME_INFORMATION:
{
- return smb_file_rename_information(conn,
+ status = smb_file_rename_information(conn,
inbuf,
outbuf,
- bufsize,
- params,
pdata,
total_data,
- max_data_bytes,
fsp,
fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ if (open_was_deferred(SVAL(inbuf,smb_mid))) {
+ /* We have re-scheduled this call. */
+ return -1;
+ }
+ if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
+ return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+ }
+ return ERROR_NT(status);
+ }
+ goto out;
}
#if defined(HAVE_POSIX_ACLS)
case SMB_SET_POSIX_ACL:
{
- return smb_set_posix_acl(conn,
- outbuf,
- bufsize,
- params,
+ status = smb_set_posix_acl(conn,
pdata,
total_data,
- max_data_bytes,
fsp,
+ &sbuf,
fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ERROR_NT(status);
+ }
+ goto out;
}
#endif
case SMB_SET_POSIX_LOCK:
{
- return smb_set_posix_lock(conn,
+ status = smb_set_posix_lock(conn,
inbuf,
- outbuf,
length,
- bufsize,
- params,
pdata,
total_data,
- max_data_bytes,
fsp);
+ if (!NT_STATUS_IS_OK(status)) {
+ if (blocking_lock_was_deferred(SVAL(inbuf,smb_mid))) {
+ /* We have re-scheduled this call. */
+ return -1;
+ }
+ return ERROR_NT(status);
+ }
+ goto out;
}
default:
@@ -4971,10 +4930,11 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
DEBUG(6,("size: %.0f ", (double)size));
if (dosmode) {
- if (S_ISDIR(sbuf.st_mode))
+ if (S_ISDIR(sbuf.st_mode)) {
dosmode |= aDIR;
- else
+ } else {
dosmode &= ~aDIR;
+ }
}
DEBUG(6,("dosmode: %x\n" , dosmode));
@@ -5074,6 +5034,8 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
}
}
+ out:
+
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0, max_data_bytes);