summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/open.c10
-rw-r--r--source3/utils/torture.c27
2 files changed, 34 insertions, 3 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 5f8657262a..007a169f9e 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -60,6 +60,8 @@ static int fd_open(struct connection_struct *conn, char *fname,
int fd_close(struct connection_struct *conn, files_struct *fsp)
{
+ if (fsp->fd == -1)
+ return -1;
return fd_close_posix(conn, fsp);
}
@@ -699,9 +701,15 @@ files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_S
* we can do. We also ensure we're not going to create or tuncate
* the file as we only want an access decision at this stage. JRA.
*/
- open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
+ fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
+
+ DEBUG(4,("open_file_shared : share_mode deny - calling open_file with \
+flags=0x%X flags2=0x%X mode=0%o returned %d\n",
+ flags,(flags2&~(O_TRUNC|O_CREAT)),(int)mode,(int)fsp_open ));
unlock_share_entry(conn, dev, inode);
+ if (fsp_open)
+ fd_close(conn, fsp);
file_free(fsp);
return NULL;
}
diff --git a/source3/utils/torture.c b/source3/utils/torture.c
index ac922eed61..446bf7eaf2 100644
--- a/source3/utils/torture.c
+++ b/source3/utils/torture.c
@@ -2431,7 +2431,7 @@ static void run_opentest(int dummy)
return;
}
- /* This will fail - but the error should be ERRnoaccess, not ERRshare. */
+ /* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_ALL);
cli_error( &cli1, &eclass, &errnum, NULL);
@@ -2444,14 +2444,37 @@ static void run_opentest(int dummy)
}
+ printf("finished open test 1\n");
+
cli_close(&cli1, fnum1);
+ /* Now try not readonly and ensure ERRbadshare is returned. */
+
cli_setatr(&cli1, fname, 0, 0);
+
+ fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_WRITE);
+ if (fnum1 == -1) {
+ printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ return;
+ }
+
+ /* This will fail - but the error should be ERRshare. */
+ fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_ALL);
+
+ cli_error( &cli1, &eclass, &errnum, NULL);
+
+ if (eclass != ERRDOS || errnum != ERRbadshare) {
+ printf("wrong error code (%x,%x) = %s\n", (unsigned int)eclass,
+ (unsigned int)errnum, cli_errstr(&cli1) );
+ } else {
+ printf("correct error code ERRDOS/ERRbadshare returned\n");
+ }
+
cli_unlink(&cli1, fname);
close_connection(&cli1);
- printf("finished open test 1\n");
+ printf("finished open test 2\n");
}
static void list_fn(file_info *finfo, const char *name, void *state)