summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/configure.in2
-rw-r--r--source3/include/smb.h9
-rw-r--r--source3/lib/fault.c5
-rw-r--r--source3/libsmb/clifile.c2
-rw-r--r--source3/libsmb/clireadwrite.c6
-rw-r--r--source3/modules/vfs_catia.c11
-rw-r--r--source3/param/loadparm.c4
-rw-r--r--source3/smbd/nttrans.c20
-rw-r--r--source3/smbd/trans2.c10
9 files changed, 58 insertions, 11 deletions
diff --git a/source3/configure.in b/source3/configure.in
index 325575148e..4eaebcab6d 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -652,7 +652,7 @@ AC_CHECK_HEADERS(aio.h sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h
AC_CHECK_HEADERS(unistd.h grp.h sys/id.h memory.h alloca.h)
AC_CHECK_HEADERS(limits.h float.h pthread.h libintl.h)
AC_CHECK_HEADERS(rpc/rpc.h rpcsvc/nis.h rpcsvc/ypclnt.h)
-AC_CHECK_HEADERS(sys/param.h ctype.h sys/wait.h sys/resource.h sys/ioctl.h sys/ipc.h sys/prctl.h)
+AC_CHECK_HEADERS(sys/param.h ctype.h sys/wait.h sys/resource.h sys/ioctl.h sys/ipc.h sys/prctl.h sys/sysctl.h)
AC_CHECK_HEADERS(sys/mman.h sys/filio.h sys/priv.h sys/shm.h string.h strings.h stdlib.h)
AC_CHECK_HEADERS(sys/mount.h sys/vfs.h sys/fs/s5param.h sys/filsys.h termios.h termio.h)
AC_CHECK_HEADERS(sys/termio.h sys/statfs.h sys/dustat.h sys/statvfs.h stdarg.h)
diff --git a/source3/include/smb.h b/source3/include/smb.h
index f8816b6bc5..3c3ced6baf 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -1511,6 +1511,15 @@ char *strdup(char *s);
/* TCONX Flag (smb_vwv2). */
#define TCONX_FLAG_EXTENDED_RESPONSE 0x8
+/* File Status Flags. See:
+
+http://msdn.microsoft.com/en-us/library/cc246334(PROT.13).aspx
+*/
+
+#define NO_EAS 0x1
+#define NO_SUBSTREAMS 0x2
+#define NO_REPARSETAG 0x4
+
/* Capabilities. see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
#define CAP_RAW_MODE 0x0001
diff --git a/source3/lib/fault.c b/source3/lib/fault.c
index 51fc53bb0d..bf61bb26c4 100644
--- a/source3/lib/fault.c
+++ b/source3/lib/fault.c
@@ -20,6 +20,11 @@
#include "includes.h"
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 696c979802..b15aa8d998 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -2044,7 +2044,7 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
- SIVAL(vwv+2, 1, converted_len);
+ SSVAL(vwv+2, 1, converted_len);
subreq = cli_smb_send(state, ev, cli, SMBntcreateX, 0, 24, vwv,
talloc_get_size(bytes), bytes);
diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c
index b6901961d0..6342de484c 100644
--- a/source3/libsmb/clireadwrite.c
+++ b/source3/libsmb/clireadwrite.c
@@ -287,6 +287,12 @@ static void cli_readall_done(struct tevent_req *subreq)
return;
}
+ if (received == 0) {
+ /* EOF */
+ tevent_req_done(req);
+ return;
+ }
+
if ((state->received == 0) && (received == state->size)) {
/* Ideal case: Got it all in one run */
state->buf = buf;
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index 3c1ab81dc0..0917812ee2 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -55,13 +55,12 @@ static bool build_table(struct char_mappings **cmaps, int value)
int i;
int start = T_START(value);
- (*cmaps) = (struct char_mappings *)
- TALLOC_ZERO(NULL, sizeof(struct char_mappings));
+ (*cmaps) = talloc_zero(NULL, struct char_mappings);
if (!*cmaps)
return False;
- for (i = 0; i <= MAP_SIZE;i++) {
+ for (i = 0; i < MAP_SIZE;i++) {
(*cmaps)->entry[i][TO_UNIX] = start + i;
(*cmaps)->entry[i][TO_WINDOWS] = start + i;
}
@@ -104,8 +103,8 @@ static bool build_ranges(struct char_mappings **cmaps,
return True;
}
-struct share_mapping_entry *get_srt(connection_struct *conn,
- struct share_mapping_entry **global)
+static struct share_mapping_entry *get_srt(connection_struct *conn,
+ struct share_mapping_entry **global)
{
struct share_mapping_entry *share;
@@ -120,7 +119,7 @@ struct share_mapping_entry *get_srt(connection_struct *conn,
return share;
}
-struct share_mapping_entry *add_srt(int snum, const char **mappings)
+static struct share_mapping_entry *add_srt(int snum, const char **mappings)
{
char *tmp;
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index c91f67656b..b278b9616d 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -54,6 +54,10 @@
#include "includes.h"
#include "printing.h"
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
#ifdef HAVE_HTTPCONNECTENCRYPT
#include <cups/http.h>
#endif
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 434bf34e40..1b981578e3 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -623,7 +623,25 @@ void reply_ntcreate_and_X(struct smb_request *req)
SOFF_T(p,0,file_len);
p += 8;
if (flags & EXTENDED_RESPONSE_REQUIRED) {
- SSVAL(p,2,0x7);
+ uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
+ size_t num_names = 0;
+ unsigned int num_streams;
+ struct stream_struct *streams = NULL;
+
+ /* Do we have any EA's ? */
+ status = get_ea_names_from_file(ctx, conn, fsp,
+ smb_fname->base_name, NULL, &num_names);
+ if (NT_STATUS_IS_OK(status) && num_names) {
+ file_status &= ~NO_EAS;
+ }
+ status = SMB_VFS_STREAMINFO(conn, NULL, smb_fname->base_name, ctx,
+ &num_streams, &streams);
+ /* There is always one stream, ::$DATA. */
+ if (NT_STATUS_IS_OK(status) && num_streams > 1) {
+ file_status &= ~NO_SUBSTREAMS;
+ }
+ TALLOC_FREE(streams);
+ SSVAL(p,2,file_status);
}
p += 4;
SCVAL(p,0,fsp->is_directory ? 1 : 0);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 73873e09a3..f2c025b6c1 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -207,7 +207,9 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, connection_struct *conn,
if (sizeret == 0) {
TALLOC_FREE(names);
- *pnames = NULL;
+ if (pnames) {
+ *pnames = NULL;
+ }
*pnum_names = 0;
return NT_STATUS_OK;
}
@@ -244,7 +246,11 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, connection_struct *conn,
names[num_names++] = p;
}
- *pnames = names;
+ if (pnames) {
+ *pnames = names;
+ } else {
+ TALLOC_FREE(names);
+ }
*pnum_names = num_names;
return NT_STATUS_OK;
}