summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/include/smb.h4
-rw-r--r--source3/include/vfs.h4
-rw-r--r--source3/modules/vfs_cacheprime.c2
-rw-r--r--source3/modules/vfs_commit.c2
-rw-r--r--source3/modules/vfs_prealloc.c2
-rw-r--r--source3/modules/vfs_streams_xattr.c3
-rw-r--r--source3/smbd/vfs.c8
8 files changed, 20 insertions, 9 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index e5dbe60e11..1a1f8bef69 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -7317,7 +7317,9 @@ void sys_utmp_claim(const char *username, const char *hostname,
NTSTATUS smb_register_vfs(int version, const char *name, const vfs_op_tuple *vfs_op_tuples);
bool vfs_init_custom(connection_struct *conn, const char *vfs_object);
-void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp, size_t ext_size);
+void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
+ files_struct *fsp, size_t ext_size,
+ void (*destroy_fn)(void *p_data));
void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 3da63cfc2b..100ec21031 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -373,7 +373,9 @@ struct rpc_cli_smbd_conn;
struct vfs_fsp_data {
struct vfs_fsp_data *next;
struct vfs_handle_struct *owner;
- /* NOTE: This structure contains two pointers so that we can guarantee
+ void (*destroy)(void *p_data);
+ void *_dummy_;
+ /* NOTE: This structure contains four pointers so that we can guarantee
* that the end of the structure is always both 4-byte and 8-byte aligned.
*/
};
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index e9115ab807..228f090600 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -679,8 +679,8 @@ typedef struct vfs_statvfs_struct {
/* Add a new FSP extension of the given type. Returns a pointer to the
* extenstion data.
*/
-#define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \
- vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type))
+#define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \
+ vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
/* Return a pointer to the existing FSP extension data. */
#define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
diff --git a/source3/modules/vfs_cacheprime.c b/source3/modules/vfs_cacheprime.c
index fed051ca8d..71b850505a 100644
--- a/source3/modules/vfs_cacheprime.c
+++ b/source3/modules/vfs_cacheprime.c
@@ -54,7 +54,7 @@ static bool prime_cache(
SMB_OFF_T * last;
ssize_t nread;
- last = (SMB_OFF_T *)VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T);
+ last = (SMB_OFF_T *)VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T, NULL);
if (!last) {
return False;
}
diff --git a/source3/modules/vfs_commit.c b/source3/modules/vfs_commit.c
index 1cef6d0243..a8105e021e 100644
--- a/source3/modules/vfs_commit.c
+++ b/source3/modules/vfs_commit.c
@@ -190,7 +190,7 @@ static int commit_open(
MODULE, "eof mode", "none");
if (dthresh > 0 || !strequal(eof_mode, "none")) {
- c = VFS_ADD_FSP_EXTENSION(handle, fsp, struct commit_info);
+ c = VFS_ADD_FSP_EXTENSION(handle, fsp, struct commit_info, NULL);
/* Process main tunables */
if (c) {
c->dthresh = dthresh;
diff --git a/source3/modules/vfs_prealloc.c b/source3/modules/vfs_prealloc.c
index 5a339dbf8d..299f6548a1 100644
--- a/source3/modules/vfs_prealloc.c
+++ b/source3/modules/vfs_prealloc.c
@@ -164,7 +164,7 @@ static int prealloc_open(vfs_handle_struct* handle,
if ((flags & O_CREAT) || (flags & O_TRUNC)) {
SMB_OFF_T * psize;
- psize = VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T);
+ psize = VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T, NULL);
if (psize == NULL || *psize == -1) {
return fd;
}
diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c
index 37473439dd..77ffff5fb5 100644
--- a/source3/modules/vfs_streams_xattr.c
+++ b/source3/modules/vfs_streams_xattr.c
@@ -405,7 +405,8 @@ static int streams_xattr_open(vfs_handle_struct *handle, const char *fname,
}
sio = (struct stream_io *)VFS_ADD_FSP_EXTENSION(handle, fsp,
- struct stream_io);
+ struct stream_io,
+ NULL);
if (sio == NULL) {
errno = ENOMEM;
goto fail;
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index df5a39eea2..515e557f67 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -220,7 +220,9 @@ bool vfs_init_custom(connection_struct *conn, const char *vfs_object)
#define EXT_DATA_AREA(e) ((uint8 *)(e) + sizeof(struct vfs_fsp_data))
-void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp, size_t ext_size)
+void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
+ files_struct *fsp, size_t ext_size,
+ void (*destroy_fn)(void *p_data))
{
struct vfs_fsp_data *ext;
void * ext_data;
@@ -238,6 +240,7 @@ void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp,
ext->owner = handle;
ext->next = fsp->vfs_extension;
+ ext->destroy = destroy_fn;
fsp->vfs_extension = ext;
return EXT_DATA_AREA(ext);
}
@@ -256,6 +259,9 @@ void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp)
} else {
fsp->vfs_extension = curr->next;
}
+ if (curr->destroy) {
+ curr->destroy(EXT_DATA_AREA(curr));
+ }
TALLOC_FREE(curr);
return;
}