diff options
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/filename_util.c | 39 |
2 files changed, 41 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 00a9a69d73..2ebd14b59d 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1611,6 +1611,8 @@ const char *fsp_fnum_dbg(const struct files_struct *fsp); NTSTATUS copy_smb_filename(TALLOC_CTX *ctx, const struct smb_filename *smb_fname_in, struct smb_filename **smb_fname_out); +struct smb_filename *cp_smb_filename(TALLOC_CTX *mem_ctx, + const struct smb_filename *in); bool is_ntfs_stream_smb_fname(const struct smb_filename *smb_fname); bool is_ntfs_default_stream_smb_fname(const struct smb_filename *smb_fname); diff --git a/source3/lib/filename_util.c b/source3/lib/filename_util.c index 9a6ab2b34a..67fa1a98f2 100644 --- a/source3/lib/filename_util.c +++ b/source3/lib/filename_util.c @@ -161,6 +161,45 @@ const char *fsp_fnum_dbg(const struct files_struct *fsp) return str; } +struct smb_filename *cp_smb_filename(TALLOC_CTX *mem_ctx, + const struct smb_filename *in) +{ + struct smb_filename *out; + + /* stream_name must always be NULL if there is no stream. */ + if (in->stream_name) { + SMB_ASSERT(in->stream_name[0] != '\0'); + } + + out = talloc_zero(mem_ctx, struct smb_filename); + if (out == NULL) { + return NULL; + } + if (in->base_name != NULL) { + out->base_name = talloc_strdup(out, in->base_name); + if (out->base_name == NULL) { + goto fail; + } + } + if (in->stream_name != NULL) { + out->stream_name = talloc_strdup(out, in->stream_name); + if (out->stream_name == NULL) { + goto fail; + } + } + if (in->original_lcomp != NULL) { + out->original_lcomp = talloc_strdup(out, in->original_lcomp); + if (out->original_lcomp == NULL) { + goto fail; + } + } + out->st = in->st; + return out; +fail: + TALLOC_FREE(out); + return NULL; +} + NTSTATUS copy_smb_filename(TALLOC_CTX *ctx, const struct smb_filename *smb_fname_in, struct smb_filename **smb_fname_out) |