diff options
-rw-r--r-- | source3/smbd/reply.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index f91a3c7550..830cfca592 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1327,6 +1327,38 @@ void reply_dskattr(struct smb_request *req) return; } +/* + * Utility function to split the filename from the directory. + */ +static NTSTATUS split_fname_dir_mask(TALLOC_CTX *ctx, const char *fname_in, + char **fname_dir_out, + char **fname_mask_out) +{ + const char *p = NULL; + char *fname_dir = NULL; + char *fname_mask = NULL; + + p = strrchr_m(fname_in, '/'); + if (!p) { + fname_dir = talloc_strdup(ctx, "."); + fname_mask = talloc_strdup(ctx, fname_in); + } else { + fname_dir = talloc_strndup(ctx, fname_in, + PTR_DIFF(p, fname_in)); + fname_mask = talloc_strdup(ctx, p+1); + } + + if (!fname_dir || !fname_mask) { + TALLOC_FREE(fname_dir); + TALLOC_FREE(fname_mask); + return NT_STATUS_NO_MEMORY; + } + + *fname_dir_out = fname_dir; + *fname_mask_out = fname_mask; + return NT_STATUS_OK; +} + /**************************************************************************** Reply to a search. Can be called from SMBsearch, SMBffirst or SMBfunique. @@ -6727,17 +6759,9 @@ void reply_copy(struct smb_request *req) } /* Split up the directory from the filename/mask. */ - p = strrchr_m(smb_fname_src->base_name,'/'); - if (p != NULL) { - fname_src_dir = talloc_strndup(ctx, smb_fname_src->base_name, - PTR_DIFF(p, smb_fname_src->base_name)); - fname_src_mask = talloc_strdup(ctx, p+1); - } else { - fname_src_dir = talloc_strdup(ctx, "./"); - fname_src_mask = talloc_strdup(ctx, smb_fname_src->base_name); - } - - if (!fname_src_dir || !fname_src_mask) { + status = split_fname_dir_mask(ctx, smb_fname_src->base_name, + &fname_src_dir, &fname_src_mask); + if (!NT_STATUS_IS_OK(status)) { reply_nterror(req, NT_STATUS_NO_MEMORY); goto out; } |