This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Don't rely on size argument in shmget call


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7d061316c0b7fa417cdd8f2540ec16743564e3f0

commit 7d061316c0b7fa417cdd8f2540ec16743564e3f0
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Sun Apr 12 14:05:12 2015 +0200

    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>

Diff:
---
 winsup/cygwin/ChangeLog     | 6 ++++++
 winsup/cygwin/release/2.0.0 | 3 +++
 winsup/cygwin/shm.cc        | 9 ++++++++-
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index e300ff6..3d2bfef 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/release/2.0.0 b/winsup/cygwin/release/2.0.0
index c9fdd85..d35b723 100644
--- a/winsup/cygwin/release/2.0.0
+++ b/winsup/cygwin/release/2.0.0
@@ -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
diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc
index c5ab708..e209346 100644
--- a/winsup/cygwin/shm.cc
+++ b/winsup/cygwin/shm.cc
@@ -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 ();


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]