@@ -948,6 +948,7 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
948948 if (handler -> flags & PHP_OUTPUT_HANDLER_USER ) {
949949 zval ob_args [2 ];
950950 zval retval ;
951+ ZVAL_UNDEF (& retval );
951952
952953 /* ob_data */
953954 ZVAL_STRINGL (& ob_args [0 ], handler -> buffer .data , handler -> buffer .used );
@@ -959,17 +960,33 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
959960 handler -> func .user -> fci .params = ob_args ;
960961 handler -> func .user -> fci .retval = & retval ;
961962
962- #define PHP_OUTPUT_USER_SUCCESS (retval ) ((Z_TYPE(retval) != IS_UNDEF) && !(Z_TYPE(retval) == IS_FALSE))
963- if (SUCCESS == zend_call_function (& handler -> func .user -> fci , & handler -> func .user -> fcc ) && PHP_OUTPUT_USER_SUCCESS (retval )) {
964- /* user handler may have returned TRUE */
965- status = PHP_OUTPUT_HANDLER_NO_DATA ;
966- if (Z_TYPE (retval ) != IS_FALSE && Z_TYPE (retval ) != IS_TRUE ) {
967- convert_to_string (& retval );
968- if (Z_STRLEN (retval )) {
969- context -> out .data = estrndup (Z_STRVAL (retval ), Z_STRLEN (retval ));
970- context -> out .used = Z_STRLEN (retval );
971- context -> out .free = 1 ;
972- status = PHP_OUTPUT_HANDLER_SUCCESS ;
963+ if (SUCCESS == zend_call_function (& handler -> func .user -> fci , & handler -> func .user -> fcc ) && Z_TYPE (retval ) != IS_UNDEF ) {
964+ if (Z_TYPE (retval ) != IS_STRING ) {
965+ // Make sure that we don't get lost in an output buffer
966+ int old_flags = OG (flags );
967+ OG (flags ) = old_flags & (~PHP_OUTPUT_ACTIVATED );
968+ php_error_docref (
969+ NULL ,
970+ E_DEPRECATED ,
971+ "Returning a non-string result from user output handler %s is deprecated" ,
972+ ZSTR_VAL (handler -> name )
973+ );
974+ OG (flags ) = old_flags ;
975+ }
976+ if (Z_TYPE (retval ) == IS_FALSE ) {
977+ /* call failed, pass internal buffer along */
978+ status = PHP_OUTPUT_HANDLER_FAILURE ;
979+ } else {
980+ /* user handler may have returned TRUE */
981+ status = PHP_OUTPUT_HANDLER_NO_DATA ;
982+ if (Z_TYPE (retval ) != IS_FALSE && Z_TYPE (retval ) != IS_TRUE ) {
983+ convert_to_string (& retval );
984+ if (Z_STRLEN (retval )) {
985+ context -> out .data = estrndup (Z_STRVAL (retval ), Z_STRLEN (retval ));
986+ context -> out .used = Z_STRLEN (retval );
987+ context -> out .free = 1 ;
988+ status = PHP_OUTPUT_HANDLER_SUCCESS ;
989+ }
973990 }
974991 }
975992 } else {
0 commit comments