summaryrefslogtreecommitdiff
path: root/source4/torture/raw/qfileinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/torture/raw/qfileinfo.c')
-rw-r--r--source4/torture/raw/qfileinfo.c94
1 files changed, 67 insertions, 27 deletions
diff --git a/source4/torture/raw/qfileinfo.c b/source4/torture/raw/qfileinfo.c
index c7673be526..2a5a2e77ef 100644
--- a/source4/torture/raw/qfileinfo.c
+++ b/source4/torture/raw/qfileinfo.c
@@ -19,23 +19,20 @@
*/
#include "includes.h"
-#include "torture/torture.h"
#include "libcli/raw/libcliraw.h"
#include "libcli/raw/raw_proto.h"
#include "libcli/libcli.h"
#include "torture/util.h"
-#include "librpc/rpc/dcerpc.h"
-#include "torture/rpc/rpc.h"
-#include "torture/raw/proto.h"
+#include "torture/rpc/torture_rpc.h"
#include "param/param.h"
static struct {
const char *name;
enum smb_fileinfo_level level;
- uint_t only_paths:1;
- uint_t only_handles:1;
+ unsigned int only_paths:1;
+ unsigned int only_handles:1;
uint32_t capability_mask;
- uint_t expected_ipc_access_denied:1;
+ unsigned int expected_ipc_access_denied:1;
NTSTATUS expected_ipc_fnum_status;
NTSTATUS fnum_status, fname_status;
union smb_fileinfo fnum_finfo, fname_finfo;
@@ -143,7 +140,7 @@ static int dos_nt_time_cmp(time_t t, NTTIME nt)
{
time_t t2 = nt_time_to_unix(nt);
if (abs(t2 - t) <= 2) return 0;
- return t2 - t;
+ return t2 > t ? 1 : -1;
}
@@ -185,8 +182,8 @@ static union smb_fileinfo *fname_find(bool is_ipc, const char *name)
/* local macros to make the code below more readable */
#define VAL_EQUAL(n1, v1, n2, v2) do {if (s1->n1.out.v1 != s2->n2.out.v2) { \
printf("%s/%s [%u] != %s/%s [%u] at %s(%d)\n", \
- #n1, #v1, (uint_t)s1->n1.out.v1, \
- #n2, #v2, (uint_t)s2->n2.out.v2, \
+ #n1, #v1, (unsigned int)s1->n1.out.v1, \
+ #n2, #v2, (unsigned int)s2->n2.out.v2, \
__FILE__, __LINE__); \
ret = false; \
}} while(0)
@@ -214,8 +211,8 @@ static union smb_fileinfo *fname_find(bool is_ipc, const char *name)
#define VAL_UNKNOWN(n1, v1) do {if (s1->n1.out.v1 != 0) { \
printf("%s/%s non-zero unknown - %u (0x%x) at %s(%d)\n", \
#n1, #v1, \
- (uint_t)s1->n1.out.v1, \
- (uint_t)s1->n1.out.v1, \
+ (unsigned int)s1->n1.out.v1, \
+ (unsigned int)s1->n1.out.v1, \
__FILE__, __LINE__); \
ret = false; \
}} while(0)
@@ -268,11 +265,28 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
if (is_ipc) {
if (levels[i].expected_ipc_access_denied && NT_STATUS_EQUAL(NT_STATUS_ACCESS_DENIED, levels[i].fname_status)) {
+ } else if (!levels[i].only_handles &&
+ NT_STATUS_EQUAL(levels[i].fname_status,
+ NT_STATUS_NOT_SUPPORTED)) {
+ torture_warning(torture, "fname level %s %s",
+ levels[i].name,
+ nt_errstr(levels[i].fname_status));
+ continue;
} else if (!levels[i].only_handles && !NT_STATUS_EQUAL(NT_STATUS_INVALID_DEVICE_REQUEST, levels[i].fname_status)) {
printf("ERROR: fname level %s failed, expected NT_STATUS_INVALID_DEVICE_REQUEST - %s\n",
levels[i].name, nt_errstr(levels[i].fname_status));
count++;
}
+ if (!levels[i].only_paths &&
+ (NT_STATUS_EQUAL(levels[i].fnum_status,
+ NT_STATUS_NOT_SUPPORTED) ||
+ NT_STATUS_EQUAL(levels[i].fnum_status,
+ NT_STATUS_NOT_IMPLEMENTED))) {
+ torture_warning(torture, "fnum level %s %s",
+ levels[i].name,
+ nt_errstr(levels[i].fnum_status));
+ continue;
+ }
if (!levels[i].only_paths && !NT_STATUS_EQUAL(levels[i].expected_ipc_fnum_status, levels[i].fnum_status)) {
printf("ERROR: fnum level %s failed, expected %s - %s\n",
levels[i].name, nt_errstr(levels[i].expected_ipc_fnum_status),
@@ -280,6 +294,28 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
count++;
}
} else {
+ if (!levels[i].only_paths &&
+ (NT_STATUS_EQUAL(levels[i].fnum_status,
+ NT_STATUS_NOT_SUPPORTED) ||
+ NT_STATUS_EQUAL(levels[i].fnum_status,
+ NT_STATUS_NOT_IMPLEMENTED))) {
+ torture_warning(torture, "fnum level %s %s",
+ levels[i].name,
+ nt_errstr(levels[i].fnum_status));
+ continue;
+ }
+
+ if (!levels[i].only_handles &&
+ (NT_STATUS_EQUAL(levels[i].fname_status,
+ NT_STATUS_NOT_SUPPORTED) ||
+ NT_STATUS_EQUAL(levels[i].fname_status,
+ NT_STATUS_NOT_IMPLEMENTED))) {
+ torture_warning(torture, "fname level %s %s",
+ levels[i].name,
+ nt_errstr(levels[i].fname_status));
+ continue;
+ }
+
if (!levels[i].only_paths && !NT_STATUS_IS_OK(levels[i].fnum_status)) {
printf("ERROR: fnum level %s failed - %s\n",
levels[i].name, nt_errstr(levels[i].fnum_status));
@@ -499,21 +535,21 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
s1 = fnum_find(sname); \
if (s1 && s1->stype.out.tfield != correct_size) { \
printf("(%d) handle %s/%s incorrect - %u should be %u\n", __LINE__, #stype, #tfield, \
- (uint_t)s1->stype.out.tfield, \
- (uint_t)correct_size); \
+ (unsigned int)s1->stype.out.tfield, \
+ (unsigned int)correct_size); \
ret = false; \
} \
s1 = fname_find(is_ipc, sname); \
if (s1 && s1->stype.out.tfield != correct_size) { \
printf("(%d) path %s/%s incorrect - %u should be %u\n", __LINE__, #stype, #tfield, \
- (uint_t)s1->stype.out.tfield, \
- (uint_t)correct_size); \
+ (unsigned int)s1->stype.out.tfield, \
+ (unsigned int)correct_size); \
ret = false; \
}} while (0)
s1 = fnum_find("STANDARD_INFO");
correct_size = s1->standard_info.out.size;
- torture_comment(torture, "size: %u\n", (uint_t)correct_size);
+ torture_comment(torture, "size: %u\n", (unsigned int)correct_size);
SIZE_CHECK("GETATTR", getattr, size);
SIZE_CHECK("GETATTRE", getattre, size);
@@ -534,7 +570,7 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
s1 = fnum_find("STANDARD_INFO");
correct_size = s1->standard_info.out.alloc_size;
- torture_comment(torture, "alloc_size: %u\n", (uint_t)correct_size);
+ torture_comment(torture, "alloc_size: %u\n", (unsigned int)correct_size);
SIZE_CHECK("GETATTRE", getattre, alloc_size);
SIZE_CHECK("STANDARD", standard, alloc_size);
@@ -553,21 +589,21 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
s1 = fnum_find(sname); \
if (s1 && s1->stype.out.tfield != correct_attrib) { \
printf("(%d) handle %s/%s incorrect - 0x%x should be 0x%x\n", __LINE__, #stype, #tfield, \
- (uint_t)s1->stype.out.tfield, \
- (uint_t)correct_attrib); \
+ (unsigned int)s1->stype.out.tfield, \
+ (unsigned int)correct_attrib); \
ret = false; \
} \
s1 = fname_find(is_ipc, sname); \
if (s1 && s1->stype.out.tfield != correct_attrib) { \
printf("(%d) path %s/%s incorrect - 0x%x should be 0x%x\n", __LINE__, #stype, #tfield, \
- (uint_t)s1->stype.out.tfield, \
- (uint_t)correct_attrib); \
+ (unsigned int)s1->stype.out.tfield, \
+ (unsigned int)correct_attrib); \
ret = false; \
}} while (0)
s1 = fnum_find("BASIC_INFO");
correct_attrib = s1->basic_info.out.attrib;
- torture_comment(torture, "attrib: 0x%x\n", (uint_t)correct_attrib);
+ torture_comment(torture, "attrib: 0x%x\n", (unsigned int)correct_attrib);
ATTRIB_CHECK("GETATTR", getattr, attrib);
if (!is_ipc) {
@@ -631,6 +667,11 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
s1 = fnum_find("ALT_NAME_INFO");
if (s1) {
correct_name = s1->alt_name_info.out.fname.s;
+ }
+
+ if (!correct_name) {
+ torture_comment(torture, "no alternate name information\n");
+ } else {
torture_comment(torture, "alt_name: %s\n", correct_name);
NAME_CHECK("ALT_NAME_INFO", alt_name_info, fname, STR_UNICODE);
@@ -795,13 +836,13 @@ static bool torture_raw_qfileinfo_internals(struct torture_context *torture,
if (s1 && s1->stype.out.tfield != 0) { \
printf("(%d) handle %s/%s unknown != 0 (0x%x)\n", __LINE__, \
#stype, #tfield, \
- (uint_t)s1->stype.out.tfield); \
+ (unsigned int)s1->stype.out.tfield); \
} \
s1 = fname_find(is_ipc, sname); \
if (s1 && s1->stype.out.tfield != 0) { \
printf("(%d) path %s/%s unknown != 0 (0x%x)\n", __LINE__, \
#stype, #tfield, \
- (uint_t)s1->stype.out.tfield); \
+ (unsigned int)s1->stype.out.tfield); \
}} while (0)
#endif
/* now get a bit fancier .... */
@@ -847,8 +888,7 @@ bool torture_raw_qfileinfo_pipe(struct torture_context *torture,
struct smbcli_tree *ipc_tree;
NTSTATUS status;
- if (!(p = dcerpc_pipe_init(torture, cli->tree->session->transport->socket->event.ctx,
- lp_iconv_convenience(torture->lp_ctx)))) {
+ if (!(p = dcerpc_pipe_init(torture, cli->tree->session->transport->socket->event.ctx))) {
return false;
}