You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by ji...@apache.org on 2014/01/25 21:35:02 UTC

svn commit: r1561394 - in /apr/apr/trunk: CHANGES shmem/unix/shm.c

Author: jim
Date: Sat Jan 25 20:35:02 2014
New Revision: 1561394

URL: http://svn.apache.org/r1561394
Log:
Okey dokey... how we gen the key isn't part of our ABI,
so we can fix it without breaking it.

Modified:
    apr/apr/trunk/CHANGES
    apr/apr/trunk/shmem/unix/shm.c

Modified: apr/apr/trunk/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr/trunk/CHANGES?rev=1561394&r1=1561393&r2=1561394&view=diff
==============================================================================
--- apr/apr/trunk/CHANGES [utf-8] (original)
+++ apr/apr/trunk/CHANGES [utf-8] Sat Jan 25 20:35:02 2014
@@ -1,6 +1,10 @@
                                                      -*- coding: utf-8 -*-
 Changes for APR 2.0.0
 
+  *) When using shmget-based shared memory, the ID used for ftok is
+     now an APR hash of the filename instead of the constant '1'.
+     We do this to help avoid collisions. PR 53996 [Jim Jagielski]
+
   *) Fix POSIX shared memory (shm_open) use for named shared memory.
      Includes adding '--enable-posix-shm' to force POSIX shm if
      available, and OSX compatibility. PR 55928.

Modified: apr/apr/trunk/shmem/unix/shm.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/shmem/unix/shm.c?rev=1561394&r1=1561393&r2=1561394&view=diff
==============================================================================
--- apr/apr/trunk/shmem/unix/shm.c (original)
+++ apr/apr/trunk/shmem/unix/shm.c Sat Jan 25 20:35:02 2014
@@ -67,6 +67,17 @@ static const char *make_shm_open_safe_na
 }
 #endif
 
+#if APR_USE_SHMEM_SHMGET
+static key_t our_ftok(const char *filename)
+{
+    /* to help avoid collisions while still using
+     * an easily recreated proj_id */
+    apr_ssize_t slen = strlen(filename);
+    return ftok(filename,
+                (int)apr_hashfunc_default(filename, &slen));
+}
+#endif
+
 static apr_status_t shm_cleanup_owner(void *m_)
 {
     apr_shm_t *m = (apr_shm_t *)m_;
@@ -361,7 +372,7 @@ APR_DECLARE(apr_status_t) apr_shm_create
 
         /* ftok() (on solaris at least) requires that the file actually
          * exist before calling ftok(). */
-        new_m->shmkey = ftok(filename, 1);
+        new_m->shmkey = our_ftok(filename);
         if (new_m->shmkey == (key_t)-1) {
             apr_file_close(file);
             return errno;
@@ -451,7 +462,7 @@ APR_DECLARE(apr_status_t) apr_shm_remove
 
     /* ftok() (on solaris at least) requires that the file actually
      * exist before calling ftok(). */
-    shmkey = ftok(filename, 1);
+    shmkey = our_ftok(filename);
     if (shmkey == (key_t)-1) {
         goto shm_remove_failed;
     }
@@ -623,7 +634,7 @@ APR_DECLARE(apr_status_t) apr_shm_attach
 
         new_m->filename = apr_pstrdup(pool, filename);
         new_m->pool = pool;
-        new_m->shmkey = ftok(filename, 1);
+        new_m->shmkey = our_ftok(filename);
         if (new_m->shmkey == (key_t)-1) {
             return errno;
         }