2006-03-17 19:11:02 +03:00
/*
Unix SMB / CIFS implementation .
SMB torture tester
Copyright ( C ) Andrew Tridgell 1997 - 2003
Copyright ( C ) Jelmer Vernooij 2006
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2006-03-17 19:11:02 +03:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2006-03-17 19:11:02 +03:00
*/
# include "includes.h"
2008-04-27 17:02:46 +04:00
# include "torture/smbtorture.h"
2006-03-17 19:11:02 +03:00
# include "torture/basic/proto.h"
# include "libcli/libcli.h"
2008-04-02 06:53:27 +04:00
# include "libcli/raw/raw_proto.h"
2006-03-17 20:59:58 +03:00
# include "torture/util.h"
2006-03-17 19:11:02 +03:00
# include "system/filesys.h"
# include "system/time.h"
# include "libcli/resolve/resolve.h"
# include "lib/events/events.h"
2007-09-08 16:42:09 +04:00
# include "param/param.h"
2006-03-17 19:11:02 +03:00
# define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0)
2006-10-16 17:06:41 +04:00
static struct smbcli_state * open_nbt_connection ( struct torture_context * tctx )
2006-03-17 19:11:02 +03:00
{
struct nbt_name called , calling ;
struct smbcli_state * cli ;
2006-10-16 17:06:41 +04:00
const char * host = torture_setting_string ( tctx , " host " , NULL ) ;
2008-01-04 02:22:12 +03:00
struct smbcli_options options ;
2006-03-17 19:11:02 +03:00
2010-07-16 08:32:42 +04:00
make_nbt_name_client ( & calling , lpcfg_netbios_name ( tctx - > lp_ctx ) ) ;
2006-03-17 19:11:02 +03:00
nbt_choose_called_name ( NULL , & called , host , NBT_NAME_SERVER ) ;
cli = smbcli_state_init ( NULL ) ;
if ( ! cli ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed initialize smbcli_struct to connect with %s \n " , host ) ;
2006-03-17 19:11:02 +03:00
goto failed ;
}
2010-07-16 08:32:42 +04:00
lpcfg_smbcli_options ( tctx - > lp_ctx , & options ) ;
2008-01-04 02:22:12 +03:00
2010-07-16 08:32:42 +04:00
if ( ! smbcli_socket_connect ( cli , host , lpcfg_smb_ports ( tctx - > lp_ctx ) , tctx - > ev ,
lpcfg_resolve_context ( tctx - > lp_ctx ) , & options ,
lpcfg_socket_options ( tctx - > lp_ctx ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to connect with %s \n " , host ) ;
2006-03-17 19:11:02 +03:00
goto failed ;
}
if ( ! smbcli_transport_establish ( cli , & calling , & called ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " %s rejected the session \n " , host ) ;
2006-03-17 19:11:02 +03:00
goto failed ;
}
return cli ;
failed :
talloc_free ( cli ) ;
return NULL ;
}
2007-10-07 02:28:14 +04:00
static bool tcon_devtest ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli ,
const char * myshare , const char * devtype ,
NTSTATUS expected_error )
2006-03-17 19:11:02 +03:00
{
2007-10-07 02:28:14 +04:00
bool status ;
2006-10-16 17:06:41 +04:00
const char * password = torture_setting_string ( tctx , " password " , NULL ) ;
2006-03-17 19:11:02 +03:00
status = NT_STATUS_IS_OK ( smbcli_tconX ( cli , myshare , devtype ,
password ) ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Trying share %s with devtype %s \n " , myshare , devtype ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_OK ( expected_error ) ) {
2006-10-16 17:06:41 +04:00
if ( ! status ) {
torture_fail ( tctx , talloc_asprintf ( tctx ,
" tconX to share %s with type %s "
" should have succeeded but failed " ,
myshare , devtype ) ) ;
2006-03-17 19:11:02 +03:00
}
smbcli_tdis ( cli ) ;
} else {
if ( status ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" tconx to share %s with type %s "
2007-01-16 04:36:15 +03:00
" should have failed but succeeded " ,
2006-10-16 17:06:41 +04:00
myshare , devtype ) ) ;
2006-03-17 19:11:02 +03:00
} else {
if ( NT_STATUS_EQUAL ( smbcli_nt_error ( cli - > tree ) ,
expected_error ) ) {
} else {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , " Returned unexpected error " ) ;
2006-03-17 19:11:02 +03:00
}
}
}
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
/**
test whether fnums and tids open on one VC are available on another ( a major
security hole )
*/
2006-10-16 17:06:41 +04:00
static bool run_fdpasstest ( struct torture_context * tctx ,
struct smbcli_state * cli1 ,
struct smbcli_state * cli2 )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ fdpass.tst " ;
int fnum1 , oldtid ;
uint8_t buf [ 1024 ] ;
smbcli_unlink ( cli1 - > tree , fname ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Opening a file on connection 1 \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDWR | O_CREAT | O_EXCL , DENY_NONE ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum1 ! = - 1 ,
talloc_asprintf ( tctx ,
" open of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " writing to file on connection 1 \n " ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_assert ( tctx ,
smbcli_write ( cli1 - > tree , fnum1 , 0 , " hello world \n " , 0 , 13 ) = = 13 ,
talloc_asprintf ( tctx ,
" write failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
oldtid = cli2 - > tree - > tid ;
cli2 - > session - > vuid = cli1 - > session - > vuid ;
cli2 - > tree - > tid = cli1 - > tree - > tid ;
cli2 - > session - > pid = cli1 - > session - > pid ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " reading from file on connection 2 \n " ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , smbcli_read ( cli2 - > tree , fnum1 , buf , 0 , 13 ) ! = 13 ,
talloc_asprintf ( tctx ,
" read succeeded! nasty security hole [%s] \n " , buf ) ) ;
2006-03-17 19:11:02 +03:00
smbcli_close ( cli1 - > tree , fnum1 ) ;
smbcli_unlink ( cli1 - > tree , fname ) ;
cli2 - > tree - > tid = oldtid ;
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
/**
This checks how the getatr calls works
*/
2007-10-07 02:28:14 +04:00
static bool run_attrtest ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli )
2006-03-17 19:11:02 +03:00
{
int fnum ;
time_t t , t2 ;
const char * fname = " \\ attrib123456789.tst " ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli - > tree , fname ) ;
fnum = smbcli_open ( cli - > tree , fname ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
smbcli_close ( cli - > tree , fnum ) ;
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli - > tree , fname , NULL , NULL , & t ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " getatr failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " New file time is %s " , ctime ( & t ) ) ;
2006-03-17 19:11:02 +03:00
if ( abs ( t - time ( NULL ) ) > 60 * 60 * 24 * 10 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: SMBgetatr bug. time is %s " ,
2006-03-17 19:11:02 +03:00
ctime ( & t ) ) ;
t = time ( NULL ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
t2 = t - 60 * 60 * 24 ; /* 1 day ago */
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Setting file time to %s " , ctime ( & t2 ) ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_setatr ( cli - > tree , fname , 0 , t2 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " setatr failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = true ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli - > tree , fname , NULL , NULL , & t ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " getatr failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = true ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Retrieved file time as %s " , ctime ( & t ) ) ;
2006-03-17 19:11:02 +03:00
if ( t ! = t2 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: getatr/setatr bug. times are \n %s " ,
2006-03-17 19:11:02 +03:00
ctime ( & t ) ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " %s " , ctime ( & t2 ) ) ;
2007-10-07 02:28:14 +04:00
correct = true ;
2006-03-17 19:11:02 +03:00
}
smbcli_unlink ( cli - > tree , fname ) ;
return correct ;
}
/**
This checks a couple of trans2 calls
*/
2007-10-07 02:28:14 +04:00
static bool run_trans2test ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli )
2006-03-17 19:11:02 +03:00
{
int fnum ;
size_t size ;
time_t c_time , a_time , m_time , w_time , m_time2 ;
const char * fname = " \\ trans2.tst " ;
const char * dname = " \\ trans2 " ;
const char * fname2 = " \\ trans2 \\ trans2.tst " ;
const char * pname ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli - > tree , fname ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Testing qfileinfo \n " ) ;
2006-03-17 19:11:02 +03:00
fnum = smbcli_open ( cli - > tree , fname ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qfileinfo ( cli - > tree , fnum , NULL , & size , & c_time , & a_time , & m_time ,
NULL , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qfileinfo failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Testing NAME_INFO \n " ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_qfilename ( cli - > tree , fnum , & pname ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qfilename failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
if ( ! pname | | strcmp ( pname , fname ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " qfilename gave different name? [%s] [%s] \n " ,
2006-03-17 19:11:02 +03:00
fname , pname ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
smbcli_close ( cli - > tree , fnum ) ;
smbcli_unlink ( cli - > tree , fname ) ;
fnum = smbcli_open ( cli - > tree , fname ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
if ( fnum = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open of %s failed (%s) \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
smbcli_close ( cli - > tree , fnum ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Checking for sticky create times \n " ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo ( cli - > tree , fname , & c_time , & a_time , & m_time , & size , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qpathinfo failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
} else {
if ( c_time ! = m_time ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " create time=%s " , ctime ( & c_time ) ) ;
torture_comment ( tctx , " modify time=%s " , ctime ( & m_time ) ) ;
torture_comment ( tctx , " This system appears to have sticky create times \n " ) ;
2006-03-17 19:11:02 +03:00
}
if ( a_time % ( 60 * 60 ) = = 0 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " access time=%s " , ctime ( & a_time ) ) ;
torture_comment ( tctx , " This system appears to set a midnight access time \n " ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
if ( abs ( m_time - time ( NULL ) ) > 60 * 60 * 24 * 7 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: totally incorrect times - maybe word reversed? mtime=%s " , ctime ( & m_time ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
}
smbcli_unlink ( cli - > tree , fname ) ;
fnum = smbcli_open ( cli - > tree , fname ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
smbcli_close ( cli - > tree , fnum ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , fname , & c_time , & a_time , & m_time , & w_time , & size , NULL , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
} else {
if ( w_time < 60 * 60 * 24 * 2 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " write time=%s " , ctime ( & w_time ) ) ;
torture_comment ( tctx , " This system appears to set a initial 0 write time \n " ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
}
smbcli_unlink ( cli - > tree , fname ) ;
/* check if the server updates the directory modification time
when creating a new file */
if ( NT_STATUS_IS_ERR ( smbcli_mkdir ( cli - > tree , dname ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: mkdir failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
sleep ( 3 ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , " \\ trans2 \\ " , & c_time , & a_time , & m_time , & w_time , & size , NULL , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
fnum = smbcli_open ( cli - > tree , fname2 ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
smbcli_write ( cli - > tree , fnum , 0 , & fnum , 0 , sizeof ( fnum ) ) ;
smbcli_close ( cli - > tree , fnum ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , " \\ trans2 \\ " , & c_time , & a_time , & m_time2 , & w_time , & size , NULL , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
} else {
if ( m_time2 = = m_time ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " This system does not update directory modification times \n " ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
}
smbcli_unlink ( cli - > tree , fname2 ) ;
smbcli_rmdir ( cli - > tree , dname ) ;
return correct ;
}
/* send smb negprot commands, not reading the response */
2007-10-07 02:28:14 +04:00
static bool run_negprot_nowait ( struct torture_context * tctx )
2006-03-17 19:11:02 +03:00
{
int i ;
struct smbcli_state * cli , * cli2 ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " starting negprot nowait test \n " ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
cli = open_nbt_connection ( tctx ) ;
2006-03-17 19:11:02 +03:00
if ( ! cli ) {
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Filling send buffer \n " ) ;
2006-03-17 19:11:02 +03:00
for ( i = 0 ; i < 100 ; i + + ) {
struct smbcli_request * req ;
2010-07-16 08:32:42 +04:00
req = smb_raw_negotiate_send ( cli - > transport , lpcfg_unicode ( tctx - > lp_ctx ) , PROTOCOL_NT1 ) ;
2006-03-17 19:11:02 +03:00
event_loop_once ( cli - > transport - > socket - > event . ctx ) ;
if ( req - > state = = SMBCLI_REQUEST_ERROR ) {
if ( i > 0 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to fill pipe packet[%d] - %s (ignored) \n " , i + 1 , nt_errstr ( req - > status ) ) ;
2006-03-17 19:11:02 +03:00
break ;
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to fill pipe - %s \n " , nt_errstr ( req - > status ) ) ;
2006-03-17 19:11:02 +03:00
torture_close_connection ( cli ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
}
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Opening secondary connection \n " ) ;
2007-12-03 17:53:07 +03:00
if ( ! torture_open_connection ( & cli2 , tctx , 1 ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to open secondary connection \n " ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
if ( ! torture_close_connection ( cli2 ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to close secondary connection \n " ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
torture_close_connection ( cli ) ;
return correct ;
}
/**
this checks to see if a secondary tconx can use open files from an
earlier tconx
*/
2007-10-07 02:28:14 +04:00
static bool run_tcon_test ( struct torture_context * tctx , struct smbcli_state * cli )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ tcontest.tmp " ;
int fnum1 ;
uint16_t cnum1 , cnum2 , cnum3 ;
uint16_t vuid1 , vuid2 ;
uint8_t buf [ 4 ] ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2006-03-17 19:11:02 +03:00
struct smbcli_tree * tree1 ;
2006-10-16 17:06:41 +04:00
const char * host = torture_setting_string ( tctx , " host " , NULL ) ;
const char * share = torture_setting_string ( tctx , " share " , NULL ) ;
const char * password = torture_setting_string ( tctx , " password " , NULL ) ;
2006-03-17 19:11:02 +03:00
if ( smbcli_deltree ( cli - > tree , fname ) = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " unlink of %s failed (%s) \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
fnum1 = smbcli_open ( cli - > tree , fname , O_RDWR | O_CREAT | O_EXCL , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open of %s failed (%s) \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
cnum1 = cli - > tree - > tid ;
vuid1 = cli - > session - > vuid ;
2007-10-10 05:54:07 +04:00
memset ( buf , 0 , 4 ) ; /* init buf so valgrind won't complain */
2006-03-17 19:11:02 +03:00
if ( smbcli_write ( cli - > tree , fnum1 , 0 , buf , 130 , 4 ) ! = 4 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " initial write failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
tree1 = cli - > tree ; /* save old tree connection */
if ( NT_STATUS_IS_ERR ( smbcli_tconX ( cli , share , " ????? " , password ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " %s refused 2nd tree connect (%s) \n " , host ,
2006-03-17 19:11:02 +03:00
smbcli_errstr ( cli - > tree ) ) ;
talloc_free ( cli ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
cnum2 = cli - > tree - > tid ;
cnum3 = MAX ( cnum1 , cnum2 ) + 1 ; /* any invalid number */
vuid2 = cli - > session - > vuid + 1 ;
/* try a write with the wrong tid */
cli - > tree - > tid = cnum2 ;
if ( smbcli_write ( cli - > tree , fnum1 , 0 , buf , 130 , 4 ) = = 4 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * server allows write with wrong TID \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " server fails write with wrong TID : %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
/* try a write with an invalid tid */
cli - > tree - > tid = cnum3 ;
if ( smbcli_write ( cli - > tree , fnum1 , 0 , buf , 130 , 4 ) = = 4 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * server allows write with invalid TID \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " server fails write with invalid TID : %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
/* try a write with an invalid vuid */
cli - > session - > vuid = vuid2 ;
cli - > tree - > tid = cnum1 ;
if ( smbcli_write ( cli - > tree , fnum1 , 0 , buf , 130 , 4 ) = = 4 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * server allows write with invalid VUID \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " server fails write with invalid VUID : %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
cli - > session - > vuid = vuid1 ;
cli - > tree - > tid = cnum1 ;
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " close failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
cli - > tree - > tid = cnum2 ;
if ( NT_STATUS_IS_ERR ( smbcli_tdis ( cli ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " secondary tdis failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
cli - > tree = tree1 ; /* restore initial tree */
cli - > tree - > tid = cnum1 ;
smbcli_unlink ( tree1 , fname ) ;
return ret ;
}
/**
checks for correct tconX support
*/
2007-10-07 02:28:14 +04:00
static bool run_tcon_devtype_test ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli1 )
2006-03-17 19:11:02 +03:00
{
2006-10-16 17:06:41 +04:00
const char * share = torture_setting_string ( tctx , " share " , NULL ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , " IPC$ " , " A: " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , " IPC$ " , " ????? " , NT_STATUS_OK ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , " IPC$ " , " LPT: " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , " IPC$ " , " IPC " , NT_STATUS_OK ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , " IPC$ " , " FOOBA " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , share , " A: " , NT_STATUS_OK ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , share , " ????? " , NT_STATUS_OK ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , share , " LPT: " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , share , " IPC " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! tcon_devtest ( tctx , cli1 , share , " FOOBA " , NT_STATUS_BAD_DEVICE_TYPE ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
2007-10-07 02:28:14 +04:00
static bool rw_torture2 ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * c1 , struct smbcli_state * c2 )
2006-03-17 19:11:02 +03:00
{
const char * lockfname = " \\ torture2.lck " ;
int fnum1 ;
int fnum2 ;
int i ;
uint8_t buf [ 131072 ] ;
uint8_t buf_rd [ 131072 ] ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2006-03-17 19:11:02 +03:00
ssize_t bytes_read , bytes_written ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , smbcli_deltree ( c1 - > tree , lockfname ) ! = - 1 ,
talloc_asprintf ( tctx ,
" unlink failed (%s) " , smbcli_errstr ( c1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_open ( c1 - > tree , lockfname , O_RDWR | O_CREAT | O_EXCL ,
DENY_NONE ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum1 ! = - 1 ,
talloc_asprintf ( tctx ,
" first open read/write of %s failed (%s) " ,
lockfname , smbcli_errstr ( c1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
fnum2 = smbcli_open ( c2 - > tree , lockfname , O_RDONLY ,
DENY_NONE ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum2 ! = - 1 ,
talloc_asprintf ( tctx ,
" second open read-only of %s failed (%s) " ,
lockfname , smbcli_errstr ( c2 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Checking data integrity over %d ops \n " ,
torture_numops ) ;
2006-03-17 19:11:02 +03:00
for ( i = 0 ; i < torture_numops ; i + + )
{
2010-01-05 20:42:54 +03:00
size_t buf_size = ( ( unsigned int ) random ( ) % ( sizeof ( buf ) - 1 ) ) + 1 ;
2006-03-17 19:11:02 +03:00
if ( i % 10 = = 0 ) {
2007-04-30 01:37:29 +04:00
if ( torture_setting_bool ( tctx , " progress " , true ) ) {
torture_comment ( tctx , " %d \r " , i ) ; fflush ( stdout ) ;
}
2006-03-17 19:11:02 +03:00
}
generate_random_buffer ( buf , buf_size ) ;
if ( ( bytes_written = smbcli_write ( c1 - > tree , fnum1 , 0 , buf , 0 , buf_size ) ) ! = buf_size ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " write failed (%s) \n " , smbcli_errstr ( c1 - > tree ) ) ;
torture_comment ( tctx , " wrote %d, expected %d \n " , ( int ) bytes_written , ( int ) buf_size ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
break ;
}
if ( ( bytes_read = smbcli_read ( c2 - > tree , fnum2 , buf_rd , 0 , buf_size ) ) ! = buf_size ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " read failed (%s) \n " , smbcli_errstr ( c2 - > tree ) ) ;
torture_comment ( tctx , " read %d, expected %d \n " , ( int ) bytes_read , ( int ) buf_size ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
break ;
}
2008-04-14 00:00:36 +04:00
torture_assert_mem_equal ( tctx , buf_rd , buf , buf_size ,
2006-10-16 17:06:41 +04:00
" read/write compare failed \n " ) ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , smbcli_close ( c2 - > tree , fnum2 ) ,
talloc_asprintf ( tctx , " close failed (%s) " , smbcli_errstr ( c2 - > tree ) ) ) ;
torture_assert_ntstatus_ok ( tctx , smbcli_close ( c1 - > tree , fnum1 ) ,
talloc_asprintf ( tctx , " close failed (%s) " , smbcli_errstr ( c1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , smbcli_unlink ( c1 - > tree , lockfname ) ,
talloc_asprintf ( tctx , " unlink failed (%s) " , smbcli_errstr ( c1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
2007-08-26 23:58:40 +04:00
torture_comment ( tctx , " \n " ) ;
2006-03-17 19:11:02 +03:00
return correct ;
}
2006-10-16 17:06:41 +04:00
static bool run_readwritetest ( struct torture_context * tctx ,
struct smbcli_state * cli1 ,
struct smbcli_state * cli2 )
2006-03-17 19:11:02 +03:00
{
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Running readwritetest v1 \n " ) ;
if ( ! rw_torture2 ( tctx , cli1 , cli2 ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Running readwritetest v2 \n " ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
if ( ! rw_torture2 ( tctx , cli1 , cli1 ) )
return false ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
/*
test the timing of deferred open requests
*/
2007-10-07 02:28:14 +04:00
static bool run_deferopen ( struct torture_context * tctx , struct smbcli_state * cli , int dummy )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ defer_open_test.dat " ;
int retries = 4 ;
int i = 0 ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2008-02-24 02:13:36 +03:00
int nsec ;
int msec ;
double sec ;
nsec = torture_setting_int ( tctx , " sharedelay " , 1000000 ) ;
msec = nsec / 1000 ;
sec = ( ( double ) nsec ) / ( ( double ) 1000000 ) ;
2006-03-17 19:11:02 +03:00
if ( retries < = 0 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " failed to connect \n " ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Testing deferred open requests. \n " ) ;
2006-03-17 19:11:02 +03:00
while ( i < 4 ) {
int fnum = - 1 ;
do {
struct timeval tv ;
tv = timeval_current ( ) ;
fnum = smbcli_nt_create_full ( cli - > tree , fname , 0 ,
SEC_RIGHTS_FILE_ALL ,
FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE ,
NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum ! = - 1 ) {
break ;
}
if ( NT_STATUS_EQUAL ( smbcli_nt_error ( cli - > tree ) , NT_STATUS_SHARING_VIOLATION ) ) {
double e = timeval_elapsed ( & tv ) ;
2008-02-26 12:31:37 +03:00
if ( e < ( 0.5 * sec ) | | e > ( ( 1.5 * sec ) + 1 ) ) {
2008-02-24 02:13:36 +03:00
torture_comment ( tctx , " Timing incorrect %.2f violation 1 sec == %.2f \n " ,
e , sec ) ;
return false ;
2006-03-17 19:11:02 +03:00
}
}
} while ( NT_STATUS_EQUAL ( smbcli_nt_error ( cli - > tree ) , NT_STATUS_SHARING_VIOLATION ) ) ;
if ( fnum = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to open %s, error=%s \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " pid %u open %d \n " , ( unsigned ) getpid ( ) , i ) ;
2006-03-17 19:11:02 +03:00
2010-09-16 23:36:37 +04:00
smb_msleep ( 10 * msec ) ;
2006-03-17 19:11:02 +03:00
i + + ;
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli - > tree , fnum ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Failed to close %s, error=%s \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2010-09-16 23:36:37 +04:00
smb_msleep ( 2 * msec ) ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_unlink ( cli - > tree , fname ) ) ) {
2009-08-10 12:12:51 +04:00
/* All until the last unlink will fail with sharing violation
but also the last request can fail since the file could have
been successfully deleted by another ( test ) process */
NTSTATUS status = smbcli_nt_error ( cli - > tree ) ;
if ( ( ! NT_STATUS_EQUAL ( status , NT_STATUS_SHARING_VIOLATION ) )
& & ( ! NT_STATUS_EQUAL ( status , NT_STATUS_OBJECT_NAME_NOT_FOUND ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " unlink of %s failed (%s) \n " , fname , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " deferred test finished \n " ) ;
2006-03-17 19:11:02 +03:00
return correct ;
}
/**
Try with a wrong vuid and check error message .
*/
2007-10-07 02:28:14 +04:00
static bool run_vuidtest ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ vuid.tst " ;
int fnum ;
size_t size ;
time_t c_time , a_time , m_time ;
uint16_t orig_vuid ;
NTSTATUS result ;
smbcli_unlink ( cli - > tree , fname ) ;
fnum = smbcli_open ( cli - > tree , fname ,
O_RDWR | O_CREAT | O_TRUNC , DENY_NONE ) ;
orig_vuid = cli - > session - > vuid ;
cli - > session - > vuid + = 1234 ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Testing qfileinfo with wrong vuid \n " ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_OK ( result = smbcli_qfileinfo ( cli - > tree , fnum , NULL ,
& size , & c_time , & a_time ,
& m_time , NULL , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , " qfileinfo passed with wrong vuid " ) ;
2006-03-17 19:11:02 +03:00
}
if ( ! NT_STATUS_EQUAL ( cli - > transport - > error . e . nt_status ,
NT_STATUS_DOS ( ERRSRV , ERRbaduid ) ) & &
! NT_STATUS_EQUAL ( cli - > transport - > error . e . nt_status ,
NT_STATUS_INVALID_HANDLE ) ) {
2006-10-16 17:06:41 +04:00
torture_fail ( tctx , talloc_asprintf ( tctx ,
" qfileinfo should have returned DOS error "
2007-01-16 04:36:15 +03:00
" ERRSRV:ERRbaduid \n but returned %s " ,
2006-10-16 17:06:41 +04:00
smbcli_errstr ( cli - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
}
cli - > session - > vuid - = 1234 ;
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , smbcli_close ( cli - > tree , fnum ) ,
talloc_asprintf ( tctx , " close failed (%s) " , smbcli_errstr ( cli - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli - > tree , fname ) ;
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
/*
Test open mode returns on read - only files .
*/
2007-10-07 02:28:14 +04:00
static bool run_opentest ( struct torture_context * tctx , struct smbcli_state * cli1 ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli2 )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ readonly.file " ;
char * control_char_fname ;
int fnum1 , fnum2 ;
uint8_t buf [ 20 ] ;
size_t fsize ;
2007-10-07 02:28:14 +04:00
bool correct = true ;
2006-03-17 19:11:02 +03:00
char * tmp_path ;
int failures = 0 ;
int i ;
asprintf ( & control_char_fname , " \\ readonly.afile " ) ;
for ( i = 1 ; i < = 0x1f ; i + + ) {
control_char_fname [ 10 ] = i ;
fnum1 = smbcli_nt_create_full ( cli1 - > tree , control_char_fname , 0 , SEC_FILE_WRITE_DATA , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( ! check_error ( __location__ , cli1 , ERRDOS , ERRinvalidname ,
NT_STATUS_OBJECT_NAME_INVALID ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Error code should be NT_STATUS_OBJECT_NAME_INVALID, was %s for file with %d char \n " ,
2006-03-17 19:11:02 +03:00
smbcli_errstr ( cli1 - > tree ) , i ) ;
failures + + ;
}
if ( fnum1 ! = - 1 ) {
smbcli_close ( cli1 - > tree , fnum1 ) ;
}
smbcli_setatr ( cli1 - > tree , control_char_fname , 0 , 0 ) ;
smbcli_unlink ( cli1 - > tree , control_char_fname ) ;
}
free ( control_char_fname ) ;
if ( ! failures )
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Create file with control char names passed. \n " ) ;
2006-03-17 19:11:02 +03:00
smbcli_setatr ( cli1 - > tree , fname , 0 , 0 ) ;
smbcli_unlink ( cli1 - > tree , fname ) ;
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDWR | O_CREAT | O_EXCL , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " close2 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_setatr ( cli1 - > tree , fname , FILE_ATTRIBUTE_READONLY , 0 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " smbcli_setatr failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test1 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDONLY , DENY_WRITE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test1 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
fnum2 = smbcli_open ( cli1 - > tree , fname , O_RDWR , DENY_ALL ) ;
if ( check_error ( __location__ , cli1 , ERRDOS , ERRnoaccess ,
NT_STATUS_ACCESS_DENIED ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " correct error code ERRDOS/ERRnoaccess returned \n " ) ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " finished open test 1 \n " ) ;
2006-03-17 19:11:02 +03:00
error_test1 :
smbcli_close ( cli1 - > tree , fnum1 ) ;
/* Now try not readonly and ensure ERRbadshare is returned. */
smbcli_setatr ( cli1 - > tree , fname , 0 , 0 ) ;
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDONLY , DENY_WRITE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* This will fail - but the error should be ERRshare. */
fnum2 = smbcli_open ( cli1 - > tree , fname , O_RDWR , DENY_ALL ) ;
if ( check_error ( __location__ , cli1 , ERRDOS , ERRbadshare ,
NT_STATUS_SHARING_VIOLATION ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " correct error code ERRDOS/ERRbadshare returned \n " ) ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " close2 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
smbcli_unlink ( cli1 - > tree , fname ) ;
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " finished open test 2 \n " ) ;
2006-03-17 19:11:02 +03:00
/* Test truncate open disposition on file opened for read. */
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDWR | O_CREAT | O_EXCL , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) open (1) of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* write 20 bytes. */
memset ( buf , ' \0 ' , 20 ) ;
if ( smbcli_write ( cli1 - > tree , fnum1 , 0 , buf , 0 , 20 ) ! = 20 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " write failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) close1 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* Ensure size == 20. */
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli1 - > tree , fname , NULL , & fsize , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) getatr failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test3 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( fsize ! = 20 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) file size != 20 \n " ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test3 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* Now test if we can truncate a file opened for readonly. */
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDONLY | O_TRUNC , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) open (2) of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test3 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " close2 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* Ensure size == 0. */
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli1 - > tree , fname , NULL , & fsize , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) getatr failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test3 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( fsize ! = 0 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (3) file size != 0 \n " ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test3 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " finished open test 3 \n " ) ;
2006-03-17 19:11:02 +03:00
error_test3 :
smbcli_unlink ( cli1 - > tree , fname ) ;
2010-04-11 03:39:06 +04:00
torture_comment ( tctx , " Testing ctemp \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_ctemp ( cli1 - > tree , " \\ " , & tmp_path ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ctemp failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test4 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " ctemp gave path %s \n " , tmp_path ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " close of temp failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_unlink ( cli1 - > tree , tmp_path ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " unlink of temp failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
}
error_test4 :
/* Test the non-io opens... */
smbcli_setatr ( cli2 - > tree , fname , 0 , 0 ) ;
smbcli_unlink ( cli2 - > tree , fname ) ;
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #1 testing 2 non-io opens (no delete) \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test10 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 open 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test10 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli2 - > tree , fnum2 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 close 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #1 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test10 :
smbcli_unlink ( cli1 - > tree , fname ) ;
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #2 testing 2 non-io opens (first with delete) \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 2 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test20 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 2 open 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test20 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli2 - > tree , fnum2 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 1 close 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #2 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test20 :
smbcli_unlink ( cli1 - > tree , fname ) ;
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #3 testing 2 non-io opens (second with delete) \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 3 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test30 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 3 open 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test30 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 3 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli2 - > tree , fnum2 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 3 close 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #3 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test30 :
smbcli_unlink ( cli1 - > tree , fname ) ;
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #4 testing 2 non-io opens (both with delete) \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 4 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test40 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 ! = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 4 open 2 of %s SUCCEEDED - should have failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test40 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 4 open 2 of %s gave %s (correct error should be %s) \n " , fname , smbcli_errstr ( cli2 - > tree ) , " sharing violation " ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 4 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #4 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test40 :
smbcli_unlink ( cli1 - > tree , fname ) ;
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #5 testing 2 non-io opens (both with delete - both with file share delete) \n " ) ;
2006-03-17 19:11:02 +03:00
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_DELETE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 5 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test50 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_DELETE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 5 open 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test50 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 5 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli2 - > tree , fnum2 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 5 close 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #5 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test50 :
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #6 testing 1 non-io open, one io open \n " ) ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli1 - > tree , fname ) ;
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_FILE_READ_DATA , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 6 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test60 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_READ , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 6 open 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test60 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 6 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli2 - > tree , fnum2 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 6 close 2 of %s failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #6 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test60 :
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #7 testing 1 non-io open, one io open with delete \n " ) ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli1 - > tree , fname ) ;
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 , SEC_FILE_READ_DATA , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_NONE , NTCREATEX_DISP_OVERWRITE_IF , 0 , 0 ) ;
if ( fnum1 = = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 7 open 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test70 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_nt_create_full ( cli2 - > tree , fname , 0 , SEC_STD_DELETE | SEC_FILE_READ_ATTRIBUTE , FILE_ATTRIBUTE_NORMAL ,
NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_DELETE , NTCREATEX_DISP_OPEN_IF , 0 , 0 ) ;
if ( fnum2 ! = - 1 ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 7 open 2 of %s SUCCEEDED - should have failed (%s) \n " , fname , smbcli_errstr ( cli2 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test70 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 7 open 2 of %s gave %s (correct error should be %s) \n " , fname , smbcli_errstr ( cli2 - > tree ) , " sharing violation " ) ;
2006-03-17 19:11:02 +03:00
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test 7 close 1 of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " non-io open test #7 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
error_test70 :
2010-04-11 18:55:48 +04:00
torture_comment ( tctx , " Test #8 testing one normal open, followed by lock, followed by open with truncate \n " ) ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli1 - > tree , fname ) ;
fnum1 = smbcli_open ( cli1 - > tree , fname , O_RDWR | O_CREAT , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) open (1) of %s failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* write 20 bytes. */
memset ( buf , ' \0 ' , 20 ) ;
if ( smbcli_write ( cli1 - > tree , fnum1 , 0 , buf , 0 , 20 ) ! = 20 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) write failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
correct = false ;
2006-03-17 19:11:02 +03:00
}
/* Ensure size == 20. */
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli1 - > tree , fname , NULL , & fsize , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) getatr (1) failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test80 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( fsize ! = 20 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) file size != 20 \n " ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test80 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* Get an exclusive lock on the open file. */
if ( NT_STATUS_IS_ERR ( smbcli_lock ( cli1 - > tree , fnum1 , 0 , 4 , 0 , WRITE_LOCK ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) lock1 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test80 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum2 = smbcli_open ( cli1 - > tree , fname , O_RDWR | O_TRUNC , DENY_NONE ) ;
if ( fnum1 = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) open (2) of %s with truncate failed (%s) \n " , fname , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
/* Ensure size == 0. */
if ( NT_STATUS_IS_ERR ( smbcli_getatr ( cli1 - > tree , fname , NULL , & fsize , NULL ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) getatr (2) failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test80 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( fsize ! = 0 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) file size != 0 \n " ) ;
2006-03-17 19:11:02 +03:00
CHECK_MAX_FAILURES ( error_test80 ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum1 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) close1 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_close ( cli1 - > tree , fnum2 ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (8) close1 failed (%s) \n " , smbcli_errstr ( cli1 - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
error_test80 :
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open test #8 passed. \n " ) ;
2006-03-17 19:11:02 +03:00
smbcli_unlink ( cli1 - > tree , fname ) ;
return correct ;
}
/* FIRST_DESIRED_ACCESS 0xf019f */
# define FIRST_DESIRED_ACCESS SEC_FILE_READ_DATA|SEC_FILE_WRITE_DATA|SEC_FILE_APPEND_DATA|\
SEC_FILE_READ_EA | /* 0xf */ \
SEC_FILE_WRITE_EA | SEC_FILE_READ_ATTRIBUTE | /* 0x90 */ \
SEC_FILE_WRITE_ATTRIBUTE | /* 0x100 */ \
SEC_STD_DELETE | SEC_STD_READ_CONTROL | \
SEC_STD_WRITE_DAC | SEC_STD_WRITE_OWNER /* 0xf0000 */
/* SECOND_DESIRED_ACCESS 0xe0080 */
# define SECOND_DESIRED_ACCESS SEC_FILE_READ_ATTRIBUTE| /* 0x80 */ \
SEC_STD_READ_CONTROL | SEC_STD_WRITE_DAC | \
SEC_STD_WRITE_OWNER /* 0xe0000 */
#if 0
# define THIRD_DESIRED_ACCESS FILE_READ_ATTRIBUTE| /* 0x80 */ \
READ_CONTROL | WRITE_DAC | \
SEC_FILE_READ_DATA | \
WRITE_OWNER /* */
# endif
/**
Test ntcreate calls made by xcopy
*/
2006-10-16 17:06:41 +04:00
static bool run_xcopy ( struct torture_context * tctx ,
struct smbcli_state * cli1 )
2006-03-17 19:11:02 +03:00
{
const char * fname = " \\ test.txt " ;
int fnum1 , fnum2 ;
fnum1 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 ,
FIRST_DESIRED_ACCESS ,
FILE_ATTRIBUTE_ARCHIVE ,
NTCREATEX_SHARE_ACCESS_NONE ,
NTCREATEX_DISP_OVERWRITE_IF ,
0x4044 , 0 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum1 ! = - 1 , talloc_asprintf ( tctx ,
" First open failed - %s " , smbcli_errstr ( cli1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
fnum2 = smbcli_nt_create_full ( cli1 - > tree , fname , 0 ,
SECOND_DESIRED_ACCESS , 0 ,
NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE | NTCREATEX_SHARE_ACCESS_DELETE , NTCREATEX_DISP_OPEN ,
0x200000 , 0 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum2 ! = - 1 , talloc_asprintf ( tctx ,
" second open failed - %s " , smbcli_errstr ( cli1 - > tree ) ) ) ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
return true ;
2006-03-17 19:11:02 +03:00
}
2006-10-16 17:06:41 +04:00
static bool run_iometer ( struct torture_context * tctx ,
struct smbcli_state * cli )
2006-04-15 00:36:36 +04:00
{
const char * fname = " \\ iobw.tst " ;
int fnum ;
size_t filesize ;
NTSTATUS status ;
char buf [ 2048 ] ;
int ops ;
memset ( buf , 0 , sizeof ( buf ) ) ;
status = smbcli_getatr ( cli - > tree , fname , NULL , & filesize , NULL ) ;
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , status ,
talloc_asprintf ( tctx , " smbcli_getatr failed: %s " , nt_errstr ( status ) ) ) ;
2006-04-15 00:36:36 +04:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " size: %d \n " , ( int ) filesize ) ;
2006-04-15 00:36:36 +04:00
filesize - = ( sizeof ( buf ) - 1 ) ;
fnum = smbcli_nt_create_full ( cli - > tree , fname , 0x16 ,
0x2019f , 0 , 0x3 , 3 , 0x42 , 0x3 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , fnum ! = - 1 , talloc_asprintf ( tctx , " open failed: %s " ,
smbcli_errstr ( cli - > tree ) ) ) ;
2006-04-15 00:36:36 +04:00
ops = 0 ;
2007-10-07 02:28:14 +04:00
while ( true ) {
2006-04-15 00:36:36 +04:00
int i , num_reads , num_writes ;
num_reads = random ( ) % 10 ;
num_writes = random ( ) % 3 ;
for ( i = 0 ; i < num_reads ; i + + ) {
ssize_t res ;
if ( ops + + > torture_numops ) {
2010-11-30 00:42:07 +03:00
break ;
2006-04-15 00:36:36 +04:00
}
res = smbcli_read ( cli - > tree , fnum , buf ,
random ( ) % filesize , sizeof ( buf ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , res = = sizeof ( buf ) ,
talloc_asprintf ( tctx , " read failed: %s " ,
smbcli_errstr ( cli - > tree ) ) ) ;
2006-04-15 00:36:36 +04:00
}
for ( i = 0 ; i < num_writes ; i + + ) {
ssize_t res ;
if ( ops + + > torture_numops ) {
2010-11-30 00:42:07 +03:00
break ;
2006-04-15 00:36:36 +04:00
}
res = smbcli_write ( cli - > tree , fnum , 0 , buf ,
random ( ) % filesize , sizeof ( buf ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , res = = sizeof ( buf ) ,
talloc_asprintf ( tctx , " read failed: %s " ,
smbcli_errstr ( cli - > tree ) ) ) ;
2006-04-15 00:36:36 +04:00
}
}
2010-11-30 00:42:07 +03:00
return true ;
2006-04-15 00:36:36 +04:00
}
2006-03-17 19:11:02 +03:00
/**
tries variants of chkpath
*/
2007-10-07 02:28:14 +04:00
static bool torture_chkpath_test ( struct torture_context * tctx ,
2006-10-16 17:06:41 +04:00
struct smbcli_state * cli )
2006-03-17 19:11:02 +03:00
{
int fnum ;
2007-10-07 02:28:14 +04:00
bool ret ;
2006-03-17 19:11:02 +03:00
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Testing valid and invalid paths \n " ) ;
2006-03-17 19:11:02 +03:00
/* cleanup from an old run */
smbcli_rmdir ( cli - > tree , " \\ chkpath.dir \\ dir2 " ) ;
smbcli_unlink ( cli - > tree , " \\ chkpath.dir \\ * " ) ;
smbcli_rmdir ( cli - > tree , " \\ chkpath.dir " ) ;
if ( NT_STATUS_IS_ERR ( smbcli_mkdir ( cli - > tree , " \\ chkpath.dir " ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " mkdir1 failed : %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_mkdir ( cli - > tree , " \\ chkpath.dir \\ dir2 " ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " mkdir2 failed : %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
fnum = smbcli_open ( cli - > tree , " \\ chkpath.dir \\ foo.txt " , O_RDWR | O_CREAT | O_EXCL , DENY_NONE ) ;
if ( fnum = = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " open1 failed (%s) \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2006-03-17 19:11:02 +03:00
}
smbcli_close ( cli - > tree , fnum ) ;
if ( NT_STATUS_IS_ERR ( smbcli_chkpath ( cli - > tree , " \\ chkpath.dir " ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " chkpath1 failed: %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_chkpath ( cli - > tree , " \\ chkpath.dir \\ dir2 " ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " chkpath2 failed: %s \n " , smbcli_errstr ( cli - > tree ) ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_chkpath ( cli - > tree , " \\ chkpath.dir \\ foo.txt " ) ) ) {
ret = check_error ( __location__ , cli , ERRDOS , ERRbadpath ,
NT_STATUS_NOT_A_DIRECTORY ) ;
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * chkpath on a file should fail \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_chkpath ( cli - > tree , " \\ chkpath.dir \\ bar.txt " ) ) ) {
ret = check_error ( __location__ , cli , ERRDOS , ERRbadpath ,
NT_STATUS_OBJECT_NAME_NOT_FOUND ) ;
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * chkpath on a non existent file should fail \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
}
if ( NT_STATUS_IS_ERR ( smbcli_chkpath ( cli - > tree , " \\ chkpath.dir \\ dirxx \\ bar.txt " ) ) ) {
ret = check_error ( __location__ , cli , ERRDOS , ERRbadpath ,
NT_STATUS_OBJECT_PATH_NOT_FOUND ) ;
} else {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " * chkpath on a non existent component should fail \n " ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2006-03-17 19:11:02 +03:00
}
smbcli_rmdir ( cli - > tree , " \\ chkpath.dir \\ dir2 " ) ;
smbcli_unlink ( cli - > tree , " \\ chkpath.dir \\ * " ) ;
smbcli_rmdir ( cli - > tree , " \\ chkpath.dir " ) ;
return ret ;
}
2006-05-19 11:47:28 +04:00
/*
* This is a test to excercise some weird Samba3 error paths .
*/
2007-10-07 02:28:14 +04:00
static bool torture_samba3_errorpaths ( struct torture_context * tctx )
2006-05-19 11:47:28 +04:00
{
2007-10-07 02:28:14 +04:00
bool nt_status_support ;
2006-05-19 11:47:28 +04:00
struct smbcli_state * cli_nt = NULL , * cli_dos = NULL ;
2007-10-07 02:28:14 +04:00
bool result = false ;
2006-05-19 11:47:28 +04:00
int fnum ;
const char * os2_fname = " .+,;=[]. " ;
2006-05-24 18:45:07 +04:00
const char * dname = " samba3_errordir " ;
2006-05-19 11:47:28 +04:00
union smb_open io ;
NTSTATUS status ;
2010-07-16 08:32:42 +04:00
nt_status_support = lpcfg_nt_status_support ( tctx - > lp_ctx ) ;
2006-05-19 11:47:28 +04:00
2010-07-16 08:32:42 +04:00
if ( ! lpcfg_set_cmdline ( tctx - > lp_ctx , " nt status support " , " yes " ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Could not set 'nt status support = yes' \n " ) ;
2006-05-19 11:47:28 +04:00
goto fail ;
}
2007-12-03 17:53:07 +03:00
if ( ! torture_open_connection ( & cli_nt , tctx , 0 ) ) {
2006-05-19 11:47:28 +04:00
goto fail ;
}
2010-07-16 08:32:42 +04:00
if ( ! lpcfg_set_cmdline ( tctx - > lp_ctx , " nt status support " , " no " ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Could not set 'nt status support = yes' \n " ) ;
2006-05-19 11:47:28 +04:00
goto fail ;
}
2007-12-03 17:53:07 +03:00
if ( ! torture_open_connection ( & cli_dos , tctx , 1 ) ) {
2006-05-19 11:47:28 +04:00
goto fail ;
}
2010-07-16 08:32:42 +04:00
if ( ! lpcfg_set_cmdline ( tctx - > lp_ctx , " nt status support " ,
2006-05-19 11:47:28 +04:00
nt_status_support ? " yes " : " no " ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Could not reset 'nt status support = yes' " ) ;
2006-05-19 11:47:28 +04:00
goto fail ;
}
smbcli_unlink ( cli_nt - > tree , os2_fname ) ;
2006-05-24 18:45:07 +04:00
smbcli_rmdir ( cli_nt - > tree , dname ) ;
2006-05-19 11:47:28 +04:00
2006-05-24 18:45:07 +04:00
if ( ! NT_STATUS_IS_OK ( smbcli_mkdir ( cli_nt - > tree , dname ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " smbcli_mkdir(%s) failed: %s \n " , dname ,
2006-05-19 11:47:28 +04:00
smbcli_errstr ( cli_nt - > tree ) ) ;
goto fail ;
}
io . generic . level = RAW_OPEN_NTCREATEX ;
io . ntcreatex . in . flags = NTCREATEX_FLAGS_EXTENDED ;
2009-10-15 11:26:19 +04:00
io . ntcreatex . in . root_fid . fnum = 0 ;
2006-05-19 11:47:28 +04:00
io . ntcreatex . in . access_mask = SEC_RIGHTS_FILE_ALL ;
io . ntcreatex . in . alloc_size = 1024 * 1024 ;
io . ntcreatex . in . file_attr = FILE_ATTRIBUTE_DIRECTORY ;
io . ntcreatex . in . share_access = NTCREATEX_SHARE_ACCESS_NONE ;
io . ntcreatex . in . open_disposition = NTCREATEX_DISP_CREATE ;
io . ntcreatex . in . create_options = 0 ;
io . ntcreatex . in . impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS ;
io . ntcreatex . in . security_flags = 0 ;
2006-05-24 18:45:07 +04:00
io . ntcreatex . in . fname = dname ;
2006-03-17 19:11:02 +03:00
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_nt - > tree , tctx , & io ) ;
2006-05-19 11:47:28 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-05-19 11:47:28 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_OBJECT_NAME_COLLISION ) ) ;
goto fail ;
}
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_dos - > tree , tctx , & io ) ;
2006-05-19 11:47:28 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_DOS ( ERRDOS , ERRfilexists ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-05-19 11:47:28 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_DOS ( ERRDOS , ERRfilexists ) ) ) ;
goto fail ;
}
2006-05-24 18:45:07 +04:00
status = smbcli_mkdir ( cli_nt - > tree , dname ) ;
2006-05-19 11:47:28 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-05-19 11:47:28 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_OBJECT_NAME_COLLISION ) ) ;
goto fail ;
}
2006-05-24 18:45:07 +04:00
status = smbcli_mkdir ( cli_dos - > tree , dname ) ;
2006-05-19 11:47:28 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_DOS ( ERRDOS , ERRnoaccess ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-05-19 11:47:28 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_DOS ( ERRDOS , ERRnoaccess ) ) ) ;
goto fail ;
}
2006-12-30 20:39:27 +03:00
{
union smb_mkdir md ;
md . t2mkdir . level = RAW_MKDIR_T2MKDIR ;
md . t2mkdir . in . path = dname ;
md . t2mkdir . in . num_eas = 0 ;
md . t2mkdir . in . eas = NULL ;
status = smb_raw_mkdir ( cli_nt - > tree , & md ) ;
if ( ! NT_STATUS_EQUAL ( status ,
NT_STATUS_OBJECT_NAME_COLLISION ) ) {
torture_comment (
tctx , " (%s) incorrect status %s should be "
" NT_STATUS_OBJECT_NAME_COLLISION \n " ,
__location__ , nt_errstr ( status ) ) ;
goto fail ;
}
status = smb_raw_mkdir ( cli_dos - > tree , & md ) ;
if ( ! NT_STATUS_EQUAL ( status ,
NT_STATUS_DOS ( ERRDOS , ERRrename ) ) ) {
torture_comment ( tctx , " (%s) incorrect status %s "
2006-12-30 20:53:28 +03:00
" should be ERRDOS:ERRrename \n " ,
2006-12-30 20:39:27 +03:00
__location__ , nt_errstr ( status ) ) ;
goto fail ;
}
}
2006-06-29 02:09:03 +04:00
io . ntcreatex . in . create_options = NTCREATEX_OPTIONS_DIRECTORY ;
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_nt - > tree , tctx , & io ) ;
2006-06-29 02:09:03 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-06-29 02:09:03 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_OBJECT_NAME_COLLISION ) ) ;
goto fail ;
}
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_dos - > tree , tctx , & io ) ;
2006-06-29 02:09:03 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_DOS ( ERRDOS , ERRfilexists ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " (%s) incorrect status %s should be %s \n " ,
2006-06-29 02:09:03 +04:00
__location__ , nt_errstr ( status ) ,
nt_errstr ( NT_STATUS_DOS ( ERRDOS , ERRfilexists ) ) ) ;
goto fail ;
}
2006-05-23 14:45:20 +04:00
{
/* Test an invalid DOS deny mode */
const char * fname = " test.txt " ;
fnum = smbcli_open ( cli_nt - > tree , fname , O_RDWR | O_CREAT , 5 ) ;
if ( fnum ! = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Open(%s) with invalid deny mode succeeded -- "
2006-05-23 14:45:20 +04:00
" expected failure \n " , fname ) ;
smbcli_close ( cli_nt - > tree , fnum ) ;
goto fail ;
}
if ( ! NT_STATUS_EQUAL ( smbcli_nt_error ( cli_nt - > tree ) ,
NT_STATUS_DOS ( ERRDOS , ERRbadaccess ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Expected DOS error ERRDOS/ERRbadaccess, "
2006-05-23 14:45:20 +04:00
" got %s \n " , smbcli_errstr ( cli_nt - > tree ) ) ;
goto fail ;
}
fnum = smbcli_open ( cli_dos - > tree , fname , O_RDWR | O_CREAT , 5 ) ;
if ( fnum ! = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Open(%s) with invalid deny mode succeeded -- "
2006-05-23 14:45:20 +04:00
" expected failure \n " , fname ) ;
smbcli_close ( cli_nt - > tree , fnum ) ;
goto fail ;
}
if ( ! NT_STATUS_EQUAL ( smbcli_nt_error ( cli_nt - > tree ) ,
NT_STATUS_DOS ( ERRDOS , ERRbadaccess ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Expected DOS error ERRDOS:ERRbadaccess, "
2006-05-23 14:45:20 +04:00
" got %s \n " , smbcli_errstr ( cli_nt - > tree ) ) ;
goto fail ;
}
}
2006-12-24 18:09:47 +03:00
{
/*
* Samba 3.0 .23 has a bug that an existing file can be opened
* as a directory using ntcreate & x . Test this .
*/
const char * fname = " \\ test_dir.txt " ;
fnum = smbcli_open ( cli_nt - > tree , fname , O_RDWR | O_CREAT ,
DENY_NONE ) ;
if ( fnum = = - 1 ) {
d_printf ( " (%s) smbcli_open failed: %s \n " , __location__ ,
smbcli_errstr ( cli_nt - > tree ) ) ;
}
smbcli_close ( cli_nt - > tree , fnum ) ;
io . generic . level = RAW_OPEN_NTCREATEX ;
2009-10-15 11:26:19 +04:00
io . ntcreatex . in . root_fid . fnum = 0 ;
2006-12-24 18:09:47 +03:00
io . ntcreatex . in . access_mask = SEC_RIGHTS_FILE_ALL ;
io . ntcreatex . in . alloc_size = 0 ;
io . ntcreatex . in . file_attr = FILE_ATTRIBUTE_DIRECTORY ;
io . ntcreatex . in . share_access = NTCREATEX_SHARE_ACCESS_READ |
NTCREATEX_SHARE_ACCESS_WRITE |
NTCREATEX_SHARE_ACCESS_DELETE ;
io . ntcreatex . in . open_disposition = NTCREATEX_DISP_OPEN ;
io . ntcreatex . in . create_options = NTCREATEX_OPTIONS_DIRECTORY ;
io . ntcreatex . in . impersonation =
NTCREATEX_IMPERSONATION_ANONYMOUS ;
io . ntcreatex . in . security_flags = 0 ;
io . ntcreatex . in . fname = fname ;
io . ntcreatex . in . flags = 0 ;
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_nt - > tree , tctx , & io ) ;
2006-12-24 18:09:47 +03:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_NOT_A_DIRECTORY ) ) {
torture_comment ( tctx , " ntcreate as dir gave %s, "
" expected NT_STATUS_NOT_A_DIRECTORY \n " ,
nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
result = false ;
2006-12-24 18:09:47 +03:00
}
if ( NT_STATUS_IS_OK ( status ) ) {
smbcli_close ( cli_nt - > tree , io . ntcreatex . out . file . fnum ) ;
}
2008-11-02 18:07:28 +03:00
status = smb_raw_open ( cli_dos - > tree , tctx , & io ) ;
2006-12-24 18:09:47 +03:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_DOS ( ERRDOS ,
ERRbaddirectory ) ) ) {
torture_comment ( tctx , " ntcreate as dir gave %s, "
" expected NT_STATUS_NOT_A_DIRECTORY \n " ,
nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
result = false ;
2006-12-24 18:09:47 +03:00
}
if ( NT_STATUS_IS_OK ( status ) ) {
smbcli_close ( cli_dos - > tree ,
io . ntcreatex . out . file . fnum ) ;
}
smbcli_unlink ( cli_nt - > tree , fname ) ;
}
2007-10-07 02:28:14 +04:00
if ( ! torture_setting_bool ( tctx , " samba3 " , false ) ) {
2006-05-19 11:47:28 +04:00
goto done ;
}
fnum = smbcli_open ( cli_dos - > tree , os2_fname ,
O_RDWR | O_CREAT | O_TRUNC ,
DENY_NONE ) ;
if ( fnum ! = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Open(%s) succeeded -- expected failure \n " ,
2006-05-19 11:47:28 +04:00
os2_fname ) ;
smbcli_close ( cli_dos - > tree , fnum ) ;
goto fail ;
}
if ( ! NT_STATUS_EQUAL ( smbcli_nt_error ( cli_dos - > tree ) ,
NT_STATUS_DOS ( ERRDOS , ERRcannotopen ) ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Expected DOS error ERRDOS/ERRcannotopen, got %s \n " ,
2006-05-19 11:47:28 +04:00
smbcli_errstr ( cli_dos - > tree ) ) ;
goto fail ;
}
fnum = smbcli_open ( cli_nt - > tree , os2_fname ,
O_RDWR | O_CREAT | O_TRUNC ,
DENY_NONE ) ;
if ( fnum ! = - 1 ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Open(%s) succeeded -- expected failure \n " ,
2006-05-19 11:47:28 +04:00
os2_fname ) ;
smbcli_close ( cli_nt - > tree , fnum ) ;
goto fail ;
}
if ( ! NT_STATUS_EQUAL ( smbcli_nt_error ( cli_nt - > tree ) ,
NT_STATUS_OBJECT_NAME_NOT_FOUND ) ) {
2006-10-16 17:06:41 +04:00
torture_comment ( tctx , " Expected error NT_STATUS_OBJECT_NAME_NOT_FOUND, "
2006-05-19 11:47:28 +04:00
" got %s \n " , smbcli_errstr ( cli_nt - > tree ) ) ;
goto fail ;
}
done :
2007-10-07 02:28:14 +04:00
result = true ;
2006-05-19 11:47:28 +04:00
fail :
if ( cli_dos ! = NULL ) {
torture_close_connection ( cli_dos ) ;
}
if ( cli_nt ! = NULL ) {
torture_close_connection ( cli_nt ) ;
}
return result ;
}
2006-03-17 19:11:02 +03:00
2010-09-29 16:30:49 +04:00
/**
This checks file / dir birthtime
*/
static void list_fn ( struct clilist_file_info * finfo , const char * name ,
void * state ) {
/* Just to change dir access time*/
sleep ( 5 ) ;
}
static bool run_birthtimetest ( struct torture_context * tctx ,
struct smbcli_state * cli )
{
int fnum ;
size_t size ;
time_t c_time , a_time , m_time , w_time , c_time1 ;
const char * fname = " \\ birthtime.tst " ;
const char * dname = " \\ birthtime " ;
const char * fname2 = " \\ birthtime \\ birthtime.tst " ;
bool correct = true ;
uint8_t buf [ 16 ] ;
smbcli_unlink ( cli - > tree , fname ) ;
torture_comment ( tctx , " Testing Birthtime for File \n " ) ;
/* Save File birthtime/creationtime */
fnum = smbcli_open ( cli - > tree , fname , O_RDWR | O_CREAT | O_TRUNC ,
DENY_NONE ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qfileinfo ( cli - > tree , fnum , NULL , & size ,
& c_time , & a_time , & m_time , NULL , NULL ) ) ) {
torture_comment ( tctx , " ERROR: qfileinfo failed (%s) \n " ,
smbcli_errstr ( cli - > tree ) ) ;
correct = false ;
}
smbcli_close ( cli - > tree , fnum ) ;
sleep ( 10 ) ;
/* Change in File attribute changes file change time*/
smbcli_setatr ( cli - > tree , fname , FILE_ATTRIBUTE_SYSTEM , 0 ) ;
fnum = smbcli_open ( cli - > tree , fname , O_RDWR | O_CREAT , DENY_NONE ) ;
/* Writing updates modification time*/
smbcli_smbwrite ( cli - > tree , fnum , & fname , 0 , sizeof ( fname ) ) ;
/*Reading updates access time */
smbcli_read ( cli - > tree , fnum , buf , 0 , 13 ) ;
smbcli_close ( cli - > tree , fnum ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , fname , & c_time1 ,
& a_time , & m_time , & w_time , & size , NULL , NULL ) ) ) {
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " ,
smbcli_errstr ( cli - > tree ) ) ;
correct = false ;
} else {
2010-11-16 00:38:09 +03:00
fprintf ( stdout , " c_time = %li, c_time1 = %li \n " ,
( long ) c_time , ( long ) c_time1 ) ;
2010-09-29 16:30:49 +04:00
if ( c_time1 ! = c_time ) {
torture_comment ( tctx , " This system updated file \
birth times ! Not expected ! \ n " );
correct = false ;
}
}
smbcli_unlink ( cli - > tree , fname ) ;
torture_comment ( tctx , " Testing Birthtime for Directory \n " ) ;
/* check if the server does not update the directory birth time
when creating a new file */
if ( NT_STATUS_IS_ERR ( smbcli_mkdir ( cli - > tree , dname ) ) ) {
torture_comment ( tctx , " ERROR: mkdir failed (%s) \n " ,
smbcli_errstr ( cli - > tree ) ) ;
correct = false ;
}
sleep ( 3 ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , " \\ birthtime \\ " ,
& c_time , & a_time , & m_time , & w_time , & size , NULL , NULL ) ) ) {
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " ,
smbcli_errstr ( cli - > tree ) ) ;
correct = false ;
}
/* Creating a new file changes dir modification time and change time*/
smbcli_unlink ( cli - > tree , fname2 ) ;
fnum = smbcli_open ( cli - > tree , fname2 , O_RDWR | O_CREAT | O_TRUNC ,
DENY_NONE ) ;
smbcli_smbwrite ( cli - > tree , fnum , & fnum , 0 , sizeof ( fnum ) ) ;
smbcli_read ( cli - > tree , fnum , buf , 0 , 13 ) ;
smbcli_close ( cli - > tree , fnum ) ;
/* dir listing changes dir access time*/
smbcli_list ( cli - > tree , " \\ birthtime \\ * " , 0 , list_fn , cli ) ;
if ( NT_STATUS_IS_ERR ( smbcli_qpathinfo2 ( cli - > tree , " \\ birthtime \\ " ,
& c_time1 , & a_time , & m_time , & w_time , & size , NULL , NULL ) ) ) {
torture_comment ( tctx , " ERROR: qpathinfo2 failed (%s) \n " ,
smbcli_errstr ( cli - > tree ) ) ;
correct = false ;
} else {
2010-11-16 00:38:09 +03:00
fprintf ( stdout , " c_time = %li, c_time1 = %li \n " ,
( long ) c_time , ( long ) c_time1 ) ;
2010-09-29 16:30:49 +04:00
if ( c_time1 ! = c_time ) {
torture_comment ( tctx , " This system updated directory \
birth times ! Not Expected ! \ n " );
correct = false ;
}
}
smbcli_unlink ( cli - > tree , fname2 ) ;
smbcli_rmdir ( cli - > tree , dname ) ;
return correct ;
}
2006-03-17 19:11:02 +03:00
NTSTATUS torture_base_init ( void )
{
2007-09-02 03:25:44 +04:00
struct torture_suite * suite = torture_suite_create ( talloc_autofree_context ( ) , " BASE " ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_2smb_test ( suite , " FDPASS " , run_fdpasstest ) ;
2007-09-07 19:08:14 +04:00
torture_suite_add_suite ( suite , torture_base_locktest ( suite ) ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_1smb_test ( suite , " UNLINK " , torture_unlinktest ) ;
torture_suite_add_1smb_test ( suite , " ATTR " , run_attrtest ) ;
torture_suite_add_1smb_test ( suite , " TRANS2 " , run_trans2test ) ;
2010-09-29 16:30:49 +04:00
torture_suite_add_1smb_test ( suite , " BIRTHTIME " , run_birthtimetest ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_simple_test ( suite , " NEGNOWAIT " , run_negprot_nowait ) ;
torture_suite_add_1smb_test ( suite , " DIR1 " , torture_dirtest1 ) ;
torture_suite_add_1smb_test ( suite , " DIR2 " , torture_dirtest2 ) ;
torture_suite_add_1smb_test ( suite , " DENY1 " , torture_denytest1 ) ;
torture_suite_add_2smb_test ( suite , " DENY2 " , torture_denytest2 ) ;
torture_suite_add_2smb_test ( suite , " DENY3 " , torture_denytest3 ) ;
torture_suite_add_1smb_test ( suite , " DENYDOS " , torture_denydos_sharing ) ;
torture_suite_add_smb_multi_test ( suite , " NTDENY1 " , torture_ntdenytest1 ) ;
torture_suite_add_2smb_test ( suite , " NTDENY2 " , torture_ntdenytest2 ) ;
torture_suite_add_1smb_test ( suite , " TCON " , run_tcon_test ) ;
torture_suite_add_1smb_test ( suite , " TCONDEV " , run_tcon_devtype_test ) ;
torture_suite_add_1smb_test ( suite , " VUID " , run_vuidtest ) ;
torture_suite_add_2smb_test ( suite , " RW1 " , run_readwritetest ) ;
torture_suite_add_2smb_test ( suite , " OPEN " , run_opentest ) ;
torture_suite_add_smb_multi_test ( suite , " DEFER_OPEN " , run_deferopen ) ;
torture_suite_add_1smb_test ( suite , " XCOPY " , run_xcopy ) ;
torture_suite_add_1smb_test ( suite , " IOMETER " , run_iometer ) ;
torture_suite_add_1smb_test ( suite , " RENAME " , torture_test_rename ) ;
torture_suite_add_suite ( suite , torture_test_delete ( ) ) ;
torture_suite_add_1smb_test ( suite , " PROPERTIES " , torture_test_properties ) ;
torture_suite_add_1smb_test ( suite , " MANGLE " , torture_mangle ) ;
torture_suite_add_1smb_test ( suite , " OPENATTR " , torture_openattrtest ) ;
2010-09-30 14:56:25 +04:00
torture_suite_add_1smb_test ( suite , " WINATTR " , torture_winattrtest ) ;
2007-09-02 06:07:55 +04:00
torture_suite_add_suite ( suite , torture_charset ( suite ) ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_1smb_test ( suite , " CHKPATH " , torture_chkpath_test ) ;
torture_suite_add_1smb_test ( suite , " SECLEAK " , torture_sec_leak ) ;
torture_suite_add_simple_test ( suite , " DISCONNECT " , torture_disconnect ) ;
torture_suite_add_suite ( suite , torture_delay_write ( ) ) ;
2007-09-02 03:25:44 +04:00
torture_suite_add_simple_test ( suite , " SAMBA3ERROR " , torture_samba3_errorpaths ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_1smb_test ( suite , " CASETABLE " , torture_casetable ) ;
torture_suite_add_1smb_test ( suite , " UTABLE " , torture_utable ) ;
torture_suite_add_simple_test ( suite , " SMB " , torture_smb_scan ) ;
2007-09-07 19:08:14 +04:00
torture_suite_add_suite ( suite , torture_trans2_aliases ( suite ) ) ;
2006-12-27 18:24:48 +03:00
torture_suite_add_1smb_test ( suite , " TRANS2-SCAN " , torture_trans2_scan ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_1smb_test ( suite , " NTTRANS " , torture_nttrans_scan ) ;
2009-10-07 03:57:34 +04:00
torture_suite_add_1smb_test ( suite , " CREATEX_ACCESS " , torture_createx_access ) ;
torture_suite_add_2smb_test ( suite , " CREATEX_SHAREMODES_FILE " , torture_createx_sharemodes_file ) ;
torture_suite_add_2smb_test ( suite , " CREATEX_SHAREMODES_DIR " , torture_createx_sharemodes_dir ) ;
torture_suite_add_1smb_test ( suite , " MAXIMUM_ALLOWED " , torture_maximum_allowed ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_simple_test ( suite , " BENCH-HOLDCON " , torture_holdcon ) ;
2010-01-26 17:20:57 +03:00
torture_suite_add_1smb_test ( suite , " BENCH-HOLDOPEN " , torture_holdopen ) ;
2006-10-16 17:06:41 +04:00
torture_suite_add_simple_test ( suite , " BENCH-READWRITE " , run_benchrw ) ;
torture_suite_add_smb_multi_test ( suite , " BENCH-TORTURE " , run_torture ) ;
torture_suite_add_1smb_test ( suite , " SCAN-PIPE_NUMBER " , run_pipe_number ) ;
torture_suite_add_1smb_test ( suite , " SCAN-IOCTL " , torture_ioctl_test ) ;
torture_suite_add_smb_multi_test ( suite , " SCAN-MAXFID " , run_maxfidtest ) ;
suite - > description = talloc_strdup ( suite ,
" Basic SMB tests (imported from the original smbtorture) " ) ;
torture_register_suite ( suite ) ;
2006-03-17 19:11:02 +03:00
return NT_STATUS_OK ;
}