diff options
author | Volker Lendecke <vlendec@samba.org> | 2005-08-24 13:15:01 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:01:14 -0500 |
commit | fa2ec3651ec88777930e478c888096907006fd8b (patch) | |
tree | 5011bf1512812ee43e23dd31d3ba0142847e3000 | |
parent | e2a5b7da6a10e54a8ab8b41b64544794aaddbeb4 (diff) | |
download | samba-fa2ec3651ec88777930e478c888096907006fd8b.tar.gz samba-fa2ec3651ec88777930e478c888096907006fd8b.tar.bz2 samba-fa2ec3651ec88777930e478c888096907006fd8b.zip |
r9584: Fix a race condition in Samba 3. If two files are opened simultaneously with
NTCREATEX_DISP_CREATE (create if not exists, else fail) they might end up with
two or more times NT_STATUS_OK as EEXIST is not correctly handled.
Jeremy, please look closely at this. You can easily verify this by adding a
smb_msleep(100) to the top of open_file_ntcreate and run the new samba4
torture test. It does also happen without the msleep, but not as reliably.
Thanks,
Volker
(This used to be commit 58b9e48df03098160f39607d869a3c8e10860ba4)
-rw-r--r-- | source3/smbd/open.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 3cd553f55b..98c2997a97 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -1585,6 +1585,15 @@ files_struct *open_file_ntcreate(connection_struct *conn, fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,unx_mode,access_mask); + if (!fsp_open && (flags2 & O_EXCL) && (errno == EEXIST)) { + /* + * Two smbd's tried to open exclusively, but only one of them + * succeeded. + */ + file_free(fsp); + return NULL; + } + if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT)) { if((fsp_open = open_file(fsp,conn,fname,psbuf, O_RDONLY,unx_mode,access_mask)) == True) { |