]> granicus.if.org Git - php/commitdiff
- Small ajustments to some multicast options.
authorGustavo André dos Santos Lopes <cataphract@php.net>
Sat, 26 Nov 2011 17:48:52 +0000 (17:48 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Sat, 26 Nov 2011 17:48:52 +0000 (17:48 +0000)
ext/sockets/sockets.c
ext/sockets/tests/mcast_ipv4_send_error.phpt [new file with mode: 0644]

index 897c330841c60c23d31fd7c44030d327c932b0e7..6da58619077b5e368a9e2a67fbd7967bb60f8582 100644 (file)
@@ -2189,8 +2189,16 @@ PHP_FUNCTION(socket_set_option)
                        goto dosockopt;
 
                case IP_MULTICAST_LOOP:
+                       convert_to_boolean_ex(arg4);
+                       goto ipv4_loop_ttl;
                case IP_MULTICAST_TTL:
                        convert_to_long_ex(arg4);
+                       if (Z_LVAL_PP(arg4) < 0L || Z_LVAL_PP(arg4) > 255L) {
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING,
+                                               "Expected a value between 0 and 255");
+                               RETURN_FALSE;
+                       }
+ipv4_loop_ttl:
                        ipv4_mcast_ttl_lback = (unsigned char) Z_LVAL_PP(arg4);
                        opt_ptr = &ipv4_mcast_ttl_lback;
                        optlen  = sizeof(ipv4_mcast_ttl_lback);
@@ -2225,8 +2233,16 @@ PHP_FUNCTION(socket_set_option)
                        goto dosockopt;
 
                case IPV6_MULTICAST_LOOP:
+                       convert_to_boolean_ex(arg4);
+                       goto ipv6_loop_hops;
                case IPV6_MULTICAST_HOPS:
                        convert_to_long_ex(arg4);
+                       if (Z_LVAL_PP(arg4) < -1L || Z_LVAL_PP(arg4) > 255L) {
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING,
+                                               "Expected a value between -1 and 255");
+                               RETURN_FALSE;
+                       }
+ipv6_loop_hops:
                        ov = (int) Z_LVAL_PP(arg4);
                        opt_ptr = &ov;
                        optlen  = sizeof(ov);
diff --git a/ext/sockets/tests/mcast_ipv4_send_error.phpt b/ext/sockets/tests/mcast_ipv4_send_error.phpt
new file mode 100644 (file)
index 0000000..5cd3d8e
--- /dev/null
@@ -0,0 +1,79 @@
+--TEST--
+Multicast support: IPv4 send options with unusual values
+--SKIPIF--
+<?php
+if (!extension_loaded('sockets')) {
+    die('skip sockets extension not available.');
+}
+if (socket_set_option($s, $level, IP_MULTICAST_IF, 1) === false) {
+       die("skip interface 1 either doesn't exist or has no ipv4 address");
+}
+--FILE--
+<?php
+$domain = AF_INET;
+$level = IPPROTO_IP;
+$s = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err");
+
+echo "Setting IP_MULTICAST_LOOP with 256\n";
+//if we had a simple cast to unsigned char, this would be the same as 0
+$r = socket_set_option($s, $level, IP_MULTICAST_LOOP, 256);
+var_dump($r);
+$r = socket_get_option($s, $level, IP_MULTICAST_LOOP);
+var_dump($r);
+echo "\n";
+
+echo "Setting IP_MULTICAST_LOOP with false\n";
+//should convert to (unsigned char)0
+$r = socket_set_option($s, $level, IP_MULTICAST_LOOP, false);
+var_dump($r);
+$r = socket_get_option($s, $level, IP_MULTICAST_LOOP);
+var_dump($r);
+echo "\n";
+
+echo "Setting IP_MULTICAST_TTL with 256\n";
+//if we had a simple cast to unsigned char, this would be the same as 0
+$r = socket_set_option($s, $level, IP_MULTICAST_TTL, 256);
+var_dump($r);
+$r = socket_get_option($s, $level, IP_MULTICAST_TTL);
+var_dump($r);
+echo "\n";
+
+echo "Setting IP_MULTICAST_TTL with \"254\"\n";
+$r = socket_set_option($s, $level, IP_MULTICAST_TTL, "254");
+var_dump($r);
+$r = socket_get_option($s, $level, IP_MULTICAST_TTL);
+var_dump($r);
+echo "\n";
+
+echo "Setting IP_MULTICAST_TTL with -1\n";
+//should give error, not be the same as 255
+$r = socket_set_option($s, $level, IP_MULTICAST_TTL, -1);
+var_dump($r);
+$r = socket_get_option($s, $level, IP_MULTICAST_TTL);
+var_dump($r);
+echo "\n";
+
+--EXPECTF--
+Setting IP_MULTICAST_LOOP with 256
+bool(true)
+int(1)
+
+Setting IP_MULTICAST_LOOP with false
+bool(true)
+int(0)
+
+Setting IP_MULTICAST_TTL with 256
+
+Warning: socket_set_option(): Expected a value between 0 and 255 in %s on line %d
+bool(false)
+int(1)
+
+Setting IP_MULTICAST_TTL with "254"
+bool(true)
+int(254)
+
+Setting IP_MULTICAST_TTL with -1
+
+Warning: socket_set_option(): Expected a value between 0 and 255 in %s on line %d
+bool(false)
+int(254)