[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha7-2261-gef55c2b
Tim Prouty
tprouty at samba.org
Thu Jun 11 18:04:27 GMT 2009
The branch, master has been updated
via ef55c2bd91181d896e0a4d05b72e9da8bfb7b915 (commit)
via 62f36b163df76b36e7c58471748a1fbb6307270c (commit)
via 3950675bbddfc32529a4f6f7ea6e4be557f38a8f (commit)
via 6eadb8a2855c729e742c72afcc9585adccc7bb12 (commit)
from cc216340a61d1d48a2b9844f66061b59c674465b (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit ef55c2bd91181d896e0a4d05b72e9da8bfb7b915
Author: Tim Prouty <tprouty at samba.org>
Date: Thu Jun 11 10:30:29 2009 -0700
s3 passdb ads: add missing character
commit 62f36b163df76b36e7c58471748a1fbb6307270c
Author: Tim Prouty <tprouty at samba.org>
Date: Wed Jun 10 19:49:31 2009 -0700
s3: Prepare the rename path for passing smb_filename to SMB_VFS_CREATE_FILE
commit 3950675bbddfc32529a4f6f7ea6e4be557f38a8f
Author: Tim Prouty <tprouty at samba.org>
Date: Wed Jun 10 16:08:34 2009 -0700
s3: Prepare the do_unlink path for passing smb_filname to SMB_VFS_CREATE_FILE
commit 6eadb8a2855c729e742c72afcc9585adccc7bb12
Author: Tim Prouty <tprouty at samba.org>
Date: Wed Jun 10 16:02:00 2009 -0700
s3: refactor utility function to handle splitting the directory from the mask
-----------------------------------------------------------------------
Summary of changes:
source3/passdb/pdb_ads.c | 2 +-
source3/smbd/reply.c | 434 ++++++++++++++++++++++++++--------------------
2 files changed, 246 insertions(+), 190 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c
index c2f1e20..9494915 100644
--- a/source3/passdb/pdb_ads.c
+++ b/source3/passdb/pdb_ads.c
@@ -1438,7 +1438,7 @@ static NTSTATUS pdb_ads_enum_alias_memberships(struct pdb_methods *m,
goto done;
}
- rc = tldap_search_fmt(state->ld, state->domaindn, LDAP_SCOPE_SUB,
+ rc = tldap_search_fmt(state->ld, state->domaindn, TLDAP_SCOPE_SUB,
attrs, ARRAY_SIZE(attrs), 0, talloc_tos(),
&msg, "%s))", filter);
TALLOC_FREE(filter);
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index f91a3c7..3db11b9 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.
@@ -2385,10 +2417,10 @@ static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
static NTSTATUS do_unlink(connection_struct *conn,
struct smb_request *req,
- const char *fname,
+ struct smb_filename *smb_fname,
uint32 dirtype)
{
- SMB_STRUCT_STAT sbuf;
+ char *fname = NULL;
uint32 fattr;
files_struct *fsp;
uint32 dirtype_orig = dirtype;
@@ -2400,11 +2432,16 @@ static NTSTATUS do_unlink(connection_struct *conn,
return NT_STATUS_MEDIA_WRITE_PROTECTED;
}
- if (SMB_VFS_LSTAT(conn,fname,&sbuf) != 0) {
+ status = get_full_smb_filename(smb_fname, smb_fname, &fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ if (SMB_VFS_LSTAT(conn, fname, &smb_fname->st) != 0) {
return map_nt_error_from_unix(errno);
}
- fattr = dos_mode(conn,fname,&sbuf);
+ fattr = dos_mode(conn, fname, &smb_fname->st);
if (dirtype & FILE_ATTRIBUTE_NORMAL) {
dirtype = aDIR|aARCH|aRONLY;
@@ -2495,7 +2532,7 @@ static NTSTATUS do_unlink(connection_struct *conn,
NULL, /* ea_list */
&fsp, /* result */
NULL, /* pinfo */
- &sbuf); /* psbuf */
+ &smb_fname->st); /* psbuf */
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("SMB_VFS_CREATEFILE failed: %s\n",
@@ -2521,39 +2558,23 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
uint32 dirtype, const char *name_in, bool has_wild)
{
struct smb_filename *smb_fname = NULL;
- const char *directory = NULL;
- char *mask = NULL;
- char *name = NULL;
- char *p = NULL;
+ char *fname_dir = NULL;
+ char *fname_mask = NULL;
int count=0;
NTSTATUS status = NT_STATUS_OK;
- SMB_STRUCT_STAT st;
TALLOC_CTX *ctx = talloc_tos();
status = unix_convert(ctx, conn, name_in, &smb_fname,
has_wild ? UCF_ALLOW_WCARD_LCOMP : 0);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto out;
}
- status = get_full_smb_filename(ctx, smb_fname, &name);
+ /* Split up the directory from the filename/mask. */
+ status = split_fname_dir_mask(ctx, smb_fname->base_name,
+ &fname_dir, &fname_mask);
if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(smb_fname);
- return status;
- }
-
- p = strrchr_m(name,'/');
- if (!p) {
- directory = talloc_strdup(ctx, ".");
- if (!directory) {
- TALLOC_FREE(smb_fname);
- return NT_STATUS_NO_MEMORY;
- }
- mask = name;
- } else {
- *p = 0;
- directory = name;
- mask = p+1;
+ goto out;
}
/*
@@ -2565,38 +2586,44 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
* Tine Smukavec <valentin.smukavec at hermes.si>.
*/
- if (!VALID_STAT(smb_fname->st) && mangle_is_mangled(mask,conn->params)) {
+ if (!VALID_STAT(smb_fname->st) &&
+ mangle_is_mangled(fname_mask, conn->params)) {
char *new_mask = NULL;
- mangle_lookup_name_from_8_3(ctx,
- mask,
- &new_mask,
- conn->params );
+ mangle_lookup_name_from_8_3(ctx, fname_mask,
+ &new_mask, conn->params);
if (new_mask) {
- mask = new_mask;
+ TALLOC_FREE(fname_mask);
+ fname_mask = new_mask;
}
}
- TALLOC_FREE(smb_fname);
if (!has_wild) {
- directory = talloc_asprintf(ctx,
- "%s/%s",
- directory,
- mask);
- if (!directory) {
- return NT_STATUS_NO_MEMORY;
+
+ /*
+ * Only one file needs to be unlinked. Append the mask back
+ * onto the directory.
+ */
+ TALLOC_FREE(smb_fname->base_name);
+ smb_fname->base_name = talloc_asprintf(smb_fname,
+ "%s/%s",
+ fname_dir,
+ fname_mask);
+ if (!smb_fname->base_name) {
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
}
if (dirtype == 0) {
dirtype = FILE_ATTRIBUTE_NORMAL;
}
- status = check_name(conn, directory);
+ status = check_name(conn, smb_fname->base_name);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto out;
}
- status = do_unlink(conn, req, directory, dirtype);
+ status = do_unlink(conn, req, smb_fname, dirtype);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto out;
}
count++;
@@ -2606,23 +2633,29 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
const char *dname;
if ((dirtype & SAMBA_ATTRIBUTES_MASK) == aDIR) {
- return NT_STATUS_OBJECT_NAME_INVALID;
+ status = NT_STATUS_OBJECT_NAME_INVALID;
+ goto out;
}
- if (strequal(mask,"????????.???")) {
- mask[0] = '*';
- mask[1] = '\0';
+ if (strequal(fname_mask,"????????.???")) {
+ TALLOC_FREE(fname_mask);
+ fname_mask = talloc_strdup(ctx, "*");
+ if (!fname_mask) {
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
+ }
}
- status = check_name(conn, directory);
+ status = check_name(conn, fname_dir);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto out;
}
- dir_hnd = OpenDir(talloc_tos(), conn, directory, mask,
+ dir_hnd = OpenDir(talloc_tos(), conn, fname_dir, fname_mask,
dirtype);
if (dir_hnd == NULL) {
- return map_nt_error_from_unix(errno);
+ status = map_nt_error_from_unix(errno);
+ goto out;
}
/* XXXX the CIFS spec says that if bit0 of the flags2 field is set then
@@ -2632,12 +2665,10 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
status = NT_STATUS_NO_SUCH_FILE;
- while ((dname = ReadDirName(dir_hnd, &offset, &st))) {
- char *fname = NULL;
-
- if (!is_visible_file(conn, directory, dname, &st,
- true))
- {
+ while ((dname = ReadDirName(dir_hnd, &offset,
+ &smb_fname->st))) {
+ if (!is_visible_file(conn, fname_dir, dname,
+ &smb_fname->st, true)) {
continue;
}
@@ -2646,34 +2677,36 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
continue;
}
- if(!mask_match(dname, mask, conn->case_sensitive)) {
+ if(!mask_match(dname, fname_mask,
+ conn->case_sensitive)) {
continue;
}
- fname = talloc_asprintf(ctx, "%s/%s",
- directory,
- dname);
- if (!fname) {
- return NT_STATUS_NO_MEMORY;
+ TALLOC_FREE(smb_fname->base_name);
+ smb_fname->base_name =
+ talloc_asprintf(smb_fname, "%s/%s",
+ fname_dir, dname);
+
+ if (!smb_fname->base_name) {
+ TALLOC_FREE(dir_hnd);
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
}
- status = check_name(conn, fname);
+ status = check_name(conn, smb_fname->base_name);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(dir_hnd);
- return status;
+ goto out;
}
- status = do_unlink(conn, req, fname, dirtype);
+ status = do_unlink(conn, req, smb_fname, dirtype);
if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(fname);
continue;
}
count++;
DEBUG(3,("unlink_internals: successful unlink [%s]\n",
- fname));
-
- TALLOC_FREE(fname);
+ smb_fname->base_name));
}
TALLOC_FREE(dir_hnd);
}
@@ -2682,6 +2715,10 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
status = map_nt_error_from_unix(errno);
}
+ out:
+ TALLOC_FREE(smb_fname);
+ TALLOC_FREE(fname_dir);
+ TALLOC_FREE(fname_mask);
return status;
}
@@ -5989,13 +6026,10 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
bool dest_has_wild,
uint32_t access_mask)
{
- struct smb_filename *smb_fname = NULL;
- struct smb_filename *smb_fname_new = NULL;
- char *directory = NULL;
- char *mask = NULL;
- char *name = NULL;
- char *newname = NULL;
- char *p;
+ struct smb_filename *smb_fname_src = NULL;
+ struct smb_filename *smb_fname_dst = NULL;
+ char *fname_src_dir = NULL;
+ char *fname_src_mask = NULL;
int count=0;
NTSTATUS status = NT_STATUS_OK;
struct smb_Dir *dir_hnd = NULL;
@@ -6004,29 +6038,19 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
int create_options = 0;
bool posix_pathnames = lp_posix_pathnames();
- status = unix_convert(ctx, conn, name_in, &smb_fname,
+ status = unix_convert(ctx, conn, name_in, &smb_fname_src,
src_has_wild ? UCF_ALLOW_WCARD_LCOMP : 0);
if (!NT_STATUS_IS_OK(status)) {
goto out;
}
- status = get_full_smb_filename(ctx, smb_fname, &name);
- if (!NT_STATUS_IS_OK(status)) {
- goto out;
- }
-
- status = unix_convert(ctx, conn, newname_in, &smb_fname_new,
+ status = unix_convert(ctx, conn, newname_in, &smb_fname_dst,
(UCF_SAVE_LCOMP |
(dest_has_wild ? UCF_ALLOW_WCARD_LCOMP : 0)));
if (!NT_STATUS_IS_OK(status)) {
goto out;
}
- status = get_full_smb_filename(ctx, smb_fname_new, &newname);
- if (!NT_STATUS_IS_OK(status)) {
- goto out;
- }
-
/*
* Split the old name into directory and last component
* strings. Note that unix_convert may have stripped off a
@@ -6036,23 +6060,12 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
* as this is checked in resolve_wildcards().
*/
- p = strrchr_m(name,'/');
- if (!p) {
- directory = talloc_strdup(ctx, ".");
- if (!directory) {
- status = NT_STATUS_NO_MEMORY;
- goto out;
- }
- mask = name;
- } else {
- *p = 0;
- directory = talloc_strdup(ctx, name);
- if (!directory) {
- status = NT_STATUS_NO_MEMORY;
- goto out;
- }
- mask = p+1;
- *p = '/'; /* Replace needed for exceptional test below. */
+ /* Split up the directory from the filename/mask. */
+ status = split_fname_dir_mask(ctx, smb_fname_src->base_name,
+ &fname_src_dir, &fname_src_mask);
+ if (!NT_STATUS_IS_OK(status)) {
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
}
/*
@@ -6064,41 +6077,47 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
* Tine Smukavec <valentin.smukavec at hermes.si>.
*/
- if (!VALID_STAT(smb_fname->st) && mangle_is_mangled(mask, conn->params)) {
+ if (!VALID_STAT(smb_fname_src->st) &&
+ mangle_is_mangled(fname_src_mask, conn->params)) {
char *new_mask = NULL;
- mangle_lookup_name_from_8_3(ctx,
- mask,
- &new_mask,
- conn->params );
+ mangle_lookup_name_from_8_3(ctx, fname_src_mask, &new_mask,
+ conn->params);
if (new_mask) {
- mask = new_mask;
+ TALLOC_FREE(fname_src_mask);
+ fname_src_mask = new_mask;
}
}
if (!src_has_wild) {
files_struct *fsp;
+ char *fname_src = NULL;
+ char *fname_dst = NULL;
/*
- * No wildcards - just process the one file.
+ * Only one file needs to be renamied. Append the mask back
+ * onto the directory.
*/
- /* Add a terminating '/' to the directory name. */
- directory = talloc_asprintf_append(directory,
- "/%s",
- mask);
- if (!directory) {
+ TALLOC_FREE(smb_fname_src->base_name);
+ smb_fname_src->base_name = talloc_asprintf(smb_fname_src,
+ "%s/%s",
+ fname_src_dir,
+ fname_src_mask);
+ if (!smb_fname_src->base_name) {
status = NT_STATUS_NO_MEMORY;
goto out;
}
- /* Ensure newname contains a '/' also */
- if(strrchr_m(newname,'/') == 0) {
- newname = talloc_asprintf(ctx,
- "./%s",
- newname);
- if (!newname) {
+ /* Ensure dst fname contains a '/' also */
+ if(strrchr_m(smb_fname_dst->base_name, '/') == 0) {
+ char *tmp;
+ tmp = talloc_asprintf(smb_fname_dst, "./%s",
+ smb_fname_dst->base_name);
+ if (!tmp) {
status = NT_STATUS_NO_MEMORY;
goto out;
}
+ TALLOC_FREE(smb_fname_dst->base_name);
+ smb_fname_dst->base_name = tmp;
}
DEBUG(3, ("rename_internals: case_sensitive = %d, "
@@ -6106,32 +6125,41 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
"directory = %s, newname = %s, "
"last_component_dest = %s\n",
conn->case_sensitive, conn->case_preserve,
- conn->short_case_preserve, directory,
- newname, smb_fname_new->original_lcomp));
+ conn->short_case_preserve, smb_fname_src->base_name,
+ smb_fname_dst->base_name,
+ smb_fname_dst->original_lcomp));
/* The dest name still may have wildcards. */
if (dest_has_wild) {
- char *mod_newname = NULL;
- if (!resolve_wildcards(ctx,
- directory,newname,&mod_newname)) {
+ char *fname_dst_mod = NULL;
+ if (!resolve_wildcards(smb_fname_dst,
+ smb_fname_src->base_name,
+ smb_fname_dst->base_name,
+ &fname_dst_mod)) {
DEBUG(6, ("rename_internals: resolve_wildcards "
- "%s %s failed\n",
- directory,
- newname));
+ "%s %s failed\n",
+ smb_fname_src->base_name,
+ smb_fname_dst->base_name));
status = NT_STATUS_NO_MEMORY;
goto out;
}
- newname = mod_newname;
+ TALLOC_FREE(smb_fname_dst->base_name);
--
Samba Shared Repository
More information about the samba-cvs
mailing list