]> granicus.if.org Git - php/commitdiff
Allow crypto_method context value in stream_socket_enable_crypto()
authorChris Wright <daverandom@php.net>
Thu, 27 Feb 2014 13:41:25 +0000 (13:41 +0000)
committerChris Wright <daverandom@php.net>
Thu, 27 Feb 2014 13:41:25 +0000 (13:41 +0000)
ext/standard/streamsfuncs.c

index b62344765160f9189284de4d01643d6b129ae9cd..bf6428235758e1464946eb89235599659eccb101 100644 (file)
@@ -40,6 +40,8 @@ typedef unsigned long long php_timeout_ull;
 typedef unsigned __int64 php_timeout_ull;
 #endif
 
+#define GET_CTX_OPT(stream, wrapper, name, val) (stream->context && SUCCESS == php_stream_context_get_option(stream->context, wrapper, name, &val))
+
 static php_stream_context *decode_context_param(zval *contextresource TSRMLS_DC);
 
 /* Streams based network functions */
@@ -1502,16 +1504,27 @@ PHP_FUNCTION(stream_socket_enable_crypto)
        long cryptokind = 0;
        zval *zstream, *zsessstream = NULL;
        php_stream *stream, *sessstream = NULL;
-       zend_bool enable;
+       zend_bool enable, cryptokindnull;
        int ret;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb|lr", &zstream, &enable, &cryptokind, &zsessstream) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb|l!r", &zstream, &enable, &cryptokind, &cryptokindnull, &zsessstream) == FAILURE) {
                RETURN_FALSE;
        }
 
        php_stream_from_zval(stream, &zstream);
 
-       if (ZEND_NUM_ARGS() >= 3) {
+       if (enable) {
+               if (ZEND_NUM_ARGS() < 3 || cryptokindnull) {
+                       zval **val;
+
+                       if (!GET_CTX_OPT(stream, "ssl", "crypto_method", val)) {
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "When enabling encryption you must specify the crypto type");
+                               RETURN_FALSE;
+                       }
+
+                       cryptokind = Z_LVAL_PP(val);
+               }
+
                if (zsessstream) {
                        php_stream_from_zval(sessstream, &zsessstream);
                }
@@ -1519,9 +1532,6 @@ PHP_FUNCTION(stream_socket_enable_crypto)
                if (php_stream_xport_crypto_setup(stream, cryptokind, sessstream TSRMLS_CC) < 0) {
                        RETURN_FALSE;
                }
-       } else if (enable) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "When enabling encryption you must specify the crypto type");
-               RETURN_FALSE;
        }
 
        ret = php_stream_xport_crypto_enable(stream, enable TSRMLS_CC);