Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Sep 2012 13:53:16 +0000 (UTC)
From:      Dima Panov <fluffy@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r303548 - in head/news/inn: . files
Message-ID:  <201209021353.q82DrGat012065@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: fluffy
Date: Sun Sep  2 13:53:16 2012
New Revision: 303548
URL: http://svn.freebsd.org/changeset/ports/303548

Log:
  - Fix innd/nnrpd semget failures
  
  Do not set any shmem permission bits except for the six allowed bits
  
  PR:		171134
  Submitted by:	G. Paul Ziemba

Added:
  head/news/inn/files/patch-storage_buffindexed_shmem.c   (contents, props changed)
Modified:
  head/news/inn/Makefile   (contents, props changed)

Modified: head/news/inn/Makefile
==============================================================================
--- head/news/inn/Makefile	Sun Sep  2 13:08:58 2012	(r303547)
+++ head/news/inn/Makefile	Sun Sep  2 13:53:16 2012	(r303548)
@@ -7,7 +7,7 @@
 
 PORTNAME?=	inn
 PORTVERSION?=	2.5.2
-PORTREVISION?=	2
+PORTREVISION?=	3
 CATEGORIES=	news ipv6
 # Master distribution broken
 #MASTER_SITES?=	${MASTER_SITE_ISC}

Added: head/news/inn/files/patch-storage_buffindexed_shmem.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/news/inn/files/patch-storage_buffindexed_shmem.c	Sun Sep  2 13:53:16 2012	(r303548)
@@ -0,0 +1,73 @@
+The problem seems to be that unsupported permission bits are being given to semget(2) as in the following snippet (there are several such instances):
+
+storage/buffindexed/shmem.c:
+
+    id = semget(kt, 2, IPC_CREAT|S_IRWXU|S_IRWXG|S_IRWXO);
+
+The semget(2) man page does not indicate that the usual file mode bits may be used. Instead, it allows:
+
+     SEM_R         Read access for user.
+
+     SEM_A         Alter access for user.
+
+     (SEM_R>>3)    Read access for group.
+
+     (SEM_A>>3)    Alter access for group.
+
+     (SEM_R>>6)    Read access for other.
+
+     (SEM_A>>6)    Alter access for other.
+
+The allowed bits correspond to read and write bits of the file mode constants. The execute bit is not among the defined bits for semget.
+
+The fix: do not set any permission bits except for the six allowed  bits.
+
+Note that the documentation for linux semget differs, and seems to allow but ignore the execute bits.
+
+Patch attached with submission follows:
+
+--- storage/buffindexed/shmem.c.orig	2012-08-27 23:39:42.000000000 -0700
++++ storage/buffindexed/shmem.c	2012-08-27 23:37:50.000000000 -0700
+@@ -26,7 +26,9 @@
+ static int smcGetSemaphore(const char *name)
+ {
+     key_t kt = ftok( (char *)name, 0 );
+-    int   id = semget(kt, 0, S_IRWXU|S_IRWXG|S_IRWXO);
++    int   perm = SEM_R | SEM_A | (SEM_R>>3) | (SEM_A>>3) |
++	    (SEM_R>>6) | (SEM_A>>6);
++    int   id = semget(kt, 0, perm);
+ 
+     if (id < 0) {
+         syswarn("semget failed to get semaphore for %s", name);
+@@ -37,15 +39,17 @@
+ static int smcCreateSemaphore(const char *name)
+ {
+     key_t kt = ftok( (char *)name, 0 );
+-    int   id = semget(kt, 2, IPC_CREAT|S_IRWXU|S_IRWXG|S_IRWXO);
++    int   perm = SEM_R | SEM_A | (SEM_R>>3) | (SEM_A>>3) |
++	    (SEM_R>>6) | (SEM_A>>6);
++    int   id = semget(kt, 2, IPC_CREAT|perm);
+ 
+     if (id < 0) {
+         if (errno == EACCES || errno == EINVAL) {
+             /* looks like a wrong semaphore exists. remove it. */
+-            id = semget(kt, 0, S_IRWXU|S_IRWXG|S_IRWXO);
++            id = semget(kt, 0, perm);
+             if (id < 0) {
+                 /* couldn't even retrieve it. */
+-                syswarn("cant get semaphore using %s", name);
++                syswarn("cant get semaphore using %s (key=%d)", name, kt);
+                 return id;
+             }
+             /* try to remove it */
+@@ -65,7 +69,7 @@
+             }
+ #endif
+             /* and retry creating it */
+-            id = semget(kt, 2, IPC_CREAT|S_IRWXU|S_IRWXG|S_IRWXO);
++            id = semget(kt, 2, IPC_CREAT|perm);
+         }
+     }
+     if (id < 0)
+
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209021353.q82DrGat012065>