⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	el[0].flags		= SMB2_LOCK_FLAG_UNLOCK;	status = smb2_lock(tree, &lck);	if (torture_setting_bool(torture, "windows", false)) {		CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);	} else {		CHECK_STATUS(status, NT_STATUS_OK);	}	lck.in.lock_count	= 1;	el[0].flags		= SMB2_LOCK_FLAG_UNLOCK;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);	lck.in.lock_count	= 1;	el[0].flags		= 0;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	lck.in.lock_count	= 2;	el[0].flags		= SMB2_LOCK_FLAG_UNLOCK;	el[1].flags		= SMB2_LOCK_FLAG_UNLOCK;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	lck.in.lock_count	= 1;	el[0].flags		= SMB2_LOCK_FLAG_UNLOCK;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);	done:	return ret;}struct test_lock_read_write_state {	const char *fname;	uint32_t lock_flags;	NTSTATUS write_h1_status;	NTSTATUS read_h1_status;	NTSTATUS write_h2_status;	NTSTATUS read_h2_status;};static bool test_lock_read_write(struct torture_context *torture,				 struct smb2_tree *tree,				 struct test_lock_read_write_state *s){	bool ret = true;	NTSTATUS status;	struct smb2_handle h1, h2;	uint8_t buf[200];	struct smb2_lock lck;	struct smb2_create cr;	struct smb2_write wr;	struct smb2_read rd;	struct smb2_lock_element el[1];	lck.in.locks		= el;	ZERO_STRUCT(buf);	status = torture_smb2_testfile(tree, s->fname, &h1);	CHECK_STATUS(status, NT_STATUS_OK);	status = smb2_util_write(tree, h1, buf, 0, ARRAY_SIZE(buf));	CHECK_STATUS(status, NT_STATUS_OK);	lck.in.lock_count	= 0x0001;	lck.in.reserved		= 0x00000000;	lck.in.file.handle	= h1;	el[0].offset		= 0;	el[0].length		= ARRAY_SIZE(buf)/2;	el[0].reserved		= 0x00000000;	el[0].flags		= s->lock_flags;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	CHECK_VALUE(lck.out.reserved, 0);	lck.in.lock_count	= 0x0001;	lck.in.reserved		= 0x00000000;	lck.in.file.handle	= h1;	el[0].offset		= ARRAY_SIZE(buf)/2;	el[0].length		= ARRAY_SIZE(buf)/2;	el[0].reserved		= 0x00000000;	el[0].flags		= s->lock_flags;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	CHECK_VALUE(lck.out.reserved, 0);	ZERO_STRUCT(cr);	cr.in.oplock_level = 0;	cr.in.desired_access = SEC_RIGHTS_FILE_ALL;	cr.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;	cr.in.create_disposition = NTCREATEX_DISP_OPEN_IF;	cr.in.share_access = 		NTCREATEX_SHARE_ACCESS_DELETE|		NTCREATEX_SHARE_ACCESS_READ|		NTCREATEX_SHARE_ACCESS_WRITE;	cr.in.create_options = 0;	cr.in.fname = s->fname;	status = smb2_create(tree, tree, &cr);	CHECK_STATUS(status, NT_STATUS_OK);	h2 = cr.out.file.handle;	ZERO_STRUCT(wr);	wr.in.file.handle = h1;	wr.in.offset      = ARRAY_SIZE(buf)/2;	wr.in.data        = data_blob_const(buf, ARRAY_SIZE(buf)/2);	status = smb2_write(tree, &wr);	CHECK_STATUS(status, s->write_h1_status);	ZERO_STRUCT(rd);	rd.in.file.handle = h1;	rd.in.offset      = ARRAY_SIZE(buf)/2;	rd.in.length      = ARRAY_SIZE(buf)/2;	status = smb2_read(tree, tree, &rd);	CHECK_STATUS(status, s->read_h1_status);	ZERO_STRUCT(wr);	wr.in.file.handle = h2;	wr.in.offset      = ARRAY_SIZE(buf)/2;	wr.in.data        = data_blob_const(buf, ARRAY_SIZE(buf)/2);	status = smb2_write(tree, &wr);	CHECK_STATUS(status, s->write_h2_status);	ZERO_STRUCT(rd);	rd.in.file.handle = h2;	rd.in.offset      = ARRAY_SIZE(buf)/2;	rd.in.length      = ARRAY_SIZE(buf)/2;	status = smb2_read(tree, tree, &rd);	CHECK_STATUS(status, s->read_h2_status);	lck.in.lock_count	= 0x0001;	lck.in.reserved		= 0x00000000;	lck.in.file.handle	= h1;	el[0].offset		= ARRAY_SIZE(buf)/2;	el[0].length		= ARRAY_SIZE(buf)/2;	el[0].reserved		= 0x00000000;	el[0].flags		= SMB2_LOCK_FLAG_UNLOCK;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	CHECK_VALUE(lck.out.reserved, 0);	ZERO_STRUCT(wr);	wr.in.file.handle = h2;	wr.in.offset      = ARRAY_SIZE(buf)/2;	wr.in.data        = data_blob_const(buf, ARRAY_SIZE(buf)/2);	status = smb2_write(tree, &wr);	CHECK_STATUS(status, NT_STATUS_OK);	ZERO_STRUCT(rd);	rd.in.file.handle = h2;	rd.in.offset      = ARRAY_SIZE(buf)/2;	rd.in.length      = ARRAY_SIZE(buf)/2;	status = smb2_read(tree, tree, &rd);	CHECK_STATUS(status, NT_STATUS_OK);done:	return ret;}static bool test_lock_rw_none(struct torture_context *torture, struct smb2_tree *tree){	struct test_lock_read_write_state s = {		.fname			= "lock_rw_none.dat",		.lock_flags		= SMB2_LOCK_FLAG_NONE,		.write_h1_status	= NT_STATUS_FILE_LOCK_CONFLICT,		.read_h1_status		= NT_STATUS_OK,		.write_h2_status	= NT_STATUS_FILE_LOCK_CONFLICT,		.read_h2_status		= NT_STATUS_OK,	};	return test_lock_read_write(torture, tree, &s);}static bool test_lock_rw_shared(struct torture_context *torture, struct smb2_tree *tree){	struct test_lock_read_write_state s = {		.fname			= "lock_rw_shared.dat",		.lock_flags		= SMB2_LOCK_FLAG_SHARED,		.write_h1_status	= NT_STATUS_FILE_LOCK_CONFLICT,		.read_h1_status		= NT_STATUS_OK,		.write_h2_status	= NT_STATUS_FILE_LOCK_CONFLICT,		.read_h2_status		= NT_STATUS_OK,	};	return test_lock_read_write(torture, tree, &s);}static bool test_lock_rw_exclusiv(struct torture_context *torture, struct smb2_tree *tree){	struct test_lock_read_write_state s = {		.fname			= "lock_rw_exclusiv.dat",		.lock_flags		= SMB2_LOCK_FLAG_EXCLUSIVE,		.write_h1_status	= NT_STATUS_OK,		.read_h1_status		= NT_STATUS_OK,		.write_h2_status	= NT_STATUS_FILE_LOCK_CONFLICT,		.read_h2_status		= NT_STATUS_FILE_LOCK_CONFLICT,	};	return test_lock_read_write(torture, tree, &s);}static bool test_lock_auto_unlock(struct torture_context *torture, struct smb2_tree *tree){	bool ret = true;	NTSTATUS status;	struct smb2_handle h;	uint8_t buf[200];	struct smb2_lock lck;	struct smb2_lock_element el[2];	ZERO_STRUCT(buf);	status = torture_smb2_testfile(tree, "autounlock.txt", &h);	CHECK_STATUS(status, NT_STATUS_OK);	status = smb2_util_write(tree, h, buf, 0, ARRAY_SIZE(buf));	CHECK_STATUS(status, NT_STATUS_OK);	ZERO_STRUCT(lck);	lck.in.locks		= el;	lck.in.lock_count	= 0x0001;	lck.in.file.handle	= h;	el[0].offset		= 0;	el[0].length		= 1;	el[0].flags		= SMB2_LOCK_FLAG_EXCLUSIVE | SMB2_LOCK_FLAG_FAIL_IMMEDIATELY;	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_OK);	status = smb2_lock(tree, &lck);	CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);	status = smb2_lock(tree, &lck);	if (torture_setting_bool(torture, "windows", false)) {		CHECK_STATUS(status, NT_STATUS_OK);	} else {		CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);	}	done:	return ret;}/* basic testing of SMB2 locking*/struct torture_suite *torture_smb2_lock_init(void){	struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "LOCK");	torture_suite_add_1smb2_test(suite, "VALID-REQUEST", test_valid_request);	torture_suite_add_1smb2_test(suite, "RW-NONE", test_lock_rw_none);	torture_suite_add_1smb2_test(suite, "RW-SHARED", test_lock_rw_shared);	torture_suite_add_1smb2_test(suite, "RW-EXCLUSIV", test_lock_rw_exclusiv);	torture_suite_add_1smb2_test(suite, "AUTO-UNLOCK", test_lock_auto_unlock);	suite->description = talloc_strdup(suite, "SMB2-LOCK tests");	return suite;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -