📄 lock.c
字号:
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 + -