Browse Source

[master] Merge branch 'trac2784' correct perfdhcp crash on mismatched
command line parameters.

Thomas Markwalder 12 years ago
parent
commit
96b66c0c79

+ 13 - 5
tests/tools/perfdhcp/test_control.cc

@@ -592,19 +592,27 @@ TestControl::openSocket() const {
     std::string localname = options.getLocalName();
     std::string localname = options.getLocalName();
     std::string servername = options.getServerName();
     std::string servername = options.getServerName();
     uint16_t port = options.getLocalPort();
     uint16_t port = options.getLocalPort();
-    uint8_t family = AF_INET;
     int sock = 0;
     int sock = 0;
+
+    uint8_t family = (options.getIpVersion() == 6) ? AF_INET6 : AF_INET; 
     IOAddress remoteaddr(servername);
     IOAddress remoteaddr(servername);
+    
+    // Check for mismatch between IP option and server address
+    if (family != remoteaddr.getFamily()) {
+        isc_throw(InvalidParameter, 
+                  "Values for IP version: " <<  
+                  static_cast<unsigned int>(options.getIpVersion()) <<
+                  " and server address: " << servername << " are mismatched."); 
+    }
+
     if (port == 0) {
     if (port == 0) {
-        if (options.getIpVersion() == 6) {
+        if (family == AF_INET6) {
             port = DHCP6_CLIENT_PORT;
             port = DHCP6_CLIENT_PORT;
         } else if (options.getIpVersion() == 4) {
         } else if (options.getIpVersion() == 4) {
             port = 67; //  TODO: find out why port 68 is wrong here.
             port = 67; //  TODO: find out why port 68 is wrong here.
         }
         }
     }
     }
-    if (options.getIpVersion() == 6) {
-        family = AF_INET6;
-    }
+
     // Local name is specified along with '-l' option.
     // Local name is specified along with '-l' option.
     // It may point to interface name or local address.
     // It may point to interface name or local address.
     if (!localname.empty()) {
     if (!localname.empty()) {

+ 12 - 0
tests/tools/perfdhcp/tests/test_control_unittest.cc

@@ -672,6 +672,18 @@ TEST_F(TestControlTest, GenerateDuid) {
     testDuid();
     testDuid();
 }
 }
 
 
+TEST_F(TestControlTest, MisMatchVerionServer) {
+    NakedTestControl tc;
+
+    // make sure we catch -6 paired with v4 address
+    ASSERT_NO_THROW(processCmdLine("perfdhcp -l 127.0.0.1 -6 192.168.1.1"));
+    EXPECT_THROW(tc.openSocket(), isc::InvalidParameter);
+
+    // make sure we catch -4 paired with v6 address
+    ASSERT_NO_THROW(processCmdLine("perfdhcp -l 127.0.0.1 -4 ff02::1:2"));
+    EXPECT_THROW(tc.openSocket(), isc::InvalidParameter);
+}
+
 TEST_F(TestControlTest, GenerateMacAddress) {
 TEST_F(TestControlTest, GenerateMacAddress) {
     // Simulate one client only. Always the same MAC address will be
     // Simulate one client only. Always the same MAC address will be
     // generated.
     // generated.