summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-11-09 15:59:22 +0100
committerKarolin Seeger <kseeger@samba.org>2011-11-14 20:10:23 +0100
commit798b63addf6aaecbe5b6241975f78103a56b1442 (patch)
tree8e392aa115c02797bd675937279b1dd0e984d4a1
parent785c0741af53cb142fc3ec7e55d999477d44d9bc (diff)
downloadsamba-798b63addf6aaecbe5b6241975f78103a56b1442.tar.gz
samba-798b63addf6aaecbe5b6241975f78103a56b1442.tar.xz
samba-798b63addf6aaecbe5b6241975f78103a56b1442.zip
s3:smbd: fully construct the dptr before allocating a dnum in the bitmap
metze (cherry picked from commit 39bb5a62977261d0926f56b792aacaa5e772ff6f)
-rw-r--r--source3/smbd/dir.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index e6f431eb33e..3430aaba941 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -470,6 +470,31 @@ NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
ZERO_STRUCTP(dptr);
+ dptr->path = SMB_STRDUP(path);
+ if (!dptr->path) {
+ SAFE_FREE(dptr);
+ TALLOC_FREE(dir_hnd);
+ return NT_STATUS_NO_MEMORY;
+ }
+ dptr->conn = conn;
+ dptr->dir_hnd = dir_hnd;
+ dptr->spid = spid;
+ dptr->expect_close = expect_close;
+ dptr->wcard = SMB_STRDUP(wcard);
+ if (!dptr->wcard) {
+ SAFE_FREE(dptr->path);
+ SAFE_FREE(dptr);
+ TALLOC_FREE(dir_hnd);
+ return NT_STATUS_NO_MEMORY;
+ }
+ if (lp_posix_pathnames() || (wcard[0] == '.' && wcard[1] == 0)) {
+ dptr->has_wild = True;
+ } else {
+ dptr->has_wild = wcard_has_wild;
+ }
+
+ dptr->attr = attr;
+
if(old_handle) {
/*
@@ -493,6 +518,8 @@ NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
dptr->dnum = bitmap_find(sconn->searches.dptr_bmap, 0);
if(dptr->dnum == -1 || dptr->dnum > 254) {
DEBUG(0,("dptr_create: returned %d: Error - all old dirptrs in use ?\n", dptr->dnum));
+ SAFE_FREE(dptr->path);
+ SAFE_FREE(dptr->wcard);
SAFE_FREE(dptr);
TALLOC_FREE(dir_hnd);
return NT_STATUS_TOO_MANY_OPENED_FILES;
@@ -523,6 +550,8 @@ NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
if(dptr->dnum == -1 || dptr->dnum < 255) {
DEBUG(0,("dptr_create: returned %d: Error - all new dirptrs in use ?\n", dptr->dnum));
+ SAFE_FREE(dptr->path);
+ SAFE_FREE(dptr->wcard);
SAFE_FREE(dptr);
TALLOC_FREE(dir_hnd);
return NT_STATUS_TOO_MANY_OPENED_FILES;
@@ -534,33 +563,6 @@ NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
dptr->dnum += 1; /* Always bias the dnum by one - no zero dnums allowed. */
- dptr->path = SMB_STRDUP(path);
- if (!dptr->path) {
- bitmap_clear(sconn->searches.dptr_bmap, dptr->dnum - 1);
- SAFE_FREE(dptr);
- TALLOC_FREE(dir_hnd);
- return NT_STATUS_NO_MEMORY;
- }
- dptr->conn = conn;
- dptr->dir_hnd = dir_hnd;
- dptr->spid = spid;
- dptr->expect_close = expect_close;
- dptr->wcard = SMB_STRDUP(wcard);
- if (!dptr->wcard) {
- bitmap_clear(sconn->searches.dptr_bmap, dptr->dnum - 1);
- SAFE_FREE(dptr->path);
- SAFE_FREE(dptr);
- TALLOC_FREE(dir_hnd);
- return NT_STATUS_NO_MEMORY;
- }
- if (lp_posix_pathnames() || (wcard[0] == '.' && wcard[1] == 0)) {
- dptr->has_wild = True;
- } else {
- dptr->has_wild = wcard_has_wild;
- }
-
- dptr->attr = attr;
-
DLIST_ADD(sconn->searches.dirptrs, dptr);
DEBUG(3,("creating new dirptr %d for path %s, expect_close = %d\n",