summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-09-24 00:55:46 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:52:47 -0500
commit8875124a61c63d2def8ec193a98732f6fcfaa6a1 (patch)
tree39d4f185b7f50274855acec1bfac6d3652efb61b
parent729155a42826660dcc0bfa31b03ebd13f2506470 (diff)
downloadsamba-8875124a61c63d2def8ec193a98732f6fcfaa6a1.tar.gz
samba-8875124a61c63d2def8ec193a98732f6fcfaa6a1.tar.bz2
samba-8875124a61c63d2def8ec193a98732f6fcfaa6a1.zip
r2575: Return correct error codes on old SEARCH call (from Samba4 torture tester).
Jeremy. (This used to be commit fc51c97ea86bd1a86830d4ab2c6c7c4ec9fccc88)
-rw-r--r--source3/include/nterr.h3
-rw-r--r--source3/libsmb/errormap.c3
-rw-r--r--source3/libsmb/nterr.c16
-rw-r--r--source3/smbd/reply.c14
4 files changed, 17 insertions, 19 deletions
diff --git a/source3/include/nterr.h b/source3/include/nterr.h
index 19c70cffcc..6cf5a756d2 100644
--- a/source3/include/nterr.h
+++ b/source3/include/nterr.h
@@ -27,9 +27,10 @@
/* Win32 Status codes. */
#define STATUS_BUFFER_OVERFLOW NT_STATUS(0x80000005)
+#define STATUS_NO_MORE_FILES NT_STATUS(0x80000006)
#define NT_STATUS_NO_MORE_ENTRIES NT_STATUS(0x8000001a)
-#define STATUS_MORE_ENTRIES NT_STATUS(0x0105)
+#define STATUS_MORE_ENTRIES NT_STATUS(0x0105)
#define STATUS_SOME_UNMAPPED NT_STATUS(0x0107)
#define ERROR_INVALID_PARAMETER NT_STATUS(0x0057)
#define ERROR_INSUFFICIENT_BUFFER NT_STATUS(0x007a)
diff --git a/source3/libsmb/errormap.c b/source3/libsmb/errormap.c
index 77c71fce13..8ac1aed923 100644
--- a/source3/libsmb/errormap.c
+++ b/source3/libsmb/errormap.c
@@ -102,6 +102,7 @@ static const struct {
* Not an official error, as only bit 0x80000000, not bits 0xC0000000 are set.
*/
{ERRDOS, ERRmoredata, STATUS_BUFFER_OVERFLOW},
+ {ERRDOS, ERRnofiles, STATUS_NO_MORE_FILES},
{ERRDOS, ERRbadfid, NT_STATUS_OBJECT_TYPE_MISMATCH},
{ERRHRD, ERRgeneral, NT_STATUS_NONCONTINUABLE_EXCEPTION},
{ERRHRD, ERRgeneral, NT_STATUS_INVALID_DISPOSITION},
@@ -632,7 +633,7 @@ static const struct {
{ERRDOS, 14, NT_STATUS_SECTION_NOT_EXTENDED},
{ERRDOS, ERRremcd, NT_STATUS_DIRECTORY_NOT_EMPTY},
{ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE},
- {ERRDOS, ERRnofiles, NT_STATUS(0x80000006)},
+ {ERRDOS, ERRnofiles, STATUS_NO_MORE_FILES},
{ERRDOS, 19, NT_STATUS_MEDIA_WRITE_PROTECTED},
{ERRDOS, 21, NT_STATUS_NO_MEDIA_IN_DEVICE},
{ERRDOS, 22, NT_STATUS_INVALID_DEVICE_STATE},
diff --git a/source3/libsmb/nterr.c b/source3/libsmb/nterr.c
index b01451ea0f..677c5d84c7 100644
--- a/source3/libsmb/nterr.c
+++ b/source3/libsmb/nterr.c
@@ -537,6 +537,7 @@ static nt_err_code_struct nt_errs[] =
{ "NT_STATUS_NO_MORE_ENTRIES", NT_STATUS_NO_MORE_ENTRIES },
{ "STATUS_MORE_ENTRIES", STATUS_MORE_ENTRIES },
{ "STATUS_SOME_UNMAPPED", STATUS_SOME_UNMAPPED },
+ { "STATUS_NO_MORE_FILES", STATUS_NO_MORE_FILES },
{ NULL, NT_STATUS(0) }
};
@@ -634,14 +635,15 @@ nt_err_code_struct nt_err_desc[] =
{ "Insufficient logon information", NT_STATUS_INSUFFICIENT_LOGON_INFO },
{ "License quota exceeded", NT_STATUS_LICENSE_QUOTA_EXCEEDED },
+ { "No more files", STATUS_NO_MORE_FILES },
{ NULL, NT_STATUS(0) }
};
-
/*****************************************************************************
- returns an NT error message. not amazingly helpful, but better than a number.
+ Returns an NT error message. not amazingly helpful, but better than a number.
*****************************************************************************/
+
const char *nt_errstr(NTSTATUS nt_code)
{
static pstring msg;
@@ -669,8 +671,7 @@ const char *get_friendly_nt_error_msg(NTSTATUS nt_code)
int idx = 0;
while (nt_err_desc[idx].nt_errstr != NULL) {
- if (NT_STATUS_V(nt_err_desc[idx].nt_errcode) == NT_STATUS_V(nt_code))
- {
+ if (NT_STATUS_V(nt_err_desc[idx].nt_errcode) == NT_STATUS_V(nt_code)) {
return nt_err_desc[idx].nt_errstr;
}
idx++;
@@ -682,8 +683,9 @@ const char *get_friendly_nt_error_msg(NTSTATUS nt_code)
}
/*****************************************************************************
- returns an NT_STATUS constant as a string for inclusion in autogen C code
+ Returns an NT_STATUS constant as a string for inclusion in autogen C code.
*****************************************************************************/
+
const char *get_nt_error_c_code(NTSTATUS nt_code)
{
static pstring out;
@@ -703,8 +705,9 @@ const char *get_nt_error_c_code(NTSTATUS nt_code)
}
/*****************************************************************************
- returns the NT_STATUS constant matching the string supplied (as an NTSTATUS)
+ Returns the NT_STATUS constant matching the string supplied (as an NTSTATUS)
*****************************************************************************/
+
NTSTATUS nt_status_string_to_code(char *nt_status_str)
{
int idx = 0;
@@ -718,7 +721,6 @@ NTSTATUS nt_status_string_to_code(char *nt_status_str)
return NT_STATUS_UNSUCCESSFUL;
}
-
/**
* Squash an NT_STATUS in line with security requirements.
* In an attempt to avoid giving the whole game away when users
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 565046061c..cdf607e273 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -934,8 +934,8 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
make_dir_struct(p,mask,fname,size,mode,date,conn->case_sensitive);
dptr_fill(p+12,dptr_num);
numentries++;
+ p += DIR_STRUCT_SIZE;
}
- p += DIR_STRUCT_SIZE;
}
}
} /* if (ok ) */
@@ -949,18 +949,12 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
(X/Open spec) */
if(ok && expect_close && numentries == 0 && status_len == 0) {
- if (Protocol < PROTOCOL_NT1) {
- SCVAL(outbuf,smb_rcls,ERRDOS);
- SSVAL(outbuf,smb_err,ERRnofiles);
- }
- /* Also close the dptr - we know it's gone */
+ /* Close the dptr - we know it's gone */
dptr_close(&dptr_num);
+ return ERROR_BOTH(STATUS_NO_MORE_FILES,ERRDOS,ERRnofiles);
} else if (numentries == 0 || !ok) {
- if (Protocol < PROTOCOL_NT1) {
- SCVAL(outbuf,smb_rcls,ERRDOS);
- SSVAL(outbuf,smb_err,ERRnofiles);
- }
dptr_close(&dptr_num);
+ return ERROR_BOTH(STATUS_NO_MORE_FILES,ERRDOS,ERRnofiles);
}
/* If we were called as SMBfunique, then we can close the dirptr now ! */