Don't rely on size argument in shmget call

* shm.cc (shmget): Fetch segment size from server rather than using
	size argument to accommodate existing segments.  Add comment to explain
	why.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-04-12 14:05:12 +02:00
parent 8ede2acefd
commit 7d061316c0
3 changed files with 17 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2015-04-12 Corinna Vinschen <corinna@vinschen.de>
* shm.cc (shmget): Fetch segment size from server rather than using
size argument to accommodate existing segments. Add comment to explain
why.
2015-04-11 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::fchmod): Fix typo in

View File

@ -58,3 +58,6 @@ Bug Fixes
- Fix UTF-16 surrogate handling in wctomb and friends.
Addresses: https://cygwin.com/ml/cygwin/2015-03/msg00452.html
- Fix shmget usage of size parameter for already existing segments.
Addresses: https://cygwin.com/ml/cygwin/2015-04/msg00105.html

View File

@ -377,7 +377,14 @@ shmget (key_t key, size_t size, int shmflg)
shmid and hdl value to the list. */
ssh_new_entry->shmid = shmid;
ssh_new_entry->hdl = hdl;
ssh_new_entry->size = size;
/* Fetch segment size from server. If this is an already existing segment,
the size value in this shmget call is supposed to be meaningless. */
struct shmid_ds stat;
client_request_shm stat_req (shmid, IPC_STAT, &stat);
if (stat_req.make_request () == -1 || stat_req.retval () == -1)
ssh_new_entry->size = size;
else
ssh_new_entry->size = stat.shm_segsz;
ssh_new_entry->ref_count = 0;
SLIST_INSERT_HEAD (&ssh_list, ssh_new_entry, ssh_next);
SLIST_UNLOCK ();