[SCM] Samba Shared Repository - branch v3-4-test updated -
release-4-0-0alpha7-1037-gbfe7383
Tim Prouty
tprouty at samba.org
Tue May 19 05:27:01 GMT 2009
The branch, v3-4-test has been updated
via bfe7383d7f0349fec796d04772d42d566f7f083b (commit)
from 52d26c3a3a8914a608d8b318e01fee636cc83042 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test
- Log -----------------------------------------------------------------
commit bfe7383d7f0349fec796d04772d42d566f7f083b
Author: Aravind Srinivasan <aravind.srinivasan at isilon.com>
Date: Mon May 11 22:39:05 2009 +0000
s3: Always allocate memory in dptr_ReadDirName
This is a follow up to 69d61453df6019caef4e7960fa78c6a3c51f3d2a to
adjust the API to allow the lower layers allocate memory. Now the
memory can explicitly be freed rather than relying on talloc_tos().
Signed-off-by: Tim Prouty <tprouty at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/include/proto.h | 2 +-
source3/smbd/dir.c | 39 ++++++++++++++++++++++++++-------------
source3/smbd/trans2.c | 22 ++++++++++++++++++----
3 files changed, 45 insertions(+), 18 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 38e1bf8..923dd7c 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6226,7 +6226,7 @@ void dptr_SeekDir(struct dptr_struct *dptr, long offset);
long dptr_TellDir(struct dptr_struct *dptr);
bool dptr_has_wild(struct dptr_struct *dptr);
int dptr_dnum(struct dptr_struct *dptr);
-const char *dptr_ReadDirName(TALLOC_CTX *ctx,
+char *dptr_ReadDirName(TALLOC_CTX *ctx,
struct dptr_struct *dptr,
long *poffset,
SMB_STRUCT_STAT *pst);
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index e790287..ab4a0d2 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -569,7 +569,7 @@ static const char *dptr_normal_ReadDirName(struct dptr_struct *dptr,
Return the next visible file name, skipping veto'd and invisible files.
****************************************************************************/
-const char *dptr_ReadDirName(TALLOC_CTX *ctx,
+char *dptr_ReadDirName(TALLOC_CTX *ctx,
struct dptr_struct *dptr,
long *poffset,
SMB_STRUCT_STAT *pst)
@@ -578,11 +578,14 @@ const char *dptr_ReadDirName(TALLOC_CTX *ctx,
char *pathreal = NULL;
char *found_name = NULL;
int ret;
+ const char *name_temp = NULL;
SET_STAT_INVALID(*pst);
if (dptr->has_wild || dptr->did_stat) {
- return dptr_normal_ReadDirName(dptr, poffset, pst);
+ name_temp = dptr_normal_ReadDirName(dptr, poffset, pst);
+ name = talloc_strdup(ctx, name_temp);
+ return name;
}
/* If poffset is -1 then we know we returned this name before and we
@@ -610,7 +613,7 @@ const char *dptr_ReadDirName(TALLOC_CTX *ctx,
}
if (VALID_STAT(*pst)) {
- name = dptr->wcard;
+ name = talloc_strdup(ctx, dptr->wcard);
goto ret;
}
@@ -622,13 +625,13 @@ const char *dptr_ReadDirName(TALLOC_CTX *ctx,
return NULL;
if (SMB_VFS_STAT(dptr->conn, pathreal, pst) == 0) {
- name = dptr->wcard;
+ name = talloc_strdup(ctx, dptr->wcard);
goto clean;
} else {
/* If we get any other error than ENOENT or ENOTDIR
then the file exists we just can't stat it. */
if (errno != ENOENT && errno != ENOTDIR) {
- name = dptr->wcard;
+ name = talloc_strdup(ctx, dptr->wcard);
goto clean;
}
}
@@ -659,7 +662,9 @@ const char *dptr_ReadDirName(TALLOC_CTX *ctx,
TALLOC_FREE(pathreal);
- return dptr_normal_ReadDirName(dptr, poffset, pst);
+ name_temp = dptr_normal_ReadDirName(dptr, poffset, pst);
+ name = talloc_strdup(ctx, name_temp);
+ return name;
clean:
TALLOC_FREE(pathreal);
@@ -823,11 +828,11 @@ bool get_dir_entry(TALLOC_CTX *ctx,
bool check_descend,
bool ask_sharemode)
{
- const char *dname = NULL;
+ char *dname = NULL;
bool found = False;
SMB_STRUCT_STAT sbuf;
char *pathreal = NULL;
- const char *filename = NULL;
+ char *filename = NULL;
bool needslash;
*pp_fname_out = NULL;
@@ -863,9 +868,13 @@ bool get_dir_entry(TALLOC_CTX *ctx,
if (!mangle_is_8_3(filename, False, conn->params)) {
if (!name_to_8_3(filename,mname,False,
conn->params)) {
+ TALLOC_FREE(filename);
continue;
}
- filename = mname;
+ filename = talloc_strdup(ctx, mname);
+ if (!filename) {
+ return False;
+ }
}
if (needslash) {
@@ -880,6 +889,7 @@ bool get_dir_entry(TALLOC_CTX *ctx,
dname);
}
if (!pathreal) {
+ TALLOC_FREE(filename);
return False;
}
@@ -887,6 +897,7 @@ bool get_dir_entry(TALLOC_CTX *ctx,
DEBUG(5,("Couldn't stat 1 [%s]. Error = %s\n",
pathreal, strerror(errno) ));
TALLOC_FREE(pathreal);
+ TALLOC_FREE(filename);
continue;
}
@@ -895,6 +906,7 @@ bool get_dir_entry(TALLOC_CTX *ctx,
if (!dir_check_ftype(conn,*mode,dirtype)) {
DEBUG(5,("[%s] attribs 0x%x didn't match 0x%x\n",filename,(unsigned int)*mode,(unsigned int)dirtype));
TALLOC_FREE(pathreal);
+ TALLOC_FREE(filename);
continue;
}
@@ -921,14 +933,15 @@ bool get_dir_entry(TALLOC_CTX *ctx,
found = True;
- *pp_fname_out = talloc_strdup(ctx, filename);
- if (!*pp_fname_out) {
- return False;
- }
+ SMB_ASSERT(filename != NULL);
+ *pp_fname_out = filename;
DirCacheAdd(conn->dirptr->dir_hnd, dname, curoff);
TALLOC_FREE(pathreal);
}
+
+ if (!found)
+ TALLOC_FREE(filename);
}
return(found);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 95051e4..3a28a87 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -1236,12 +1236,12 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
int *last_entry_off,
struct ea_list *name_list)
{
- const char *dname;
+ char *dname;
bool found = False;
SMB_STRUCT_STAT sbuf;
const char *mask = NULL;
char *pathreal = NULL;
- const char *fname = NULL;
+ char *fname = NULL;
char *p, *q, *pdata = *ppdata;
uint32 reskey=0;
long prev_dirpos=0;
@@ -1317,9 +1317,13 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
/* Mangle fname if it's an illegal name. */
if (mangle_must_mangle(dname,conn->params)) {
if (!name_to_8_3(dname,mangled_name,True,conn->params)) {
+ TALLOC_FREE(fname);
continue; /* Error - couldn't mangle. */
}
- fname = mangled_name;
+ fname = talloc_strdup(ctx, mangled_name);
+ if (!fname) {
+ return False;
+ }
}
if(!(got_match = *got_exact_match = exact_match(conn, fname, mask))) {
@@ -1336,6 +1340,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
*/
/* Force the mangling into 8.3. */
if (!name_to_8_3( fname, mangled_name, False, conn->params)) {
+ TALLOC_FREE(fname);
continue; /* Error - couldn't mangle. */
}
@@ -1348,6 +1353,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
bool isdots = (ISDOT(dname) || ISDOTDOT(dname));
if (dont_descend && !isdots) {
+ TALLOC_FREE(fname);
continue;
}
@@ -1365,6 +1371,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
}
if (!pathreal) {
+ TALLOC_FREE(fname);
return False;
}
@@ -1373,6 +1380,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
DEBUG(5,("get_lanman2_dir_entry:Couldn't lstat [%s] (%s)\n",
pathreal,strerror(errno)));
TALLOC_FREE(pathreal);
+ TALLOC_FREE(fname);
continue;
}
} else if (!VALID_STAT(sbuf) && SMB_VFS_STAT(conn,pathreal,&sbuf) != 0) {
@@ -1384,6 +1392,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
DEBUG(5,("get_lanman2_dir_entry:Couldn't stat [%s] (%s)\n",
pathreal,strerror(errno)));
TALLOC_FREE(pathreal);
+ TALLOC_FREE(fname);
continue;
}
}
@@ -1397,6 +1406,7 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
if (!dir_check_ftype(conn,mode,dirtype)) {
DEBUG(5,("get_lanman2_dir_entry: [%s] attribs didn't match %x\n",fname,dirtype));
TALLOC_FREE(pathreal);
+ TALLOC_FREE(fname);
continue;
}
@@ -1438,6 +1448,9 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
dptr_DirCacheAdd(conn->dirptr, dname, curr_dirpos);
}
+
+ if (!found)
+ TALLOC_FREE(fname);
}
p = pdata;
@@ -1831,10 +1844,11 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
break;
default:
+ TALLOC_FREE(fname);
return(False);
}
-
+ TALLOC_FREE(fname);
if (PTR_DIFF(p,pdata) > space_remaining) {
/* Move the dirptr back to prev_dirpos */
dptr_SeekDir(conn->dirptr, prev_dirpos);
--
Samba Shared Repository
More information about the samba-cvs
mailing list