[SSI] openssi/kernel/ipc msg.c, 1.12, 1.13 sem.c, 1.28, 1.29 shm.c, 1.23, 1.24

Roger Tsang <[email protected]>
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/ipc
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv14613/ipc

Modified Files:
      Tag: OPENSSI-FC
	msg.c sem.c shm.c 
Log Message:
CFS:
- Fast path directory i_op->permission cfs_permission(); redundant since there is a recheck after token hold.

IPC:
- Fix [ ssic-linux-Bugs-2719607 ] memory leak in ipcname_gettotal() path; based on patch from John Hughes (hughesj).


Index: sem.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/sem.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- sem.c	19 Oct 2008 14:35:29 -0000	1.28
+++ sem.c	28 Mar 2009 23:44:16 -0000	1.29
@@ -146,7 +146,7 @@
 			  ssi_procstate_t *, ics_userbuf_t *, ics_userbuf_t *);
 extern int cli_ripc_semexit(clusternode_t, int *, ssi_procstate_t *, int,
 			    pid_t);
-extern int cli_ipcname_gettotal(int, char **, int *);
+extern int cli_ipcname_gettotal(int, struct ssi_nodeid_pair **, int *);
 extern int ssi_sem_get_sem_array(clusternode_t, int, char **);
 
 extern clusternode_t name_server_node;
@@ -2119,7 +2119,9 @@
 	int i, len = 0;
 
 #ifdef CONFIG_SSI
+	struct ssi_nodeid_pair *node_id_pairs = NULL;
 	int local_view = ssi_get_localview();
+	int id_count, size;
 	char viewstr[10];
 #endif /* CONFIG_SSI */
 
@@ -2127,54 +2129,47 @@
 	down(&sem_ids.sem);
 
 #ifdef CONFIG_SSI
-	int id_count=0, ipc_id=0;
-	char *node_id_pairs=NULL;
-	char *tmp_pairs=NULL;
-	int  size=0, node_num=0;
-	char *tsma=NULL;
-
 	bzero(viewstr, 10);
-	if (!local_view)
-	{
-		size = -1;
-		cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
-		node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
-		if (node_id_pairs == NULL)
-			goto done;
-		memset(node_id_pairs, 0, size * sizeof(int));
-		cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
-		tmp_pairs = (char *)node_id_pairs;
+	if (!local_view) {
+		size = 30; /* Random guess */
+		for (;;) {
+			int allocated = size;
+
+			node_id_pairs = kmalloc(size * sizeof(*node_id_pairs), GFP_KERNEL);
+			if (node_id_pairs == NULL)
+				goto done;
+
+			cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
+			if (size <= allocated)
+				break;
+			kfree (node_id_pairs);
+		}
 	}
 	id_count = SEM_MAX_ID;
 
 	for(i = 0; i <= id_count; i++) {
 		struct sem_array *sma;
-		sma = NULL;
+		int node_num;
+		key_t ipc_id;
 
-		if (!local_view)
-		{
-			node_num = *((int *)tmp_pairs);
-			tmp_pairs += sizeof(int);
-			ipc_id = *((key_t *)tmp_pairs);
-			tmp_pairs += sizeof(key_t);
-			i++;
-			if (node_num == CLUSTERNODE_INVAL)
+		if (!local_view) {
+			ipc_id = node_id_pairs[i].ipc_id;
+			node_num = node_id_pairs[i].node_num;
+
+			if (node_num == CLUSTERNODE_INVAL) {
 				node_num = -1;
-			else if (node_num == this_node)
+			} else if (node_num == this_node) {
 				sma = sem_lock(ipc_id);
-			else
-			{
-				tsma = (char *)kmalloc(sizeof(struct sem_array), GFP_KERNEL);
-				if (tsma == NULL) break;
-				memset(tsma, 0, sizeof(struct sem_array));
-				ssi_sem_get_sem_array(node_num, ipc_id, &tsma);
-				sma = (struct sem_array *)tsma;
+			} else {
+				sma = kzmalloc(sizeof(struct sem_array), GFP_KERNEL);
+				if (sma == NULL)
+					break;
+				(void) ssi_sem_get_sem_array(node_num, ipc_id, (char **) &sma);
 			}
-		}
-		else
-		{
+		} else {
 			sma = sem_lock(i);
 			node_num = this_node;
+			ipc_id = 0; /* shut up compiler */
 		}
 		if(sma) {
 			len += sprintf(buffer + len, "%10d %10d  %4o %10lu %5u %5u %5u %5u %10lu %10lu",
@@ -2210,6 +2205,7 @@
 				goto done;
 		}
 	}
+
 #else
 	for(i = 0; i <= sem_ids.max_id; i++) {
 		struct sem_array *sma;
@@ -2240,6 +2236,9 @@
 	*eof = 1;
 done:
 	up(&sem_ids.sem);
+#ifdef	CONFIG_SSI
+	kfree (node_id_pairs);
+#endif
 	*start = buffer + (offset - begin);
 	len -= (offset - begin);
 	if(len > length)

Index: shm.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/shm.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- shm.c	24 Mar 2009 04:26:29 -0000	1.23
+++ shm.c	28 Mar 2009 23:44:16 -0000	1.24
@@ -42,7 +42,7 @@
 
 #ifdef CONFIG_SSI
 extern int cli_ipcname_findid(int, int, key_t *, clusternode_t *, int *, int *, int *);
-extern int cli_ipcname_gettotal(int objtype, char **, int *);
+extern int cli_ipcname_gettotal(int objtype, struct ssi_nodeid_pair **, int *);
 extern int cli_ipcname_rmid(int, global_id_t);
 extern int ssi_shmctl(clusternode_t, int, int, struct shmid_ds *);
 extern int ssi_shm_get_shmid_kernel(clusternode_t, int, char **, int *, int *);
@@ -1589,7 +1589,9 @@
 	int i, len = 0;
 
 #ifdef CONFIG_SSI
+	struct ssi_nodeid_pair *node_id_pairs = NULL;
 	int local_view = ssi_get_localview();
+	int id_count, size;
 	char viewstr[10];
 #endif /* CONFIG_SSI */
 
@@ -1597,23 +1599,21 @@
 	PRINT_HEADER;
 
 #ifdef CONFIG_SSI
-	int id_count=0, ipc_id=0;
-	int segsize=0, cprid=0;
-	char *node_id_pairs=NULL;
-	char *tmp_pairs=NULL;
-	int  size=0, node_num=0;
-
 	bzero(viewstr, 10);
 	if (!local_view) {
-		size = -1;
-		cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
-		if (size <= 0) goto done;
-		node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
-		if (node_id_pairs == NULL)
-			goto done;
-		memset(node_id_pairs, 0, size * sizeof(int));
-		cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
-		tmp_pairs = (char *)node_id_pairs;
+		size = 30; /* Random guess */
+		for (;;) {	/* Maybe limit tries? */
+			int allocated = size;
+
+			node_id_pairs = kmalloc(size * sizeof *node_id_pairs, GFP_KERNEL);
+			if (!node_id_pairs)
+				goto done;
+
+			cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
+			if (size <= allocated)
+				break;
+			kfree (node_id_pairs);
+		}
 	}
 	id_count = SHM_MAX_ID;
 
@@ -1623,32 +1623,28 @@
 #endif /* CONFIG_SSI */
 		struct shmid_kernel* shp;
 #ifdef CONFIG_SSI
+		key_t ipc_id = i;
+		int node_num, segsize=0, cprid=0;
 		shp = NULL;
 		if (!local_view) {
-			node_num = *((int *)tmp_pairs);
-			tmp_pairs += sizeof(int);
-			ipc_id = *((key_t *)tmp_pairs);
-			tmp_pairs += sizeof(key_t);
-			i++;
-			if (node_num == CLUSTERNODE_INVAL)
+			ipc_id = node_id_pairs[i].ipc_id;
+			node_num = node_id_pairs[i].node_num;
+
+			if (node_num == CLUSTERNODE_INVAL) {
                                 node_num = -1;
-                        else if (node_num == this_node)
-			{
+                        } else if (node_num == this_node) {
 				shp = shm_lock(ipc_id);
 				segsize = shm_get_segsize(shp);
 				cprid = shm_get_cpid(shp);
-			}
-			else
-			{
-				shp = kmalloc(sizeof(struct shmid_kernel),
+			} else {
+				shp = kzmalloc(sizeof(struct shmid_kernel),
 								GFP_KERNEL);
-				if (shp == NULL) break;
-				memset(shp, 0, sizeof(struct shmid_kernel));
+				if (shp == NULL)
+					break;
 				ssi_shm_get_shmid_kernel(node_num, ipc_id,
 					(char **)&shp, &segsize, &cprid);
 			}
-		}
-		else {
+		} else {
 			shp = shm_lock(i);
 			node_num = this_node;
 		}
@@ -1733,16 +1729,15 @@
 	*eof = 1;
 done:
 	up(&shm_ids.sem);
+#ifdef CONFIG_SSI
+	kfree(node_id_pairs);
+#endif /* CONFIG_SSI */
 	*start = buffer + (offset - begin);
 	len -= (offset - begin);
 	if(len > length)
 		len = length;
 	if(len < 0)
 		len = 0;
-#ifdef CONFIG_SSI
-	if ((!local_view) && (size > 0))
-		kfree(node_id_pairs);
-#endif /* CONFIG_SSI */
 	return len;
 }
 #endif

Index: msg.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/msg.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- msg.c	27 May 2005 04:38:21 -0000	1.12
+++ msg.c	28 Mar 2009 23:44:16 -0000	1.13
@@ -39,7 +39,7 @@
 
 extern int cli_ipcname_findid(int, int, key_t *, clusternode_t *, int *,
 			      int *, int *);
-extern int cli_ipcname_gettotal(int objtype, char **, int *);
+extern int cli_ipcname_gettotal(int objtype, struct ssi_nodeid_pair **, int *);
 extern int cli_ipcname_rmid(int service, global_id_t glid);
 extern int cli_ripc_msgctl(clusternode_t, int *, int, int, ssi_procstate_t *,
 			   long *);
@@ -1470,28 +1470,30 @@
 	int i, len = 0;
 
 #ifdef CONFIG_SSI
+	struct ssi_nodeid_pair *node_id_pairs = NULL;
 	int local_view = ssi_get_localview();
+	int id_count, size;
 	char viewstr[10];
 #endif
 	down(&msg_ids.sem);
 	PRINT_HEADER;
 #ifdef CONFIG_SSI
-	int id_count=0, ipc_id=0;
-	char *node_id_pairs=NULL;
-	char *tmp_pairs=NULL;
-	int  size=0, node_num=0;
 
 	bzero(viewstr, 10);
-	if (!local_view)
-	{
-		size = -1;
-		cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
-		node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
-		if (node_id_pairs == NULL)
-			goto done;
-		memset(node_id_pairs, 0, size * sizeof(int));
-		cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
-		tmp_pairs = (char *)node_id_pairs;
+	if (!local_view) {
+		size = 30; /* Random guess */
+		for (;;) {
+			int allocated = size;
+
+			node_id_pairs = kmalloc(size * sizeof(*node_id_pairs), GFP_KERNEL);
+			if (node_id_pairs == NULL)
+				goto done;
+
+			(void) cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
+			if (allocated >= size)
+				break;
+			kfree (node_id_pairs);
+		}
 	}
 	id_count = MSG_MAX_ID;
 
@@ -1501,28 +1503,25 @@
 #endif
 		struct msg_queue * msq;
 #ifdef CONFIG_SSI
+		int node_num;
+		key_t ipc_id = i;
 		msq = NULL;
 
-		if (!local_view)
-		{
-			node_num = *((int *)tmp_pairs);
-			tmp_pairs += sizeof(int);
-			ipc_id = *((key_t *)tmp_pairs);
-			tmp_pairs += sizeof(key_t);
-			i++; 
-			if (node_num == CLUSTERNODE_INVAL)
+		if (!local_view) {
+			ipc_id = node_id_pairs[i].ipc_id;
+			node_num = node_id_pairs[i].node_num;
+
+			if (node_num == CLUSTERNODE_INVAL) {
 				node_num = -1;
-			else if (node_num == this_node)
+			} else if (node_num == this_node) {
 				msq = msg_lock(ipc_id);
-			else
-			{
-				msq = kmalloc(sizeof(struct msg_queue), GFP_KERNEL);
-				if (msq == NULL) break;
-				memset(msq, 0, sizeof(struct msg_queue));
+			} else {
+				msq = kzmalloc(sizeof(struct msg_queue), GFP_KERNEL);
+				if (msq == NULL)
+					break;
 				ssi_msg_get_msg_queue(node_num, ipc_id, (char **)&msq);
 			}
-		}
-		else {
+		} else {
 			node_num = this_node;
 			msq = msg_lock(i);
 		}
@@ -1578,6 +1577,9 @@
 	*eof = 1;
 done:
 	up(&msg_ids.sem);
+#ifdef	CONFIG_SSI
+	kfree (node_id_pairs);
+#endif
 	*start = buffer + (offset - begin);
 	len -= (offset - begin);
 	if(len > length)


------------------------------------------------------------------------------
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.