diff options
author | Andrew Tridgell <tridge@samba.org> | 1997-10-29 01:59:54 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1997-10-29 01:59:54 +0000 |
commit | 4fd96fddd2b13f60c4eb13263bac2a62a2795dcc (patch) | |
tree | 93c269b25da65f647dcca036b8d3682021142d68 /source3/locking/locking_shm.c | |
parent | b925b3d20c8e85c7b65a0ad599248443ae12905c (diff) | |
download | samba-4fd96fddd2b13f60c4eb13263bac2a62a2795dcc.tar.gz samba-4fd96fddd2b13f60c4eb13263bac2a62a2795dcc.tar.bz2 samba-4fd96fddd2b13f60c4eb13263bac2a62a2795dcc.zip |
clean up the hash entry code a bit. Got rid of lp_shmem_hash_size()
and made it private to the 2 shmem implementations. Added new
shmops->hash_size() function.
Added code to handle the IPC system limits by looping decreasing the
size of the resources (semaphores and shared memory) that we request
until we get under the system limits, which can be quite low on some
systems!
Added checks that the creator of the IPC objects is root. Otherwise we
would be open to a security hole where someone pre-creates the shared
memory segment and attaches.
(This used to be commit 6b6f624b63137d4750200e8cb4961b1402513632)
Diffstat (limited to 'source3/locking/locking_shm.c')
-rw-r--r-- | source3/locking/locking_shm.c | 51 |
1 files changed, 4 insertions, 47 deletions
diff --git a/source3/locking/locking_shm.c b/source3/locking/locking_shm.c index 3abd6b25a7..d299e34caa 100644 --- a/source3/locking/locking_shm.c +++ b/source3/locking/locking_shm.c @@ -64,7 +64,7 @@ static int read_only; /* Conversion to hash entry index from device and inode numbers. */ -#define HASH_ENTRY(dev,ino) ((( (uint32)(dev) )* ( (uint32)(ino) )) % lp_shmem_hash_size()) +#define HASH_ENTRY(dev,ino) ((((uint32)(dev)) * ((uint32)(ino))) % shmops->hash_size()) /******************************************************************* @@ -110,15 +110,6 @@ static int shm_get_share_modes(int cnum, int token, uint32 dev, uint32 inode, *old_shares = 0; - if(hash_entry > lp_shmem_hash_size() ) - { - DEBUG(0, - ("PANIC ERROR : get_share_modes (FAST_SHARE_MODES): hash_entry %d too large \ -(max = %d)\n", - hash_entry, lp_shmem_hash_size() )); - return 0; - } - mode_array = (int *)shmops->offset2addr(shmops->get_userdef_off()); if(mode_array[hash_entry] == NULL_OFFSET) @@ -289,15 +280,6 @@ static void shm_del_share_mode(int token, int fnum) hash_entry = HASH_ENTRY(dev, inode); - if(hash_entry > lp_shmem_hash_size() ) - { - DEBUG(0, - ("PANIC ERROR:del_share_mode (FAST_SHARE_MODES): hash_entry %d too large \ -(max = %d)\n", - hash_entry, lp_shmem_hash_size() )); - return; - } - mode_array = (int *)shmops->offset2addr(shmops->get_userdef_off()); if(mode_array[hash_entry] == NULL_OFFSET) @@ -428,14 +410,6 @@ static BOOL shm_set_share_mode(int token, int fnum, uint16 port, uint16 op_type) inode = fs_p->fd_ptr->inode; hash_entry = HASH_ENTRY(dev, inode); - if(hash_entry > lp_shmem_hash_size() ) - { - DEBUG(0, - ("PANIC ERROR:set_share_mode (FAST_SHARE_MODES): hash_entry %d too large \ -(max = %d)\n", - hash_entry, lp_shmem_hash_size() )); - return False; - } mode_array = (int *)shmops->offset2addr(shmops->get_userdef_off()); @@ -550,15 +524,6 @@ static BOOL shm_remove_share_oplock(int fnum, int token) hash_entry = HASH_ENTRY(dev, inode); - if(hash_entry > lp_shmem_hash_size() ) - { - DEBUG(0, - ("PANIC ERROR:remove_share_oplock (FAST_SHARE_MODES): hash_entry %d too large \ -(max = %d)\n", - hash_entry, lp_shmem_hash_size() )); - return False; - } - mode_array = (int *)shmops->offset2addr(shmops->get_userdef_off()); if(mode_array[hash_entry] == NULL_OFFSET) @@ -654,7 +619,7 @@ static int shm_share_forall(void (*fn)(share_mode_entry *, char *)) mode_array = (int *)shmops->offset2addr(shmops->get_userdef_off()); - for( i = 0; i < lp_shmem_hash_size(); i++) { + for( i = 0; i < shmops->hash_size(); i++) { shmops->lock_hash_entry(i); if(mode_array[i] == NULL_OFFSET) { shmops->unlock_hash_entry(i); @@ -730,19 +695,11 @@ struct share_ops *locking_shm_init(int ronly) read_only = ronly; #ifdef USE_SYSV_IPC - shmops = sysv_shm_open(lp_shmem_size(), read_only); + shmops = sysv_shm_open(read_only); if (shmops) return &share_ops; #endif - pstrcpy(shmem_file_name,lp_lockdir()); - if (!directory_exist(shmem_file_name,NULL)) { - if (read_only) return NULL; - mkdir(shmem_file_name,0755); - } - trim_string(shmem_file_name,"","/"); - if (!*shmem_file_name) return(False); - strcat(shmem_file_name, "/SHARE_MEM_FILE"); - shmops = smb_shm_open(shmem_file_name, lp_shmem_size(), read_only); + shmops = smb_shm_open(read_only); if (shmops) return &share_ops; return NULL; |