mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
Fixup error code returns from Samba4 tester. Ensure invalid paths are
validated the same way. Jeremy.
This commit is contained in:
parent
8646f1014f
commit
6ad2f0ba27
@ -1490,7 +1490,7 @@ const struct unix_error_map unix_dos_nt_errmap[] = {
|
|||||||
{ EPERM, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
|
{ EPERM, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
|
||||||
{ EACCES, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
|
{ EACCES, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
|
||||||
{ ENOENT, ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND },
|
{ ENOENT, ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND },
|
||||||
{ ENOTDIR, ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND },
|
{ ENOTDIR, ERRDOS, ERRbadpath, NT_STATUS_NOT_A_DIRECTORY },
|
||||||
{ EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
|
{ EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
|
||||||
{ EBADF, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
|
{ EBADF, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
|
||||||
{ EINVAL, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
|
{ EINVAL, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
|
||||||
|
@ -522,8 +522,11 @@ static int do_ntcreate_pipe_open(connection_struct *conn,
|
|||||||
int ret;
|
int ret;
|
||||||
int pnum = -1;
|
int pnum = -1;
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status))
|
||||||
|
return ERROR_NT(status);
|
||||||
|
|
||||||
if ((ret = nt_open_pipe(fname, conn, inbuf, outbuf, &pnum)) != 0)
|
if ((ret = nt_open_pipe(fname, conn, inbuf, outbuf, &pnum)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -587,6 +590,7 @@ int reply_ntcreate_and_X(connection_struct *conn,
|
|||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
time_t c_time;
|
time_t c_time;
|
||||||
BOOL extended_oplock_granted = False;
|
BOOL extended_oplock_granted = False;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(SMBntcreateX);
|
START_PROFILE(SMBntcreateX);
|
||||||
|
|
||||||
@ -641,7 +645,11 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
|
|||||||
|
|
||||||
if(!dir_fsp->is_directory) {
|
if(!dir_fsp->is_directory) {
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBntcreateX);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this is a mac fork of some kind.
|
* Check to see if this is a mac fork of some kind.
|
||||||
@ -681,9 +689,17 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
|
|||||||
dir_name_len++;
|
dir_name_len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, &fname[dir_name_len], smb_buf(inbuf), sizeof(fname)-dir_name_len, STR_TERMINATE);
|
srvstr_get_path(inbuf, &fname[dir_name_len], smb_buf(inbuf), sizeof(fname)-dir_name_len, STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBntcreateX);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBntcreateX);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this is a mac fork of some kind.
|
* Check to see if this is a mac fork of some kind.
|
||||||
@ -971,6 +987,7 @@ static int do_nt_transact_create_pipe( connection_struct *conn, char *inbuf, cha
|
|||||||
int ret;
|
int ret;
|
||||||
int pnum = -1;
|
int pnum = -1;
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ensure minimum number of parameters sent.
|
* Ensure minimum number of parameters sent.
|
||||||
@ -982,6 +999,10 @@ static int do_nt_transact_create_pipe( connection_struct *conn, char *inbuf, cha
|
|||||||
}
|
}
|
||||||
|
|
||||||
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
||||||
|
status = check_path_syntax(fname);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
if ((ret = nt_open_pipe(fname, conn, inbuf, outbuf, &pnum)) != 0)
|
if ((ret = nt_open_pipe(fname, conn, inbuf, outbuf, &pnum)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -1158,7 +1179,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
|
|||||||
smb_attr = (file_attributes & SAMBA_ATTRIBUTES_MASK);
|
smb_attr = (file_attributes & SAMBA_ATTRIBUTES_MASK);
|
||||||
|
|
||||||
if (create_options & FILE_OPEN_BY_FILE_ID) {
|
if (create_options & FILE_OPEN_BY_FILE_ID) {
|
||||||
END_PROFILE(SMBntcreateX);
|
|
||||||
return ERROR_NT(NT_STATUS_NOT_SUPPORTED);
|
return ERROR_NT(NT_STATUS_NOT_SUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1188,6 +1208,10 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
|
|||||||
if(!dir_fsp->is_directory) {
|
if(!dir_fsp->is_directory) {
|
||||||
|
|
||||||
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
||||||
|
nt_status = check_path_syntax(fname);
|
||||||
|
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||||
|
return ERROR_NT(nt_status);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this is a mac fork of some kind.
|
* Check to see if this is a mac fork of some kind.
|
||||||
@ -1217,8 +1241,16 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
|
|||||||
|
|
||||||
srvstr_pull(inbuf, &fname[dir_name_len], params+53, sizeof(fname)-dir_name_len,
|
srvstr_pull(inbuf, &fname[dir_name_len], params+53, sizeof(fname)-dir_name_len,
|
||||||
parameter_count-53, STR_TERMINATE);
|
parameter_count-53, STR_TERMINATE);
|
||||||
|
nt_status = check_path_syntax(fname);
|
||||||
|
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||||
|
return ERROR_NT(nt_status);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
srvstr_pull(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE);
|
||||||
|
nt_status = check_path_syntax(fname);
|
||||||
|
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||||
|
return ERROR_NT(nt_status);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this is a mac fork of some kind.
|
* Check to see if this is a mac fork of some kind.
|
||||||
@ -1260,7 +1292,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
|
|||||||
|
|
||||||
/* Can't open a temp directory. IFS kit test. */
|
/* Can't open a temp directory. IFS kit test. */
|
||||||
if (file_attributes & FILE_ATTRIBUTE_TEMPORARY) {
|
if (file_attributes & FILE_ATTRIBUTE_TEMPORARY) {
|
||||||
END_PROFILE(SMBntcreateX);
|
|
||||||
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
|
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1361,7 +1392,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
|
|||||||
fsp->initial_allocation_size = SMB_ROUNDUP(allocation_size,SMB_ROUNDUP_ALLOCATION_SIZE);
|
fsp->initial_allocation_size = SMB_ROUNDUP(allocation_size,SMB_ROUNDUP_ALLOCATION_SIZE);
|
||||||
if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
|
if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
|
||||||
close_file(fsp,False);
|
close_file(fsp,False);
|
||||||
END_PROFILE(SMBntcreateX);
|
|
||||||
return ERROR_NT(NT_STATUS_DISK_FULL);
|
return ERROR_NT(NT_STATUS_DISK_FULL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1517,6 +1547,10 @@ static int call_nt_transact_rename(connection_struct *conn, char *inbuf, char *o
|
|||||||
replace_if_exists = (SVAL(params,2) & RENAME_REPLACE_IF_EXISTS) ? True : False;
|
replace_if_exists = (SVAL(params,2) & RENAME_REPLACE_IF_EXISTS) ? True : False;
|
||||||
CHECK_FSP(fsp, conn);
|
CHECK_FSP(fsp, conn);
|
||||||
srvstr_pull(inbuf, new_name, params+4, sizeof(new_name), -1, STR_TERMINATE);
|
srvstr_pull(inbuf, new_name, params+4, sizeof(new_name), -1, STR_TERMINATE);
|
||||||
|
status = check_path_syntax(new_name);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
status = rename_internals(conn, fsp->fsp_name,
|
status = rename_internals(conn, fsp->fsp_name,
|
||||||
new_name, replace_if_exists);
|
new_name, replace_if_exists);
|
||||||
|
@ -39,20 +39,32 @@ unsigned int smb_echo_count = 0;
|
|||||||
extern BOOL global_encrypted_passwords_negotiated;
|
extern BOOL global_encrypted_passwords_negotiated;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Ensure we check the path in the same way as W2K.
|
Ensure we check the path in *exactly* the same way as W2K.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static NTSTATUS check_path_syntax(const char *name)
|
NTSTATUS check_path_syntax(const char *name)
|
||||||
{
|
{
|
||||||
while (*name == '\\')
|
while (*name == '\\' || *name == '/')
|
||||||
name++;
|
name++;
|
||||||
if (strequal(name, "."))
|
if (name[0] == '.' && name[1] == '\0')
|
||||||
return NT_STATUS_OBJECT_NAME_INVALID;
|
return NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
else if (strequal(name, ".."))
|
else if (name[0] == '.' && name[1] == '.' &&
|
||||||
|
(name[2] == '\\' || name [2] == '/' || name[2] == '\0'))
|
||||||
return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
|
return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
Pull a string and check the path - provide for error return.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
size_t srvstr_get_path(char *inbuf, char *dest, const char *src, size_t dest_len, int flags, NTSTATUS *err)
|
||||||
|
{
|
||||||
|
size_t ret = srvstr_pull_buf( inbuf, dest, src, dest_len, flags);
|
||||||
|
*err = check_path_syntax(dest);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Reply to a special message.
|
Reply to a special message.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -402,11 +414,11 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
|
|
||||||
START_PROFILE(SMBchkpth);
|
START_PROFILE(SMBchkpth);
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, name, smb_buf(inbuf) + 1, sizeof(name), STR_TERMINATE);
|
srvstr_get_path(inbuf, name, smb_buf(inbuf) + 1, sizeof(name), STR_TERMINATE, &status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
status = check_path_syntax(name);
|
END_PROFILE(SMBchkpth);
|
||||||
if (!NT_STATUS_IS_OK(status))
|
|
||||||
return ERROR_NT(status);
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -416,9 +428,11 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
|
|
||||||
if (check_name(name,conn)) {
|
if (check_name(name,conn)) {
|
||||||
if (VALID_STAT(sbuf) || SMB_VFS_STAT(conn,name,&sbuf) == 0)
|
if (VALID_STAT(sbuf) || SMB_VFS_STAT(conn,name,&sbuf) == 0)
|
||||||
if (!(ok = S_ISDIR(sbuf.st_mode)))
|
if (!(ok = S_ISDIR(sbuf.st_mode))) {
|
||||||
|
END_PROFILE(SMBchkpth);
|
||||||
return ERROR_BOTH(NT_STATUS_NOT_A_DIRECTORY,ERRDOS,ERRbadpath);
|
return ERROR_BOTH(NT_STATUS_NOT_A_DIRECTORY,ERRDOS,ERRbadpath);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
/* We special case this - as when a Windows machine
|
/* We special case this - as when a Windows machine
|
||||||
@ -435,13 +449,18 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
* if the path is invalid.
|
* if the path is invalid.
|
||||||
*/
|
*/
|
||||||
if (bad_path) {
|
if (bad_path) {
|
||||||
|
END_PROFILE(SMBchkpth);
|
||||||
return ERROR_NT(NT_STATUS_OBJECT_PATH_NOT_FOUND);
|
return ERROR_NT(NT_STATUS_OBJECT_PATH_NOT_FOUND);
|
||||||
} else {
|
} else {
|
||||||
|
END_PROFILE(SMBchkpth);
|
||||||
return ERROR_NT(NT_STATUS_OBJECT_NAME_NOT_FOUND);
|
return ERROR_NT(NT_STATUS_OBJECT_NAME_NOT_FOUND);
|
||||||
}
|
}
|
||||||
} else if (errno == ENOTDIR)
|
} else if (errno == ENOTDIR) {
|
||||||
|
END_PROFILE(SMBchkpth);
|
||||||
return ERROR_NT(NT_STATUS_NOT_A_DIRECTORY);
|
return ERROR_NT(NT_STATUS_NOT_A_DIRECTORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
END_PROFILE(SMBchkpth);
|
||||||
return(UNIXERROR(ERRDOS,ERRbadpath));
|
return(UNIXERROR(ERRDOS,ERRbadpath));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,10 +487,16 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
time_t mtime=0;
|
time_t mtime=0;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
char *p;
|
char *p;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(SMBgetatr);
|
START_PROFILE(SMBgetatr);
|
||||||
|
|
||||||
p = smb_buf(inbuf) + 1;
|
p = smb_buf(inbuf) + 1;
|
||||||
p += srvstr_pull_buf(inbuf, fname, p, sizeof(fname), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, fname, p, sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBgetatr);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -537,11 +562,17 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
SMB_STRUCT_STAT sbuf;
|
SMB_STRUCT_STAT sbuf;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
char *p;
|
char *p;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(SMBsetatr);
|
START_PROFILE(SMBsetatr);
|
||||||
|
|
||||||
p = smb_buf(inbuf) + 1;
|
p = smb_buf(inbuf) + 1;
|
||||||
p += srvstr_pull_buf(inbuf, fname, p, sizeof(fname), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, fname, p, sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBsetatr);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
unix_convert(fname,conn,0,&bad_path,&sbuf);
|
unix_convert(fname,conn,0,&bad_path,&sbuf);
|
||||||
|
|
||||||
mode = SVAL(inbuf,smb_vwv0);
|
mode = SVAL(inbuf,smb_vwv0);
|
||||||
@ -652,6 +683,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
BOOL expect_close = False;
|
BOOL expect_close = False;
|
||||||
BOOL can_open = True;
|
BOOL can_open = True;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
|
NTSTATUS nt_status;
|
||||||
START_PROFILE(SMBsearch);
|
START_PROFILE(SMBsearch);
|
||||||
|
|
||||||
*mask = *directory = *fname = 0;
|
*mask = *directory = *fname = 0;
|
||||||
@ -664,7 +696,11 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
maxentries = SVAL(inbuf,smb_vwv0);
|
maxentries = SVAL(inbuf,smb_vwv0);
|
||||||
dirtype = SVAL(inbuf,smb_vwv1);
|
dirtype = SVAL(inbuf,smb_vwv1);
|
||||||
p = smb_buf(inbuf) + 1;
|
p = smb_buf(inbuf) + 1;
|
||||||
p += srvstr_pull_buf(inbuf, path, p, sizeof(path), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, path, p, sizeof(path), STR_TERMINATE,&nt_status);
|
||||||
|
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||||
|
END_PROFILE(SMBsearch);
|
||||||
|
return ERROR_NT(nt_status);
|
||||||
|
}
|
||||||
p++;
|
p++;
|
||||||
status_len = SVAL(p, 0);
|
status_len = SVAL(p, 0);
|
||||||
p += 2;
|
p += 2;
|
||||||
@ -829,12 +865,17 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
char status[21];
|
char status[21];
|
||||||
int dptr_num= -2;
|
int dptr_num= -2;
|
||||||
char *p;
|
char *p;
|
||||||
|
NTSTATUS err;
|
||||||
|
|
||||||
START_PROFILE(SMBfclose);
|
START_PROFILE(SMBfclose);
|
||||||
|
|
||||||
outsize = set_message(outbuf,1,0,True);
|
outsize = set_message(outbuf,1,0,True);
|
||||||
p = smb_buf(inbuf) + 1;
|
p = smb_buf(inbuf) + 1;
|
||||||
p += srvstr_pull_buf(inbuf, path, p, sizeof(path), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, path, p, sizeof(path), STR_TERMINATE,&err);
|
||||||
|
if (!NT_STATUS_IS_OK(err)) {
|
||||||
|
END_PROFILE(SMBfclose);
|
||||||
|
return ERROR_NT(err);
|
||||||
|
}
|
||||||
p++;
|
p++;
|
||||||
status_len = SVAL(p,0);
|
status_len = SVAL(p,0);
|
||||||
p += 2;
|
p += 2;
|
||||||
@ -877,11 +918,16 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
files_struct *fsp;
|
files_struct *fsp;
|
||||||
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
||||||
|
NTSTATUS status;
|
||||||
START_PROFILE(SMBopen);
|
START_PROFILE(SMBopen);
|
||||||
|
|
||||||
share_mode = SVAL(inbuf,smb_vwv0);
|
share_mode = SVAL(inbuf,smb_vwv0);
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf)+1, sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf)+1, sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBopen);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -954,6 +1000,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
|
|||||||
int smb_action = 0;
|
int smb_action = 0;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
files_struct *fsp;
|
files_struct *fsp;
|
||||||
|
NTSTATUS status;
|
||||||
START_PROFILE(SMBopenX);
|
START_PROFILE(SMBopenX);
|
||||||
|
|
||||||
/* If it's an IPC, pass off the pipe handler. */
|
/* If it's an IPC, pass off the pipe handler. */
|
||||||
@ -968,7 +1015,11 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* XXXX we need to handle passed times, sattr and flags */
|
/* XXXX we need to handle passed times, sattr and flags */
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBopenX);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -1074,12 +1125,17 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
files_struct *fsp;
|
files_struct *fsp;
|
||||||
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
||||||
SMB_STRUCT_STAT sbuf;
|
SMB_STRUCT_STAT sbuf;
|
||||||
|
NTSTATUS status;
|
||||||
START_PROFILE(SMBcreate);
|
START_PROFILE(SMBcreate);
|
||||||
|
|
||||||
com = SVAL(inbuf,smb_com);
|
com = SVAL(inbuf,smb_com);
|
||||||
|
|
||||||
createmode = SVAL(inbuf,smb_vwv0);
|
createmode = SVAL(inbuf,smb_vwv0);
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf) + 1, sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf) + 1, sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBcreate);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -1139,11 +1195,16 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
int tmpfd;
|
int tmpfd;
|
||||||
SMB_STRUCT_STAT sbuf;
|
SMB_STRUCT_STAT sbuf;
|
||||||
char *p, *s;
|
char *p, *s;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(SMBctemp);
|
START_PROFILE(SMBctemp);
|
||||||
|
|
||||||
createmode = SVAL(inbuf,smb_vwv0);
|
createmode = SVAL(inbuf,smb_vwv0);
|
||||||
srvstr_pull_buf(inbuf, fname, smb_buf(inbuf)+1, sizeof(fname), STR_TERMINATE);
|
srvstr_get_path(inbuf, fname, smb_buf(inbuf)+1, sizeof(fname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBctemp);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
pstrcat(fname,"\\TMXXXXXX");
|
pstrcat(fname,"\\TMXXXXXX");
|
||||||
|
|
||||||
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(fname, conn, inbuf, outbuf);
|
||||||
@ -1235,6 +1296,7 @@ static NTSTATUS can_rename(char *fname,connection_struct *conn, SMB_STRUCT_STAT
|
|||||||
ret = NT_STATUS_SHARING_VIOLATION;
|
ret = NT_STATUS_SHARING_VIOLATION;
|
||||||
unix_ERR_class = 0;
|
unix_ERR_class = 0;
|
||||||
unix_ERR_code = 0;
|
unix_ERR_code = 0;
|
||||||
|
unix_ERR_ntstatus = NT_STATUS_OK;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
close_file(fsp,False);
|
close_file(fsp,False);
|
||||||
@ -1423,11 +1485,11 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
|
|
||||||
dirtype = SVAL(inbuf,smb_vwv0);
|
dirtype = SVAL(inbuf,smb_vwv0);
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, name, smb_buf(inbuf) + 1, sizeof(name), STR_TERMINATE);
|
srvstr_get_path(inbuf, name, smb_buf(inbuf) + 1, sizeof(name), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
status = check_path_syntax(name);
|
END_PROFILE(SMBunlink);
|
||||||
if (!NT_STATUS_IS_OK(status))
|
|
||||||
return ERROR_NT(status);
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
||||||
|
|
||||||
@ -2921,13 +2983,19 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
START_PROFILE(SMBmkdir);
|
START_PROFILE(SMBmkdir);
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, directory, smb_buf(inbuf) + 1, sizeof(directory), STR_TERMINATE);
|
srvstr_get_path(inbuf, directory, smb_buf(inbuf) + 1, sizeof(directory), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBmkdir);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(directory, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(directory, conn, inbuf, outbuf);
|
||||||
|
|
||||||
status = mkdir_internal(conn, directory);
|
status = mkdir_internal(conn, directory);
|
||||||
if (!NT_STATUS_IS_OK(status))
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBmkdir);
|
||||||
return ERROR_NT(status);
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
outsize = set_message(outbuf,0,0,True);
|
outsize = set_message(outbuf,0,0,True);
|
||||||
|
|
||||||
@ -3082,9 +3150,14 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
BOOL ok = False;
|
BOOL ok = False;
|
||||||
BOOL bad_path = False;
|
BOOL bad_path = False;
|
||||||
SMB_STRUCT_STAT sbuf;
|
SMB_STRUCT_STAT sbuf;
|
||||||
|
NTSTATUS status;
|
||||||
START_PROFILE(SMBrmdir);
|
START_PROFILE(SMBrmdir);
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, directory, smb_buf(inbuf) + 1, sizeof(directory), STR_TERMINATE);
|
srvstr_get_path(inbuf, directory, smb_buf(inbuf) + 1, sizeof(directory), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBrmdir);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(directory, conn, inbuf, outbuf)
|
RESOLVE_DFSPATH(directory, conn, inbuf, outbuf)
|
||||||
|
|
||||||
@ -3579,9 +3652,17 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
START_PROFILE(SMBmv);
|
START_PROFILE(SMBmv);
|
||||||
|
|
||||||
p = smb_buf(inbuf) + 1;
|
p = smb_buf(inbuf) + 1;
|
||||||
p += srvstr_pull_buf(inbuf, name, p, sizeof(name), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, name, p, sizeof(name), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBmv);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
p++;
|
p++;
|
||||||
p += srvstr_pull_buf(inbuf, newname, p, sizeof(newname), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, newname, p, sizeof(newname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBmv);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
|
||||||
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
|
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
|
||||||
@ -3590,6 +3671,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
|
|
||||||
status = rename_internals(conn, name, newname, False);
|
status = rename_internals(conn, name, newname, False);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBmv);
|
||||||
return ERROR_NT(status);
|
return ERROR_NT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3707,14 +3789,23 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
|||||||
BOOL bad_path2 = False;
|
BOOL bad_path2 = False;
|
||||||
BOOL rc = True;
|
BOOL rc = True;
|
||||||
SMB_STRUCT_STAT sbuf1, sbuf2;
|
SMB_STRUCT_STAT sbuf1, sbuf2;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(SMBcopy);
|
START_PROFILE(SMBcopy);
|
||||||
|
|
||||||
*directory = *mask = 0;
|
*directory = *mask = 0;
|
||||||
|
|
||||||
p = smb_buf(inbuf);
|
p = smb_buf(inbuf);
|
||||||
p += srvstr_pull_buf(inbuf, name, p, sizeof(name), STR_TERMINATE);
|
p += srvstr_get_path(inbuf, name, p, sizeof(name), STR_TERMINATE,&status);
|
||||||
p += srvstr_pull_buf(inbuf, newname, p, sizeof(newname), STR_TERMINATE);
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBcopy);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
p += srvstr_get_path(inbuf, newname, p, sizeof(newname), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(SMBcopy);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG(3,("reply_copy : %s -> %s\n",name,newname));
|
DEBUG(3,("reply_copy : %s -> %s\n",name,newname));
|
||||||
|
|
||||||
@ -3860,6 +3951,7 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
int outsize = 0;
|
int outsize = 0;
|
||||||
BOOL ok = False;
|
BOOL ok = False;
|
||||||
pstring newdir;
|
pstring newdir;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
START_PROFILE(pathworks_setdir);
|
START_PROFILE(pathworks_setdir);
|
||||||
|
|
||||||
@ -3869,7 +3961,11 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
|
|||||||
return ERROR_DOS(ERRDOS,ERRnoaccess);
|
return ERROR_DOS(ERRDOS,ERRnoaccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
srvstr_pull_buf(inbuf, newdir, smb_buf(inbuf) + 1, sizeof(newdir), STR_TERMINATE);
|
srvstr_get_path(inbuf, newdir, smb_buf(inbuf) + 1, sizeof(newdir), STR_TERMINATE,&status);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
END_PROFILE(pathworks_setdir);
|
||||||
|
return ERROR_NT(status);
|
||||||
|
}
|
||||||
|
|
||||||
if (strlen(newdir) == 0) {
|
if (strlen(newdir) == 0) {
|
||||||
ok = True;
|
ok = True;
|
||||||
|
Loading…
Reference in New Issue
Block a user