[SSI] openssi/kernel/cluster/ssi/net ipvs_svr.c,1.29,1.30

Roger Tsang <[email protected]> Wed, 18 Dec 2013 07:32:40 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/net
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv8929/cluster/ssi/net

Modified Files:
      Tag: OPENSSI-FC
	ipvs_svr.c 
Log Message:
- clean up, move unrelated bug fixes out of compiler pragma.
- ripvs_add_entry: use memcpy() to avoid strlen() calls; avoid traversing beyond allocated memory region of string buffer since caller passes non-null terminated string.


Index: ipvs_svr.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/net/ipvs_svr.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- ipvs_svr.c	18 Dec 2013 07:10:31 -0000	1.29
+++ ipvs_svr.c	18 Dec 2013 07:32:38 -0000	1.30
@@ -277,27 +277,15 @@
 	struct ipvs_dirinfo *info;
 	char lvs_sched[IP_VS_SCHEDNAME_MAXLEN];
 
-#ifdef IPVS_SERVICE_RACE_FIX
-	SSI_ASSERT(sched_len < IP_VS_SCHEDNAME_MAXLEN);
-	if (sched_len >= IP_VS_SCHEDNAME_MAXLEN)
-		sched_len = IP_VS_SCHEDNAME_MAXLEN-1;
-	strlcpy(lvs_sched, sched, sched_len+1);
+	sched_len = min(sched_len, IP_VS_SCHEDNAME_MAXLEN-1);
+	memcpy(lvs_sched, sched, sched_len);
+	lvs_sched[sched_len] = '\0';
 
 	*rval = service_add(cvip, port, rip, weight, protocol, lvs_sched);
-	/* Only if there is an IPVS entry. */
-	if (!*rval || *rval == -EEXIST)
-#else
-	strncpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
-	lvs_sched[IP_VS_SCHEDNAME_MAXLEN-1] = '\0';
 
-	*rval = service_add(cvip, port, rip, weight, protocol, lvs_sched);
-	/* XXX: Not sure if we need this. */
-	if (!rval)
-#endif
 	/* Inform all the possible director nodes */
-	if ((info = get_director(cvip))) {
-		/* only from master director node */
-		if (info->dnode == this_node)
+	if ((!*rval || *rval == -EEXIST) && (info = get_director(cvip))) {
+		if (__is_master_director(info))
 			(void) pdirector_update(info, port, rip, weight,
 						protocol, lvs_sched, 1);
 		put_director(info);
@@ -306,7 +294,6 @@
 	return 0;
 }
 
-/* ripvs_add_entry() without get_director() call */
 void
 local_ipvs_add_entry(
 	struct ipvs_dirinfo *info,
@@ -317,28 +304,12 @@
 	u_short protocol,
 	char *sched)
 {
-	char lvs_sched[IP_VS_SCHEDNAME_MAXLEN];
-
-#ifdef IPVS_SERVICE_RACE_FIX
-	SSI_ASSERT(strlen(sched) < IP_VS_SCHEDNAME_MAXLEN);
-	strlcpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
-
-	*rval = service_add(info->daddr, port, rip, weight, protocol, lvs_sched);
-	/* Only if there is an IPVS entry. */
-	if (!*rval || *rval == -EEXIST)
-#else
-	strncpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
-	lvs_sched[IP_VS_SCHEDNAME_MAXLEN-1] = '\0';
+	SSI_ASSERT(__is_master_director(info));
+	*rval = service_add(info->daddr, port, rip, weight, protocol, sched);
 
-	*rval = service_add(info->daddr, port, rip, weight, protocol, lvs_sched);
-	/* XXX: Not sure if we need this. */
-	if (!rval)
-#endif
 	/* Inform all the possible director nodes */
-	/* only from master director node */
-	if (info->dnode == this_node)
-		(void) pdirector_update(info, port, rip, weight,
-					protocol, lvs_sched, 1);
+	if (!*rval || *rval == -EEXIST)
+		(void) pdirector_update(info, port, rip, weight, protocol, sched, 1);
 }
 
 int
@@ -353,15 +324,10 @@
 	struct ipvs_dirinfo *info;
 
 	*rval = service_del(cvip, port, rip, protocol);
-#ifdef IPVS_SERVICE_RACE_FIX
-	if (*rval != -EBADR)
-#else
-	if (!rval)
-#endif
+
 	/* Inform all the possible director nodes */
-	if ((info = get_director(cvip))) {
-		/* only from master director node */
-		if (info->dnode == this_node)
+	if ((*rval != -EBADR) && (info = get_director(cvip))) {
+		if (__is_master_director(info))
 			(void) pdirector_update(info, port, rip, 0, protocol, 0, 0);
 		put_director(info);
 	}
@@ -369,7 +335,6 @@
 	return 0;
 }
 
-/* ripvs_del_entry() without get_director() call */
 void
 local_ipvs_del_entry(
 	struct ipvs_dirinfo *info,
@@ -378,15 +343,11 @@
 	u_int rip,
 	u_short protocol)
 {
+	SSI_ASSERT(__is_master_director(info));
 	*rval = service_del(info->daddr, port, rip, protocol);
-#ifdef IPVS_SERVICE_RACE_FIX
-	if (*rval != -EBADR)
-#else
-	if (!rval)
-#endif
+
 	/* Inform all the possible director nodes */
-	/* only from master director node */
-	if (info->dnode == this_node)
+	if (*rval != -EBADR)
 		(void) pdirector_update(info, port, rip, 0, protocol, 0, 0);
 }
 
@@ -975,7 +936,7 @@
 
 	/* Allow this to run only on cvip master director node */
 	if ((info = get_director(dipaddr))) {
-		if (info->dnode == this_node) {
+		if (__is_master_director(info)) {
 			put_director(info);
 			/* TODO: Could optimize away get_director() in path:
 			 * set_master_director, ripvs_setdirector, modify_director,


------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk