[netfilter-cvslog] r3783 - branches/netfilter-ha/linux-2.6-actact/ct_sync

laforge at netfilter.org laforge at netfilter.org
Thu Mar 10 19:23:11 CET 2005


Author: laforge at netfilter.org
Date: 2005-03-10 19:23:11 +0100 (Thu, 10 Mar 2005)
New Revision: 3783

Modified:
   branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c
Log:
fix parsing of address and syncdev / sysfs interface


Modified: branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c
===================================================================
--- branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c	2005-03-10 18:22:17 UTC (rev 3782)
+++ branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c	2005-03-10 18:23:11 UTC (rev 3783)
@@ -1683,17 +1683,38 @@
 	} else if (ctsi->config.addr.ss_family == AF_INET) {
 		struct sockaddr_in *si = (struct sockaddr_in *)
 						&ctsi->config.addr;
-		return sprintf(buf, "%d.%d.%d.%d\n", NIPQUAD(si->sin_addr));
+		return sprintf(buf, "%d.%d.%d.%d\n",
+			       NIPQUAD(si->sin_addr.s_addr));
 	} else
 		return -EINVAL;
 }
 
+static int strip_crlf(char *dst, const char *src, int len)
+{
+	int i;
+	for (i = 0; i < len; i++) {
+		if (src[i] == 0 || src[i] == '\n' || src[i] == '\r') {
+			dst[i] = 0;
+			break;
+		} else
+			dst[i] = src[i];
+	}
+	dst[len] = 0;
+	return i;
+}
+
 static ssize_t sysfs_addr_store(struct ct_sync_instance *ctsi,
 				const char *buf, size_t len)
 {
+#define MAXIPLEN	39	/* 4*4 hex chars plus 7 : */
+	char	ipstrbuf[MAXIPLEN+1];
+
 	if (ctsi->active != 0)
 		return -EBUSY;
-	if (strchr(buf, ':')) {
+
+	strip_crlf(ipstrbuf, buf, MAXIPLEN); 
+
+	if (strchr(ipstrbuf, ':')) {
 		struct sockaddr_in6 *si6 = (struct sockaddr_in6 *)
 						&ctsi->config.addr;
 		si6->sin6_family = AF_INET6;
@@ -1703,8 +1724,10 @@
 		struct sockaddr_in *si = (struct sockaddr_in *)
 						&ctsi->config.addr;
 		si->sin_family = AF_INET;
-		si->sin_addr.s_addr = in_aton(buf);
+		si->sin_addr.s_addr = in_aton(ipstrbuf);
 		si->sin_port = __constant_htons(1999);
+		CT_SYNC_DEBUG("setting address to %d.%d.%d.%d\n",
+				NIPQUAD(si->sin_addr.s_addr));
 	}
 	return len;
 }
@@ -1719,7 +1742,7 @@
 static ssize_t sysfs_syncdev_store(struct ct_sync_instance *ctsi,
 				   const char *buf, size_t len)
 {
-	char syncdev[IFNAMSIZ];
+	char syncdev[IFNAMSIZ+1];
 	struct net_device *sync_netdev;
 
 	if (ctsi->active != 0)
@@ -1728,16 +1751,19 @@
 	if (len >= IFNAMSIZ)
 		return -E2BIG;
 
-	strlcpy((char *)syncdev, buf, IFNAMSIZ-1);
+	strip_crlf(syncdev, buf, IFNAMSIZ); 
 
 	if ((sync_netdev = dev_get_by_name(syncdev)) != NULL) {
 		ctsi->syncdev_ifindex = sync_netdev->ifindex;
 		dev_put(sync_netdev);
 		strlcpy(ctsi->config.syncdev, syncdev, IFNAMSIZ-1);
-	} else 
+	} else  {
+		CT_SYNC_DEBUG("'%s' is not a valid network device\n",
+				syncdev);
 		return -EINVAL;
+	}
 
-	return strlen((char *)&ctsi->config.syncdev);
+	return len;
 }
 
 static ssize_t sysfs_sendburst_show(struct ct_sync_instance *ctsi,




More information about the netfilter-cvslog mailing list