2 Unix SMB/CIFS implementation.
3 test suite for various read operations
4 Copyright (C) Andrew Tridgell 2003
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "torture/torture.h"
22 #include "libcli/raw/libcliraw.h"
23 #include "system/time.h"
24 #include "system/filesys.h"
25 #include "libcli/libcli.h"
26 #include "torture/util.h"
28 #define CHECK_STATUS(status, correct) do { \
29 if (!NT_STATUS_EQUAL(status, correct)) { \
30 printf("(%s) Incorrect status %s - should be %s\n", \
31 __location__, nt_errstr(status), nt_errstr(correct)); \
36 #define CHECK_VALUE(v, correct) do { \
37 if ((v) != (correct)) { \
38 printf("(%s) Incorrect value %s=%ld - should be %ld\n", \
39 __location__, #v, (long)v, (long)correct); \
44 #define CHECK_BUFFER(buf, seed, len) do { \
45 if (!check_buffer(buf, seed, len, __LINE__)) { \
50 #define BASEDIR "\\testread"
54 setup a random buffer based on a seed
56 static void setup_buffer(uint8_t *buf, uint_t seed, int len)
60 for (i=0;i<len;i++) buf[i] = random();
64 check a random buffer based on a seed
66 static BOOL check_buffer(uint8_t *buf, uint_t seed, int len, int line)
73 printf("Buffer incorrect at line %d! ofs=%d v1=0x%x v2=0x%x\n",
84 static BOOL test_read(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
91 const int maxsize = 90000;
92 const char *fname = BASEDIR "\\test.txt";
93 const char *test_data = "TEST DATA";
94 uint_t seed = time(NULL);
96 buf = talloc_zero_size(mem_ctx, maxsize);
98 if (!torture_setup_dir(cli, BASEDIR)) {
102 printf("Testing RAW_READ_READ\n");
103 io.generic.level = RAW_READ_READ;
105 fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
107 printf("Failed to create %s - %s\n", fname, smbcli_errstr(cli->tree));
112 printf("Trying empty file read\n");
113 io.read.in.file.fnum = fnum;
114 io.read.in.count = 1;
115 io.read.in.offset = 0;
116 io.read.in.remaining = 0;
117 io.read.out.data = buf;
118 status = smb_raw_read(cli->tree, &io);
120 CHECK_STATUS(status, NT_STATUS_OK);
121 CHECK_VALUE(io.read.out.nread, 0);
123 printf("Trying zero file read\n");
124 io.read.in.count = 0;
125 status = smb_raw_read(cli->tree, &io);
126 CHECK_STATUS(status, NT_STATUS_OK);
127 CHECK_VALUE(io.read.out.nread, 0);
129 printf("Trying bad fnum\n");
130 io.read.in.file.fnum = fnum+1;
131 status = smb_raw_read(cli->tree, &io);
132 CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
133 io.read.in.file.fnum = fnum;
135 smbcli_write(cli->tree, fnum, 0, test_data, 0, strlen(test_data));
137 printf("Trying small read\n");
138 io.read.in.file.fnum = fnum;
139 io.read.in.offset = 0;
140 io.read.in.remaining = 0;
141 io.read.in.count = strlen(test_data);
142 status = smb_raw_read(cli->tree, &io);
143 CHECK_STATUS(status, NT_STATUS_OK);
144 CHECK_VALUE(io.read.out.nread, strlen(test_data));
145 if (memcmp(buf, test_data, strlen(test_data)) != 0) {
147 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data, buf);
151 printf("Trying short read\n");
152 io.read.in.offset = 1;
153 io.read.in.count = strlen(test_data);
154 status = smb_raw_read(cli->tree, &io);
155 CHECK_STATUS(status, NT_STATUS_OK);
156 CHECK_VALUE(io.read.out.nread, strlen(test_data)-1);
157 if (memcmp(buf, test_data+1, strlen(test_data)-1) != 0) {
159 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data+1, buf);
163 if (cli->transport->negotiate.capabilities & CAP_LARGE_FILES) {
164 printf("Trying max offset\n");
165 io.read.in.offset = ~0;
166 io.read.in.count = strlen(test_data);
167 status = smb_raw_read(cli->tree, &io);
168 CHECK_STATUS(status, NT_STATUS_OK);
169 CHECK_VALUE(io.read.out.nread, 0);
172 setup_buffer(buf, seed, maxsize);
173 smbcli_write(cli->tree, fnum, 0, buf, 0, maxsize);
174 memset(buf, 0, maxsize);
176 printf("Trying large read\n");
177 io.read.in.offset = 0;
178 io.read.in.count = ~0;
179 status = smb_raw_read(cli->tree, &io);
180 CHECK_STATUS(status, NT_STATUS_OK);
181 CHECK_BUFFER(buf, seed, io.read.out.nread);
184 printf("Trying locked region\n");
186 if (NT_STATUS_IS_ERR(smbcli_lock(cli->tree, fnum, 103, 1, 0, WRITE_LOCK))) {
187 printf("Failed to lock file at %d\n", __LINE__);
192 memset(buf, 0, maxsize);
193 io.read.in.offset = 0;
194 io.read.in.count = ~0;
195 status = smb_raw_read(cli->tree, &io);
196 CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
200 smbcli_close(cli->tree, fnum);
201 smb_raw_exit(cli->session);
202 smbcli_deltree(cli->tree, BASEDIR);
210 static BOOL test_lockread(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
217 const int maxsize = 90000;
218 const char *fname = BASEDIR "\\test.txt";
219 const char *test_data = "TEST DATA";
220 uint_t seed = time(NULL);
222 buf = talloc_zero_size(mem_ctx, maxsize);
224 if (!torture_setup_dir(cli, BASEDIR)) {
228 printf("Testing RAW_READ_LOCKREAD\n");
229 io.generic.level = RAW_READ_LOCKREAD;
231 fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
233 printf("Failed to create %s - %s\n", fname, smbcli_errstr(cli->tree));
238 printf("Trying empty file read\n");
239 io.lockread.in.file.fnum = fnum;
240 io.lockread.in.count = 1;
241 io.lockread.in.offset = 1;
242 io.lockread.in.remaining = 0;
243 io.lockread.out.data = buf;
244 status = smb_raw_read(cli->tree, &io);
246 CHECK_STATUS(status, NT_STATUS_OK);
247 CHECK_VALUE(io.lockread.out.nread, 0);
249 status = smb_raw_read(cli->tree, &io);
250 CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);
252 status = smb_raw_read(cli->tree, &io);
253 CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
255 printf("Trying zero file read\n");
256 io.lockread.in.count = 0;
257 status = smb_raw_read(cli->tree, &io);
258 CHECK_STATUS(status, NT_STATUS_OK);
260 smbcli_unlock(cli->tree, fnum, 1, 1);
262 printf("Trying bad fnum\n");
263 io.lockread.in.file.fnum = fnum+1;
264 status = smb_raw_read(cli->tree, &io);
265 CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
266 io.lockread.in.file.fnum = fnum;
268 smbcli_write(cli->tree, fnum, 0, test_data, 0, strlen(test_data));
270 printf("Trying small read\n");
271 io.lockread.in.file.fnum = fnum;
272 io.lockread.in.offset = 0;
273 io.lockread.in.remaining = 0;
274 io.lockread.in.count = strlen(test_data);
275 status = smb_raw_read(cli->tree, &io);
276 CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);
278 smbcli_unlock(cli->tree, fnum, 1, 0);
280 status = smb_raw_read(cli->tree, &io);
281 CHECK_STATUS(status, NT_STATUS_OK);
282 CHECK_VALUE(io.lockread.out.nread, strlen(test_data));
283 if (memcmp(buf, test_data, strlen(test_data)) != 0) {
285 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data, buf);
289 printf("Trying short read\n");
290 io.lockread.in.offset = 1;
291 io.lockread.in.count = strlen(test_data);
292 status = smb_raw_read(cli->tree, &io);
293 CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);
294 smbcli_unlock(cli->tree, fnum, 0, strlen(test_data));
295 status = smb_raw_read(cli->tree, &io);
296 CHECK_STATUS(status, NT_STATUS_OK);
298 CHECK_VALUE(io.lockread.out.nread, strlen(test_data)-1);
299 if (memcmp(buf, test_data+1, strlen(test_data)-1) != 0) {
301 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data+1, buf);
305 if (cli->transport->negotiate.capabilities & CAP_LARGE_FILES) {
306 printf("Trying max offset\n");
307 io.lockread.in.offset = ~0;
308 io.lockread.in.count = strlen(test_data);
309 status = smb_raw_read(cli->tree, &io);
310 CHECK_STATUS(status, NT_STATUS_OK);
311 CHECK_VALUE(io.lockread.out.nread, 0);
314 setup_buffer(buf, seed, maxsize);
315 smbcli_write(cli->tree, fnum, 0, buf, 0, maxsize);
316 memset(buf, 0, maxsize);
318 printf("Trying large read\n");
319 io.lockread.in.offset = 0;
320 io.lockread.in.count = ~0;
321 status = smb_raw_read(cli->tree, &io);
322 CHECK_STATUS(status, NT_STATUS_LOCK_NOT_GRANTED);
323 smbcli_unlock(cli->tree, fnum, 1, strlen(test_data));
324 status = smb_raw_read(cli->tree, &io);
325 CHECK_STATUS(status, NT_STATUS_OK);
326 CHECK_BUFFER(buf, seed, io.lockread.out.nread);
327 smbcli_unlock(cli->tree, fnum, 0, 0xFFFF);
330 printf("Trying locked region\n");
332 if (NT_STATUS_IS_ERR(smbcli_lock(cli->tree, fnum, 103, 1, 0, WRITE_LOCK))) {
333 printf("Failed to lock file at %d\n", __LINE__);
338 memset(buf, 0, maxsize);
339 io.lockread.in.offset = 0;
340 io.lockread.in.count = ~0;
341 status = smb_raw_read(cli->tree, &io);
342 CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
346 smbcli_close(cli->tree, fnum);
347 smbcli_deltree(cli->tree, BASEDIR);
355 static BOOL test_readx(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
362 const int maxsize = 90000;
363 const char *fname = BASEDIR "\\test.txt";
364 const char *test_data = "TEST DATA";
365 uint_t seed = time(NULL);
367 buf = talloc_zero_size(mem_ctx, maxsize);
369 if (!torture_setup_dir(cli, BASEDIR)) {
373 printf("Testing RAW_READ_READX\n");
375 fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
377 printf("Failed to create %s - %s\n", fname, smbcli_errstr(cli->tree));
382 printf("Trying empty file read\n");
383 io.generic.level = RAW_READ_READX;
384 io.readx.in.file.fnum = fnum;
385 io.readx.in.mincnt = 1;
386 io.readx.in.maxcnt = 1;
387 io.readx.in.offset = 0;
388 io.readx.in.remaining = 0;
389 io.readx.in.read_for_execute = False;
390 io.readx.out.data = buf;
391 status = smb_raw_read(cli->tree, &io);
393 CHECK_STATUS(status, NT_STATUS_OK);
394 CHECK_VALUE(io.readx.out.nread, 0);
395 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
396 CHECK_VALUE(io.readx.out.compaction_mode, 0);
398 printf("Trying zero file read\n");
399 io.readx.in.mincnt = 0;
400 io.readx.in.maxcnt = 0;
401 status = smb_raw_read(cli->tree, &io);
402 CHECK_STATUS(status, NT_STATUS_OK);
403 CHECK_VALUE(io.readx.out.nread, 0);
404 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
405 CHECK_VALUE(io.readx.out.compaction_mode, 0);
407 printf("Trying bad fnum\n");
408 io.readx.in.file.fnum = fnum+1;
409 status = smb_raw_read(cli->tree, &io);
410 CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
411 io.readx.in.file.fnum = fnum;
413 smbcli_write(cli->tree, fnum, 0, test_data, 0, strlen(test_data));
415 printf("Trying small read\n");
416 io.readx.in.file.fnum = fnum;
417 io.readx.in.offset = 0;
418 io.readx.in.remaining = 0;
419 io.readx.in.read_for_execute = False;
420 io.readx.in.mincnt = strlen(test_data);
421 io.readx.in.maxcnt = strlen(test_data);
422 status = smb_raw_read(cli->tree, &io);
423 CHECK_STATUS(status, NT_STATUS_OK);
424 CHECK_VALUE(io.readx.out.nread, strlen(test_data));
425 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
426 CHECK_VALUE(io.readx.out.compaction_mode, 0);
427 if (memcmp(buf, test_data, strlen(test_data)) != 0) {
429 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data, buf);
433 printf("Trying short read\n");
434 io.readx.in.offset = 1;
435 io.readx.in.mincnt = strlen(test_data);
436 io.readx.in.maxcnt = strlen(test_data);
437 status = smb_raw_read(cli->tree, &io);
438 CHECK_STATUS(status, NT_STATUS_OK);
439 CHECK_VALUE(io.readx.out.nread, strlen(test_data)-1);
440 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
441 CHECK_VALUE(io.readx.out.compaction_mode, 0);
442 if (memcmp(buf, test_data+1, strlen(test_data)-1) != 0) {
444 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data+1, buf);
448 if (cli->transport->negotiate.capabilities & CAP_LARGE_FILES) {
449 printf("Trying max offset\n");
450 io.readx.in.offset = 0xffffffff;
451 io.readx.in.mincnt = strlen(test_data);
452 io.readx.in.maxcnt = strlen(test_data);
453 status = smb_raw_read(cli->tree, &io);
454 CHECK_STATUS(status, NT_STATUS_OK);
455 CHECK_VALUE(io.readx.out.nread, 0);
456 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
457 CHECK_VALUE(io.readx.out.compaction_mode, 0);
460 setup_buffer(buf, seed, maxsize);
461 smbcli_write(cli->tree, fnum, 0, buf, 0, maxsize);
462 memset(buf, 0, maxsize);
464 printf("Trying large read\n");
465 io.readx.in.offset = 0;
466 io.readx.in.mincnt = 0xFFFF;
467 io.readx.in.maxcnt = 0xFFFF;
468 status = smb_raw_read(cli->tree, &io);
469 CHECK_STATUS(status, NT_STATUS_OK);
470 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
471 CHECK_VALUE(io.readx.out.compaction_mode, 0);
472 CHECK_VALUE(io.readx.out.nread, io.readx.in.maxcnt);
473 CHECK_BUFFER(buf, seed, io.readx.out.nread);
475 printf("Trying extra large read\n");
476 io.readx.in.offset = 0;
477 io.readx.in.mincnt = 100;
478 io.readx.in.maxcnt = 80000;
479 status = smb_raw_read(cli->tree, &io);
480 CHECK_STATUS(status, NT_STATUS_OK);
481 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
482 CHECK_VALUE(io.readx.out.compaction_mode, 0);
483 if (lp_parm_bool(-1, "torture", "samba3", False)) {
484 printf("SAMBA3: large read extension\n");
485 CHECK_VALUE(io.readx.out.nread, 80000);
487 CHECK_VALUE(io.readx.out.nread, 0);
489 CHECK_BUFFER(buf, seed, io.readx.out.nread);
491 printf("Trying mincnt > maxcnt\n");
492 memset(buf, 0, maxsize);
493 io.readx.in.offset = 0;
494 io.readx.in.mincnt = 30000;
495 io.readx.in.maxcnt = 20000;
496 status = smb_raw_read(cli->tree, &io);
497 CHECK_STATUS(status, NT_STATUS_OK);
498 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
499 CHECK_VALUE(io.readx.out.compaction_mode, 0);
500 CHECK_VALUE(io.readx.out.nread, io.readx.in.maxcnt);
501 CHECK_BUFFER(buf, seed, io.readx.out.nread);
503 printf("Trying mincnt < maxcnt\n");
504 memset(buf, 0, maxsize);
505 io.readx.in.offset = 0;
506 io.readx.in.mincnt = 20000;
507 io.readx.in.maxcnt = 30000;
508 status = smb_raw_read(cli->tree, &io);
509 CHECK_STATUS(status, NT_STATUS_OK);
510 CHECK_VALUE(io.readx.out.remaining, 0xFFFF);
511 CHECK_VALUE(io.readx.out.compaction_mode, 0);
512 CHECK_VALUE(io.readx.out.nread, io.readx.in.maxcnt);
513 CHECK_BUFFER(buf, seed, io.readx.out.nread);
515 if (cli->transport->negotiate.capabilities & CAP_LARGE_READX) {
516 printf("Trying large readx\n");
517 io.readx.in.offset = 0;
518 io.readx.in.mincnt = 0;
519 io.readx.in.maxcnt = 0x10000 - 1;
520 status = smb_raw_read(cli->tree, &io);
521 CHECK_STATUS(status, NT_STATUS_OK);
522 CHECK_VALUE(io.readx.out.nread, 0xFFFF);
524 io.readx.in.maxcnt = 0x10000;
525 status = smb_raw_read(cli->tree, &io);
526 CHECK_STATUS(status, NT_STATUS_OK);
527 if (lp_parm_bool(-1, "torture", "samba3", False)) {
528 printf("SAMBA3: large read extension\n");
529 CHECK_VALUE(io.readx.out.nread, 0x10000);
531 CHECK_VALUE(io.readx.out.nread, 0);
534 io.readx.in.maxcnt = 0x10001;
535 status = smb_raw_read(cli->tree, &io);
536 CHECK_STATUS(status, NT_STATUS_OK);
537 if (lp_parm_bool(-1, "torture", "samba3", False)) {
538 printf("SAMBA3: large read extension\n");
539 CHECK_VALUE(io.readx.out.nread, 0x10001);
541 CHECK_VALUE(io.readx.out.nread, 0);
545 printf("Trying locked region\n");
547 if (NT_STATUS_IS_ERR(smbcli_lock(cli->tree, fnum, 103, 1, 0, WRITE_LOCK))) {
548 printf("Failed to lock file at %d\n", __LINE__);
553 memset(buf, 0, maxsize);
554 io.readx.in.offset = 0;
555 io.readx.in.mincnt = 100;
556 io.readx.in.maxcnt = 200;
557 status = smb_raw_read(cli->tree, &io);
558 CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
560 if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
561 printf("skipping large file tests - CAP_LARGE_FILES not set\n");
565 printf("Trying large offset read\n");
566 io.readx.in.offset = ((uint64_t)0x2) << 32;
567 io.readx.in.mincnt = 10;
568 io.readx.in.maxcnt = 10;
569 status = smb_raw_read(cli->tree, &io);
570 CHECK_STATUS(status, NT_STATUS_OK);
571 CHECK_VALUE(io.readx.out.nread, 0);
573 if (NT_STATUS_IS_ERR(smbcli_lock64(cli->tree, fnum, io.readx.in.offset, 1, 0, WRITE_LOCK))) {
574 printf("Failed to lock file at %d\n", __LINE__);
579 status = smb_raw_read(cli->tree, &io);
580 CHECK_STATUS(status, NT_STATUS_OK);
581 CHECK_VALUE(io.readx.out.nread, 0);
584 smbcli_close(cli->tree, fnum);
585 smbcli_deltree(cli->tree, BASEDIR);
593 static BOOL test_readbraw(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
600 const int maxsize = 90000;
601 const char *fname = BASEDIR "\\test.txt";
602 const char *test_data = "TEST DATA";
603 uint_t seed = time(NULL);
605 buf = talloc_zero_size(mem_ctx, maxsize);
607 if (!torture_setup_dir(cli, BASEDIR)) {
611 printf("Testing RAW_READ_READBRAW\n");
613 fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
615 printf("Failed to create %s - %s\n", fname, smbcli_errstr(cli->tree));
620 printf("Trying empty file read\n");
621 io.generic.level = RAW_READ_READBRAW;
622 io.readbraw.in.file.fnum = fnum;
623 io.readbraw.in.mincnt = 1;
624 io.readbraw.in.maxcnt = 1;
625 io.readbraw.in.offset = 0;
626 io.readbraw.in.timeout = 0;
627 io.readbraw.out.data = buf;
628 status = smb_raw_read(cli->tree, &io);
630 CHECK_STATUS(status, NT_STATUS_OK);
631 CHECK_VALUE(io.readbraw.out.nread, 0);
633 printf("Trying zero file read\n");
634 io.readbraw.in.mincnt = 0;
635 io.readbraw.in.maxcnt = 0;
636 status = smb_raw_read(cli->tree, &io);
637 CHECK_STATUS(status, NT_STATUS_OK);
638 CHECK_VALUE(io.readbraw.out.nread, 0);
640 printf("Trying bad fnum\n");
641 io.readbraw.in.file.fnum = fnum+1;
642 status = smb_raw_read(cli->tree, &io);
643 CHECK_STATUS(status, NT_STATUS_OK);
644 CHECK_VALUE(io.readbraw.out.nread, 0);
645 io.readbraw.in.file.fnum = fnum;
647 smbcli_write(cli->tree, fnum, 0, test_data, 0, strlen(test_data));
649 printf("Trying small read\n");
650 io.readbraw.in.file.fnum = fnum;
651 io.readbraw.in.offset = 0;
652 io.readbraw.in.mincnt = strlen(test_data);
653 io.readbraw.in.maxcnt = strlen(test_data);
654 status = smb_raw_read(cli->tree, &io);
655 CHECK_STATUS(status, NT_STATUS_OK);
656 CHECK_VALUE(io.readbraw.out.nread, strlen(test_data));
657 if (memcmp(buf, test_data, strlen(test_data)) != 0) {
659 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data, buf);
663 printf("Trying short read\n");
664 io.readbraw.in.offset = 1;
665 io.readbraw.in.mincnt = strlen(test_data);
666 io.readbraw.in.maxcnt = strlen(test_data);
667 status = smb_raw_read(cli->tree, &io);
668 CHECK_STATUS(status, NT_STATUS_OK);
669 CHECK_VALUE(io.readbraw.out.nread, strlen(test_data)-1);
670 if (memcmp(buf, test_data+1, strlen(test_data)-1) != 0) {
672 printf("incorrect data at %d!? (%s:%s)\n", __LINE__, test_data+1, buf);
676 if (cli->transport->negotiate.capabilities & CAP_LARGE_FILES) {
677 printf("Trying max offset\n");
678 io.readbraw.in.offset = ~0;
679 io.readbraw.in.mincnt = strlen(test_data);
680 io.readbraw.in.maxcnt = strlen(test_data);
681 status = smb_raw_read(cli->tree, &io);
682 CHECK_STATUS(status, NT_STATUS_OK);
683 CHECK_VALUE(io.readbraw.out.nread, 0);
686 setup_buffer(buf, seed, maxsize);
687 smbcli_write(cli->tree, fnum, 0, buf, 0, maxsize);
688 memset(buf, 0, maxsize);
690 printf("Trying large read\n");
691 io.readbraw.in.offset = 0;
692 io.readbraw.in.mincnt = ~0;
693 io.readbraw.in.maxcnt = ~0;
694 status = smb_raw_read(cli->tree, &io);
695 CHECK_STATUS(status, NT_STATUS_OK);
696 CHECK_VALUE(io.readbraw.out.nread, 0xFFFF);
697 CHECK_BUFFER(buf, seed, io.readbraw.out.nread);
699 printf("Trying mincnt > maxcnt\n");
700 memset(buf, 0, maxsize);
701 io.readbraw.in.offset = 0;
702 io.readbraw.in.mincnt = 30000;
703 io.readbraw.in.maxcnt = 20000;
704 status = smb_raw_read(cli->tree, &io);
705 CHECK_STATUS(status, NT_STATUS_OK);
706 CHECK_VALUE(io.readbraw.out.nread, io.readbraw.in.maxcnt);
707 CHECK_BUFFER(buf, seed, io.readbraw.out.nread);
709 printf("Trying mincnt < maxcnt\n");
710 memset(buf, 0, maxsize);
711 io.readbraw.in.offset = 0;
712 io.readbraw.in.mincnt = 20000;
713 io.readbraw.in.maxcnt = 30000;
714 status = smb_raw_read(cli->tree, &io);
715 CHECK_STATUS(status, NT_STATUS_OK);
716 CHECK_VALUE(io.readbraw.out.nread, io.readbraw.in.maxcnt);
717 CHECK_BUFFER(buf, seed, io.readbraw.out.nread);
719 printf("Trying locked region\n");
721 if (NT_STATUS_IS_ERR(smbcli_lock(cli->tree, fnum, 103, 1, 0, WRITE_LOCK))) {
722 printf("Failed to lock file at %d\n", __LINE__);
727 memset(buf, 0, maxsize);
728 io.readbraw.in.offset = 0;
729 io.readbraw.in.mincnt = 100;
730 io.readbraw.in.maxcnt = 200;
731 status = smb_raw_read(cli->tree, &io);
732 CHECK_STATUS(status, NT_STATUS_OK);
733 CHECK_VALUE(io.readbraw.out.nread, 0);
735 printf("Trying locked region with timeout\n");
736 memset(buf, 0, maxsize);
737 io.readbraw.in.offset = 0;
738 io.readbraw.in.mincnt = 100;
739 io.readbraw.in.maxcnt = 200;
740 io.readbraw.in.timeout = 10000;
741 status = smb_raw_read(cli->tree, &io);
742 CHECK_STATUS(status, NT_STATUS_OK);
743 CHECK_VALUE(io.readbraw.out.nread, 0);
745 if (cli->transport->negotiate.capabilities & CAP_LARGE_FILES) {
746 printf("Trying large offset read\n");
747 io.readbraw.in.offset = ((uint64_t)0x2) << 32;
748 io.readbraw.in.mincnt = 10;
749 io.readbraw.in.maxcnt = 10;
750 io.readbraw.in.timeout = 0;
751 status = smb_raw_read(cli->tree, &io);
752 CHECK_STATUS(status, NT_STATUS_OK);
753 CHECK_VALUE(io.readbraw.out.nread, 0);
757 smbcli_close(cli->tree, fnum);
758 smbcli_deltree(cli->tree, BASEDIR);
763 test read for execute
765 static BOOL test_read_for_execute(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
774 const int maxsize = 900;
775 const char *fname = BASEDIR "\\test.txt";
776 const uint8_t data[] = "TEST DATA";
778 buf = talloc_zero_size(mem_ctx, maxsize);
780 if (!torture_setup_dir(cli, BASEDIR)) {
784 printf("Testing RAW_READ_READX with read_for_execute\n");
786 op.generic.level = RAW_OPEN_NTCREATEX;
787 op.ntcreatex.in.root_fid = 0;
788 op.ntcreatex.in.flags = 0;
789 op.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
790 op.ntcreatex.in.create_options = 0;
791 op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
792 op.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;
793 op.ntcreatex.in.alloc_size = 0;
794 op.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
795 op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
796 op.ntcreatex.in.security_flags = 0;
797 op.ntcreatex.in.fname = fname;
798 status = smb_raw_open(cli->tree, mem_ctx, &op);
799 CHECK_STATUS(status, NT_STATUS_OK);
800 fnum = op.ntcreatex.out.file.fnum;
802 wr.generic.level = RAW_WRITE_WRITEX;
803 wr.writex.in.file.fnum = fnum;
804 wr.writex.in.offset = 0;
805 wr.writex.in.wmode = 0;
806 wr.writex.in.remaining = 0;
807 wr.writex.in.count = ARRAY_SIZE(data);
808 wr.writex.in.data = data;
809 status = smb_raw_write(cli->tree, &wr);
810 CHECK_STATUS(status, NT_STATUS_OK);
811 CHECK_VALUE(wr.writex.out.nwritten, ARRAY_SIZE(data));
813 status = smbcli_close(cli->tree, fnum);
814 CHECK_STATUS(status, NT_STATUS_OK);
816 printf("open file with SEC_FILE_EXECUTE\n");
817 op.generic.level = RAW_OPEN_NTCREATEX;
818 op.ntcreatex.in.root_fid = 0;
819 op.ntcreatex.in.flags = 0;
820 op.ntcreatex.in.access_mask = SEC_FILE_EXECUTE;
821 op.ntcreatex.in.create_options = 0;
822 op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
823 op.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;
824 op.ntcreatex.in.alloc_size = 0;
825 op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
826 op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
827 op.ntcreatex.in.security_flags = 0;
828 op.ntcreatex.in.fname = fname;
829 status = smb_raw_open(cli->tree, mem_ctx, &op);
830 CHECK_STATUS(status, NT_STATUS_OK);
831 fnum = op.ntcreatex.out.file.fnum;
833 printf("read with FLAGS2_READ_PERMIT_EXECUTE\n");
834 rd.generic.level = RAW_READ_READX;
835 rd.readx.in.file.fnum = fnum;
836 rd.readx.in.mincnt = 0;
837 rd.readx.in.maxcnt = maxsize;
838 rd.readx.in.offset = 0;
839 rd.readx.in.remaining = 0;
840 rd.readx.in.read_for_execute = True;
841 rd.readx.out.data = buf;
842 status = smb_raw_read(cli->tree, &rd);
843 CHECK_STATUS(status, NT_STATUS_OK);
844 CHECK_VALUE(rd.readx.out.nread, ARRAY_SIZE(data));
845 CHECK_VALUE(rd.readx.out.remaining, 0xFFFF);
846 CHECK_VALUE(rd.readx.out.compaction_mode, 0);
848 printf("read without FLAGS2_READ_PERMIT_EXECUTE (should fail)\n");
849 rd.generic.level = RAW_READ_READX;
850 rd.readx.in.file.fnum = fnum;
851 rd.readx.in.mincnt = 0;
852 rd.readx.in.maxcnt = maxsize;
853 rd.readx.in.offset = 0;
854 rd.readx.in.remaining = 0;
855 rd.readx.in.read_for_execute = False;
856 rd.readx.out.data = buf;
857 status = smb_raw_read(cli->tree, &rd);
858 CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
860 status = smbcli_close(cli->tree, fnum);
861 CHECK_STATUS(status, NT_STATUS_OK);
863 printf("open file with SEC_FILE_READ_DATA\n");
864 op.generic.level = RAW_OPEN_NTCREATEX;
865 op.ntcreatex.in.root_fid = 0;
866 op.ntcreatex.in.flags = 0;
867 op.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
868 op.ntcreatex.in.create_options = 0;
869 op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
870 op.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;
871 op.ntcreatex.in.alloc_size = 0;
872 op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
873 op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
874 op.ntcreatex.in.security_flags = 0;
875 op.ntcreatex.in.fname = fname;
876 status = smb_raw_open(cli->tree, mem_ctx, &op);
877 CHECK_STATUS(status, NT_STATUS_OK);
878 fnum = op.ntcreatex.out.file.fnum;
880 printf("read with FLAGS2_READ_PERMIT_EXECUTE\n");
881 rd.generic.level = RAW_READ_READX;
882 rd.readx.in.file.fnum = fnum;
883 rd.readx.in.mincnt = 0;
884 rd.readx.in.maxcnt = maxsize;
885 rd.readx.in.offset = 0;
886 rd.readx.in.remaining = 0;
887 rd.readx.in.read_for_execute = True;
888 rd.readx.out.data = buf;
889 status = smb_raw_read(cli->tree, &rd);
890 CHECK_STATUS(status, NT_STATUS_OK);
891 CHECK_VALUE(rd.readx.out.nread, ARRAY_SIZE(data));
892 CHECK_VALUE(rd.readx.out.remaining, 0xFFFF);
893 CHECK_VALUE(rd.readx.out.compaction_mode, 0);
895 printf("read without FLAGS2_READ_PERMIT_EXECUTE\n");
896 rd.generic.level = RAW_READ_READX;
897 rd.readx.in.file.fnum = fnum;
898 rd.readx.in.mincnt = 0;
899 rd.readx.in.maxcnt = maxsize;
900 rd.readx.in.offset = 0;
901 rd.readx.in.remaining = 0;
902 rd.readx.in.read_for_execute = False;
903 rd.readx.out.data = buf;
904 status = smb_raw_read(cli->tree, &rd);
905 CHECK_STATUS(status, NT_STATUS_OK);
906 CHECK_VALUE(rd.readx.out.nread, ARRAY_SIZE(data));
907 CHECK_VALUE(rd.readx.out.remaining, 0xFFFF);
908 CHECK_VALUE(rd.readx.out.compaction_mode, 0);
911 smbcli_close(cli->tree, fnum);
912 smbcli_deltree(cli->tree, BASEDIR);
918 basic testing of read calls
920 BOOL torture_raw_read(struct torture_context *torture)
922 struct smbcli_state *cli;
926 if (!torture_open_connection(&cli, 0)) {
930 mem_ctx = talloc_init("torture_raw_read");
932 ret &= test_read(cli, mem_ctx);
933 ret &= test_readx(cli, mem_ctx);
934 ret &= test_lockread(cli, mem_ctx);
935 ret &= test_readbraw(cli, mem_ctx);
936 ret &= test_read_for_execute(cli, mem_ctx);
938 torture_close_connection(cli);
939 talloc_free(mem_ctx);