summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-10-04 04:48:17 +0000
committerAndrew Tridgell <tridge@samba.org>1998-10-04 04:48:17 +0000
commitd71c04f927cbcbaae0708c1533748caac20ee5af (patch)
tree8d5a5aafb37aacaedba4322f1d62593354515e48
parent57a58f592b67a0ebf482f06315b9c546590126bf (diff)
downloadsamba-d71c04f927cbcbaae0708c1533748caac20ee5af.tar.gz
samba-d71c04f927cbcbaae0708c1533748caac20ee5af.tar.bz2
samba-d71c04f927cbcbaae0708c1533748caac20ee5af.zip
use dummy file descriptors opened on /dev/null to ensure that the smbw
file descriptor allocation order is identical to the kernels. (This used to be commit 60a683465647932f7241ba9f92443d5e5294e20b)
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/lib/bitmap.c2
-rw-r--r--source3/smbwrapper/smbw.c16
-rw-r--r--source3/smbwrapper/smbw.h3
-rw-r--r--source3/smbwrapper/smbw_dir.c13
5 files changed, 23 insertions, 12 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 932621ce9a..78863b5984 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -55,6 +55,7 @@ BOOL check_access(int sock, char *allow_list, char *deny_list);
struct bitmap *bitmap_allocate(int n);
BOOL bitmap_set(struct bitmap *bm, unsigned i);
BOOL bitmap_clear(struct bitmap *bm, unsigned i);
+BOOL bitmap_query(struct bitmap *bm, unsigned i);
int bitmap_find(struct bitmap *bm, unsigned ofs);
/*The following definitions come from lib/charcnv.c */
diff --git a/source3/lib/bitmap.c b/source3/lib/bitmap.c
index 9ccdbb420b..93c821c528 100644
--- a/source3/lib/bitmap.c
+++ b/source3/lib/bitmap.c
@@ -81,7 +81,7 @@ BOOL bitmap_clear(struct bitmap *bm, unsigned i)
/****************************************************************************
query a bit in a bitmap
****************************************************************************/
-static BOOL bitmap_query(struct bitmap *bm, unsigned i)
+BOOL bitmap_query(struct bitmap *bm, unsigned i)
{
if (i >= bm->n) return False;
if (bm->b[i/32] & (1<<(i%32))) {
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);