Просмотр исходного кода

avoid infloop upon out-of-memory or out-of-semaphores

* coroipc.c (cslib_service_connect): Upon shmget failure
loop only when errno == EEXIST.  Any other error now translates
to res_setup.error.
Likewise for semget.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1899 fd59a12c-fef9-0310-b244-a6a79926bd2f
Jim Meyering 17 лет назад
Родитель
Сommit
11c2317936
1 измененных файлов с 19 добавлено и 7 удалено
  1. 19 7
      lib/coroipcc.c

+ 19 - 7
lib/coroipcc.c

@@ -323,20 +323,32 @@ coroipcc_service_connect (
 	/*
 	 * Allocate a shared memory segment
 	 */
-	do {
+	while (1) {
 		shmkey = random();
-		ipc_segment->shmid = shmget (shmkey, sizeof (struct shared_memory),
-			IPC_CREAT|IPC_EXCL|0600);
-	} while (ipc_segment->shmid == -1);
+		if ((ipc_segment->shmid
+		     = shmget (shmkey, sizeof (struct shared_memory),
+			       IPC_CREAT|IPC_EXCL|0600)) != -1) {
+			break;
+		}
+		if (errno != EEXIST) {
+			goto error_exit;
+		}
+	}
 
 	/*
 	 * Allocate a semaphore segment
 	 */
-	do {
+	while (1) {
 		semkey = random();
-		ipc_segment->semid = semget (semkey, 3, IPC_CREAT|IPC_EXCL|0600);
 		ipc_segment->euid = geteuid ();
-	} while (ipc_segment->semid == -1);
+		if ((ipc_segment->semid
+		     = semget (semkey, 3, IPC_CREAT|IPC_EXCL|0600)) != -1) {
+		      break;
+		}
+		if (errno != EEXIST) {
+			goto error_exit;
+		}
+	}
 
 	/*
 	 * Attach to shared memory segment