diff options
Diffstat (limited to 'source3/smbwrapper')
-rw-r--r-- | source3/smbwrapper/smbw.c | 16 | ||||
-rw-r--r-- | source3/smbwrapper/smbw.h | 3 | ||||
-rw-r--r-- | source3/smbwrapper/smbw_dir.c | 13 |
3 files changed, 21 insertions, 11 deletions
diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index d79131a8ea..11192bedd7 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -95,7 +95,7 @@ determine if a file descriptor is a smb one int smbw_fd(int fd) { if (smbw_busy) return 0; - return (fd >= SMBW_FD_OFFSET); + return smbw_file_bmap && bitmap_query(smbw_file_bmap, fd); } /***************************************************** @@ -523,16 +523,19 @@ int smbw_open(const char *fname, int flags, mode_t mode) goto failed; } file->srv = srv; - file->fd = bitmap_find(smbw_file_bmap, 0); - + file->fd = open("/dev/null", O_WRONLY); if (file->fd == -1) { errno = EMFILE; goto failed; } - bitmap_set(smbw_file_bmap, file->fd); + if (bitmap_query(smbw_file_bmap, file->fd)) { + DEBUG(0,("ERROR: fd used in smbw_open\n")); + errno = EIO; + goto failed; + } - file->fd += SMBW_FD_OFFSET; + bitmap_set(smbw_file_bmap, file->fd); DLIST_ADD(smbw_files, file); @@ -648,7 +651,8 @@ int smbw_close(int fd) } - bitmap_clear(smbw_file_bmap, file->fd - SMBW_FD_OFFSET); + bitmap_clear(smbw_file_bmap, file->fd); + close(file->fd); DLIST_REMOVE(smbw_files, file); diff --git a/source3/smbwrapper/smbw.h b/source3/smbwrapper/smbw.h index 716205c1fc..5fc864456e 100644 --- a/source3/smbwrapper/smbw.h +++ b/source3/smbwrapper/smbw.h @@ -21,9 +21,8 @@ #define SMBW_PREFIX "/smb/" -#define SMBW_FD_OFFSET 700 #define SMBW_CLI_FD 512 -#define SMBW_MAX_OPEN 2048 +#define SMBW_MAX_OPEN 8192 #define SMBW_FILE_MODE (S_IFREG | 0644) #define SMBW_DIR_MODE (S_IFDIR | 0755) diff --git a/source3/smbwrapper/smbw_dir.c b/source3/smbwrapper/smbw_dir.c index 22da76eb17..c437a53e1f 100644 --- a/source3/smbwrapper/smbw_dir.c +++ b/source3/smbwrapper/smbw_dir.c @@ -175,17 +175,23 @@ int smbw_dir_open(const char *fname) cur_dir = NULL; - fd = bitmap_find(smbw_file_bmap, 0); + fd = open("/dev/null", O_WRONLY); if (fd == -1) { errno = EMFILE; goto failed; } + if (bitmap_query(smbw_file_bmap, fd)) { + DEBUG(0,("ERROR: fd used in smbw_dir_open\n")); + errno = EIO; + goto failed; + } + DLIST_ADD(smbw_dirs, dir); bitmap_set(smbw_file_bmap, fd); - dir->fd = fd + SMBW_FD_OFFSET; + dir->fd = fd; dir->srv = srv; dir->path = strdup(s); @@ -241,7 +247,8 @@ int smbw_dir_close(int fd) return -1; } - bitmap_clear(smbw_file_bmap, dir->fd - SMBW_FD_OFFSET); + bitmap_clear(smbw_file_bmap, dir->fd); + close(dir->fd); DLIST_REMOVE(smbw_dirs, dir); |