[SCM] Samba Shared Repository - branch master updated
Ralph Böhme
slow at samba.org
Mon Mar 7 20:13:03 UTC 2016
The branch, master has been updated
via f4b4872 s3: smbd: Change open_streams_for_delete() to take a struct smb_filename *.
via f67d116 s3: smbd: Change open_streams_for_delete() to take a struct smb_filename *.
via fc122d9 s3: smbd: Change open_streams_for_delete() to static.
via a3856cb s3: smbd: Change delete_all_streams() to take a const struct smb_filename *.
via 859d978 s3: VFS: vfs_fruit. If we have an fsp, use it in preference to a pathname in vfs_streaminfo.
via dbcdacc lib: Avoid a gencache_parse when setting a delete marker
via 639b3ca lib: Avoid looking at fcntl'ed gencache.tdb
via b3dd6fd lib: Simplify gencache_pull_timeout callers
via 6797014 lib: Make gencache_pull_timeout look at uint8_t
via 1ff902f lib: Remove memcache from gencache
via b6f90f7 lib: Fix a typo in gencache
via f0e3515 lib: Simplify gencache_del
via f857f30 lib: skip deleted entries in gencache_iterate
from b73235f krb5_wrap: Do not use deprecated KRB5 functions
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit f4b48729823b0a32d53abaeba2bbafa54a36a11c
Author: Jeremy Allison <jra at samba.org>
Date: Fri Mar 4 14:16:13 2016 -0800
s3: smbd: Change open_streams_for_delete() to take a struct smb_filename *.
Prepare for changing vfs_streaminfo to do the same.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
Autobuild-User(master): Ralph Böhme <slow at samba.org>
Autobuild-Date(master): Mon Mar 7 21:12:56 CET 2016 on sn-devel-144
commit f67d11676fed97a6c1ad468e22bad8c5d8fe24f5
Author: Jeremy Allison <jra at samba.org>
Date: Fri Mar 4 14:16:13 2016 -0800
s3: smbd: Change open_streams_for_delete() to take a struct smb_filename *.
Prepare for changing vfs_streaminfo to do the same.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit fc122d92550ce39efbf019dcb01f3a54e8bfa89c
Author: Jeremy Allison <jra at samba.org>
Date: Fri Mar 4 14:13:22 2016 -0800
s3: smbd: Change open_streams_for_delete() to static.
Not used outside of open.c
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit a3856cbf893a39d88b064c882dc9236f33cdba27
Author: Jeremy Allison <jra at samba.org>
Date: Fri Mar 4 14:07:04 2016 -0800
s3: smbd: Change delete_all_streams() to take a const struct smb_filename *.
Prepare for changing the interface to vfs_streaminfo().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 859d9784ba2c7aeaebbe31292e20b98c7e827c2f
Author: Jeremy Allison <jra at samba.org>
Date: Fri Mar 4 14:01:47 2016 -0800
s3: VFS: vfs_fruit. If we have an fsp, use it in preference to a pathname in vfs_streaminfo.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit dbcdacc58df77c87f7e6f919208cfd141e37b2d4
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 3 17:39:09 2016 +0100
lib: Avoid a gencache_parse when setting a delete marker
We know that we want to put something into _notrans, no point in
doing another round trip into gencache.tdb.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 639b3ca48a8dc4e853aa414ba175768413cb3aa3
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 3 17:41:34 2016 +0100
lib: Avoid looking at fcntl'ed gencache.tdb
gencache_notrans.tdb is much cheaper to look at than gencache.tdb because it's
mutexed and thus avoids expensive fcntl locks. This patch aggressively uses the
shared _notrans tdb for both positive and negative entries. It's a replacement
for the memcache copy in every process that was removed a few patches ago.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit b3dd6fd8a4d77cbb7e4e1110204fb4ddf9d8caf8
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jul 22 16:03:47 2015 +0200
lib: Simplify gencache_pull_timeout callers
gencache_pull_timeout used to point at the "/" right after the timeout. None
of the callers was interested in the "/", they are interested in the payload.
Increment the endpointer in gencache_pull_timeout and rename it.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 6797014d4509b7b243a50e9d2cac88007ec09dc4
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jul 22 16:00:03 2015 +0200
lib: Make gencache_pull_timeout look at uint8_t
At this point we're still looking at TDB_DATA. This patch moves the casts to a
more appropriate place.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 1ff902fc32638315b686be65bdb57db1f65e12d8
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jul 22 15:50:00 2015 +0200
lib: Remove memcache from gencache
The main reason for this was to avoid access to the fcntl-governed transaction
based gencache.tdb. A later patch will make this unnecessary by filling
gencache_notrans more aggressively.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit b6f90f713a5fee78a93601f11463ffe688c64dfb
Author: Volker Lendecke <vl at samba.org>
Date: Sun Mar 6 10:27:06 2016 +0100
lib: Fix a typo in gencache
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit f0e35154fefa361c5fa2eb0a2a3b35d1cdc17905
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 3 15:59:05 2016 +0100
lib: Simplify gencache_del
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit f857f30236b1143be930ec56f233846d867bd3bd
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 3 15:59:05 2016 +0100
lib: skip deleted entries in gencache_iterate
"net cache flush" can give nasty error messages like
Couldn't delete entry! key = IDMAP/UID2SID/12345
These happen when there's an already deleted entry in
gencache_notrans.tdb, indicated by a 0 timeout. This happens if two
gencache_del function calls have happened right after the other and a
gencache_stabilize has not wiped them.
In gencache_iterate, don't show these deleted entries
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
-----------------------------------------------------------------------
Summary of changes:
examples/VFS/skel_opaque.c | 2 +-
examples/VFS/skel_transparent.c | 9 ++-
source3/include/vfs.h | 6 +-
source3/include/vfs_macros.h | 8 +--
source3/lib/gencache.c | 138 ++++++++++++++++++------------------
source3/modules/vfs_catia.c | 21 ++++--
source3/modules/vfs_default.c | 15 ++--
source3/modules/vfs_fruit.c | 21 ++----
source3/modules/vfs_full_audit.c | 6 +-
source3/modules/vfs_media_harmony.c | 37 +++++-----
source3/modules/vfs_streams_depot.c | 16 +++--
source3/modules/vfs_streams_xattr.c | 29 +++++---
source3/modules/vfs_time_audit.c | 4 +-
source3/modules/vfs_unityed_media.c | 19 ++---
source3/smbd/close.c | 15 ++--
source3/smbd/filename.c | 2 +-
source3/smbd/nttrans.c | 4 +-
source3/smbd/open.c | 32 +++++----
source3/smbd/proto.h | 7 +-
source3/smbd/trans2.c | 8 ++-
source3/smbd/vfs.c | 13 ++--
21 files changed, 225 insertions(+), 187 deletions(-)
Changeset truncated at 500 lines:
diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 457881d..67c387d 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -579,7 +579,7 @@ static NTSTATUS skel_set_compression(struct vfs_handle_struct *handle,
static NTSTATUS skel_streaminfo(struct vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams)
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index 55b1ed6..9fc9438 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -699,14 +699,17 @@ static NTSTATUS skel_set_compression(struct vfs_handle_struct *handle,
static NTSTATUS skel_streaminfo(struct vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams)
{
return SMB_VFS_NEXT_STREAMINFO(handle,
- fsp,
- fname, mem_ctx, num_streams, streams);
+ fsp,
+ smb_fname,
+ mem_ctx,
+ num_streams,
+ streams);
}
static int skel_get_real_filename(struct vfs_handle_struct *handle,
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index e77d702..1c6bc2f 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -188,6 +188,8 @@
const struct smb_filename * */
/* Version 35 - Change lchown from const char *, to
const struct smb_filename * */
+/* Version 35 - Change streaminfo from const char *, to
+ const struct smb_filename * */
#define SMB_VFS_INTERFACE_VERSION 35
@@ -721,7 +723,7 @@ struct vfs_fn_pointers {
NTSTATUS (*streaminfo_fn)(struct vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams);
@@ -1153,7 +1155,7 @@ struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
const SMB_STRUCT_STAT *sbuf);
NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams);
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index ae2ba1b..6059c2a 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -346,10 +346,10 @@
#define SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf) \
smb_vfs_call_file_id_create((handle)->next, (sbuf))
-#define SMB_VFS_STREAMINFO(conn, fsp, fname, mem_ctx, num_streams, streams) \
- smb_vfs_call_streaminfo((conn)->vfs_handles, (fsp), (fname), (mem_ctx), (num_streams), (streams))
-#define SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, num_streams, streams) \
- smb_vfs_call_streaminfo((handle)->next, (fsp), (fname), (mem_ctx), (num_streams), (streams))
+#define SMB_VFS_STREAMINFO(conn, fsp, smb_fname, mem_ctx, num_streams, streams) \
+ smb_vfs_call_streaminfo((conn)->vfs_handles, (fsp), (smb_fname), (mem_ctx), (num_streams), (streams))
+#define SMB_VFS_NEXT_STREAMINFO(handle, fsp, smb_fname, mem_ctx, num_streams, streams) \
+ smb_vfs_call_streaminfo((handle)->next, (fsp), (smb_fname), (mem_ctx), (num_streams), (streams))
#define SMB_VFS_GET_REAL_FILENAME(conn, path, name, mem_ctx, found_name) \
smb_vfs_call_get_real_filename((conn)->vfs_handles, (path), (name), (mem_ctx), (found_name))
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index c353aa6..84d273e 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -26,7 +26,6 @@
#include "system/glob.h"
#include "util_tdb.h"
#include "tdb_wrap/tdb_wrap.h"
-#include "../lib/util/memcache.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_TDB
@@ -35,7 +34,6 @@
static struct tdb_wrap *cache;
static struct tdb_wrap *cache_notrans;
-static int cache_notrans_seqnum;
/**
* @file gencache.c
@@ -124,7 +122,6 @@ static bool gencache_init(void)
cache_notrans = tdb_wrap_open(NULL, cache_fname, 0,
TDB_CLEAR_IF_FIRST|
TDB_INCOMPATIBLE_HASH|
- TDB_SEQNUM|
TDB_NOSYNC|
TDB_MUTEX_LOCKING,
open_flags, 0644);
@@ -299,7 +296,7 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob,
return false;
}
- if (gencache_have_val(keystr, blob, timeout)) {
+ if ((timeout != 0) && gencache_have_val(keystr, blob, timeout)) {
DEBUG(10, ("Did not store value for %s, we already got it\n",
keystr));
return true;
@@ -370,6 +367,15 @@ done:
return ret == 0;
}
+static void gencache_del_parser(time_t timeout, DATA_BLOB blob,
+ void *private_data)
+{
+ if (timeout != 0) {
+ bool *exists = private_data;
+ *exists = true;
+ }
+}
+
/**
* Delete one entry from the cache file.
*
@@ -381,9 +387,10 @@ done:
bool gencache_del(const char *keystr)
{
- bool exists, was_expired;
- bool ret = false;
- DATA_BLOB value;
+ TDB_DATA key = string_term_tdb_data(keystr);
+ bool exists = false;
+ bool result = false;
+ int ret;
if (keystr == NULL) {
return false;
@@ -395,31 +402,28 @@ bool gencache_del(const char *keystr)
DEBUG(10, ("Deleting cache entry (key=[%s])\n", keystr));
- /*
- * We delete an element by setting its timeout to 0. This way we don't
- * have to do a transaction on gencache.tdb every time we delete an
- * element.
- */
+ ret = tdb_chainlock(cache_notrans->tdb, key);
+ if (ret == -1) {
+ return false;
+ }
- exists = gencache_get_data_blob(keystr, NULL, &value, NULL,
- &was_expired);
+ gencache_parse(keystr, gencache_del_parser, &exists);
- if (!exists && was_expired) {
+ if (exists) {
/*
- * gencache_get_data_blob has implicitly deleted this
- * entry, so we have to return success here.
+ * We delete an element by setting its timeout to
+ * 0. This way we don't have to do a transaction on
+ * gencache.tdb every time we delete an element.
*/
- return true;
+ result = gencache_set(keystr, "", 0);
}
- if (exists) {
- data_blob_free(&value);
- ret = gencache_set(keystr, "", 0);
- }
- return ret;
+ tdb_chainunlock(cache_notrans->tdb, key);
+
+ return result;
}
-static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
+static bool gencache_pull_timeout(uint8_t *val, time_t *pres, char **payload)
{
time_t res;
char *endptr;
@@ -428,17 +432,17 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
return false;
}
- res = strtol(val, &endptr, 10);
+ res = strtol((char *)val, &endptr, 10);
if ((endptr == NULL) || (*endptr != '/')) {
- DEBUG(2, ("Invalid gencache data format: %s\n", val));
+ DEBUG(2, ("Invalid gencache data format: %s\n", (char *)val));
return false;
}
if (pres != NULL) {
*pres = res;
}
- if (pendptr != NULL) {
- *pendptr = endptr;
+ if (payload != NULL) {
+ *payload = endptr+1;
}
return true;
}
@@ -446,7 +450,7 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
struct gencache_parse_state {
void (*parser)(time_t timeout, DATA_BLOB blob, void *private_data);
void *private_data;
- bool is_memcache;
+ bool copy_to_notrans;
};
static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
@@ -454,25 +458,23 @@ static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
struct gencache_parse_state *state;
DATA_BLOB blob;
time_t t;
- char *endptr;
+ char *payload;
bool ret;
if (data.dptr == NULL) {
return -1;
}
- ret = gencache_pull_timeout((char *)data.dptr, &t, &endptr);
+ ret = gencache_pull_timeout(data.dptr, &t, &payload);
if (!ret) {
return -1;
}
state = (struct gencache_parse_state *)private_data;
blob = data_blob_const(
- endptr+1, data.dsize - PTR_DIFF(endptr+1, data.dptr));
+ payload, data.dsize - PTR_DIFF(payload, data.dptr));
state->parser(t, blob, state->private_data);
- if (!state->is_memcache) {
- memcache_add(NULL, GENCACHE_RAM,
- data_blob_const(key.dptr, key.dsize),
- data_blob_const(data.dptr, data.dsize));
+ if (state->copy_to_notrans) {
+ tdb_store(cache_notrans->tdb, key, data, 0);
}
return 0;
@@ -485,7 +487,6 @@ bool gencache_parse(const char *keystr,
{
struct gencache_parse_state state;
TDB_DATA key = string_term_tdb_data(keystr);
- DATA_BLOB memcache_val;
int ret;
if (keystr == NULL) {
@@ -500,38 +501,35 @@ bool gencache_parse(const char *keystr,
state.parser = parser;
state.private_data = private_data;
+ state.copy_to_notrans = false;
- if (memcache_lookup(NULL, GENCACHE_RAM,
- data_blob_const(key.dptr, key.dsize),
- &memcache_val)) {
- /*
- * Make sure that nobody has changed the gencache behind our
- * back.
- */
- int current_seqnum = tdb_get_seqnum(cache_notrans->tdb);
- if (current_seqnum == cache_notrans_seqnum) {
- /*
- * Ok, our memcache is still current, use it without
- * going to the tdb files.
- */
- state.is_memcache = true;
- gencache_parse_fn(key, make_tdb_data(memcache_val.data,
- memcache_val.length),
- &state);
- return true;
- }
- memcache_flush(NULL, GENCACHE_RAM);
- cache_notrans_seqnum = current_seqnum;
+ ret = tdb_chainlock(cache_notrans->tdb, key);
+ if (ret != 0) {
+ return false;
}
- state.is_memcache = false;
-
ret = tdb_parse_record(cache_notrans->tdb, key,
gencache_parse_fn, &state);
if (ret == 0) {
+ tdb_chainunlock(cache_notrans->tdb, key);
return true;
}
+
+ state.copy_to_notrans = true;
+
ret = tdb_parse_record(cache->tdb, key, gencache_parse_fn, &state);
+
+ if ((ret == -1) && (tdb_error(cache->tdb) == TDB_ERR_NOEXIST)) {
+ /*
+ * The record does not exist. Set a delete-marker in
+ * gencache_notrans, so that we don't have to look at
+ * the fcntl-based cache again.
+ */
+ gencache_set(keystr, "", 0);
+ }
+
+ tdb_chainunlock(cache_notrans->tdb, key);
+
return (ret == 0);
}
@@ -735,7 +733,7 @@ static int stabilize_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA val,
return 0;
}
- if (!gencache_pull_timeout((char *)val.dptr, &timeout, NULL)) {
+ if (!gencache_pull_timeout(val.dptr, &timeout, NULL)) {
DEBUG(10, ("Ignoring invalid entry\n"));
return 0;
}
@@ -774,7 +772,7 @@ static int wipe_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA val,
return 0;
}
- ok = gencache_pull_timeout((char *)val.dptr, &timeout, NULL);
+ ok = gencache_pull_timeout(val.dptr, &timeout, NULL);
if (!ok) {
DEBUG(10, ("Ignoring invalid entry\n"));
return 0;
@@ -800,7 +798,7 @@ static int wipe_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA val,
* @param timeout pointer to a time_t that is filled with entry's
* timeout
*
- * @retval true when entry is successfuly fetched
+ * @retval true when entry is successfully fetched
* @retval false for failure
**/
@@ -869,7 +867,7 @@ static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key,
char *keystr;
char *free_key = NULL;
time_t timeout;
- char *endptr;
+ char *payload;
if (tdb_data_cmp(key, last_stabilize_key()) == 0) {
return 0;
@@ -889,10 +887,14 @@ static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key,
}
}
- if (!gencache_pull_timeout((char *)data.dptr, &timeout, &endptr)) {
+ if (!gencache_pull_timeout(data.dptr, &timeout, &payload)) {
+ goto done;
+ }
+
+ if (timeout == 0) {
+ /* delete marker */
goto done;
}
- endptr += 1;
if (fnmatch(state->pattern, keystr, 0) != 0) {
goto done;
@@ -903,8 +905,8 @@ static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key,
keystr, timestring(talloc_tos(), timeout)));
state->fn(keystr,
- data_blob_const(endptr,
- data.dsize - PTR_DIFF(endptr, data.dptr)),
+ data_blob_const(payload,
+ data.dsize - PTR_DIFF(payload, data.dptr)),
timeout, state->private_data);
done:
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index 4a988b9..e2b4eb5 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -792,7 +792,7 @@ static int catia_chflags(struct vfs_handle_struct *handle,
static NTSTATUS
catia_streaminfo(struct vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *path,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *_num_streams,
struct stream_struct **_streams)
@@ -800,22 +800,35 @@ catia_streaminfo(struct vfs_handle_struct *handle,
char *mapped_name = NULL;
NTSTATUS status;
int i;
+ struct smb_filename *catia_smb_fname = NULL;
unsigned int num_streams = 0;
struct stream_struct *streams = NULL;
*_num_streams = 0;
*_streams = NULL;
- status = catia_string_replace_allocate(handle->conn, path,
- &mapped_name, vfs_translate_to_unix);
+ status = catia_string_replace_allocate(handle->conn,
+ smb_fname->base_name,
+ &mapped_name,
+ vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return status;
}
- status = SMB_VFS_NEXT_STREAMINFO(handle, fsp, mapped_name,
+ catia_smb_fname = synthetic_smb_fname(talloc_tos(),
+ mapped_name,
+ NULL,
+ NULL);
+ if (catia_smb_fname == NULL) {
+ TALLOC_FREE(mapped_name);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = SMB_VFS_NEXT_STREAMINFO(handle, fsp, catia_smb_fname,
mem_ctx, &num_streams, &streams);
TALLOC_FREE(mapped_name);
+ TALLOC_FREE(catia_smb_fname);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 4de965e..ee9ddb2 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -2186,7 +2186,7 @@ static struct file_id vfswrap_file_id_create(struct vfs_handle_struct *handle,
static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *pnum_streams,
struct stream_struct **pstreams)
@@ -2206,17 +2206,18 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
ret = SMB_VFS_FSTAT(fsp, &sbuf);
}
else {
- struct smb_filename smb_fname;
+ struct smb_filename smb_fname_cp;
- ZERO_STRUCT(smb_fname);
- smb_fname.base_name = discard_const_p(char, fname);
+ ZERO_STRUCT(smb_fname_cp);
+ smb_fname_cp.base_name = discard_const_p(char,
+ smb_fname->base_name);
if (lp_posix_pathnames()) {
- ret = SMB_VFS_LSTAT(handle->conn, &smb_fname);
+ ret = SMB_VFS_LSTAT(handle->conn, &smb_fname_cp);
} else {
- ret = SMB_VFS_STAT(handle->conn, &smb_fname);
+ ret = SMB_VFS_STAT(handle->conn, &smb_fname_cp);
}
- sbuf = smb_fname.st;
+ sbuf = smb_fname_cp.st;
}
if (ret == -1) {
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index 73b5f3a..0c74286 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -3168,24 +3168,18 @@ exit:
static NTSTATUS fruit_streaminfo(vfs_handle_struct *handle,
struct files_struct *fsp,
- const char *fname,
+ const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
unsigned int *pnum_streams,
struct stream_struct **pstreams)
{
struct fruit_config_data *config = NULL;
- struct smb_filename *smb_fname = NULL;
--
Samba Shared Repository
More information about the samba-cvs
mailing list