diff options
author | Jeremy Allison <jra@samba.org> | 2001-04-13 20:49:11 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-04-13 20:49:11 +0000 |
commit | 819482c07137937ee0c063437d2b2eade2895b99 (patch) | |
tree | 1f47417e5ff9791f9a5e74050d1faad49ea28f01 | |
parent | 3c2c047e822b6c74ecc176d1623d5292657cde62 (diff) | |
download | samba-819482c07137937ee0c063437d2b2eade2895b99.tar.gz samba-819482c07137937ee0c063437d2b2eade2895b99.tar.bz2 samba-819482c07137937ee0c063437d2b2eade2895b99.zip |
Fixed potential file descriptor leak with MS-Access fix.
Jeremy.
(This used to be commit 192887fe72157a141b8df1977085f479e5204782)
-rw-r--r-- | source3/smbd/open.c | 10 | ||||
-rw-r--r-- | source3/utils/torture.c | 27 |
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) |