iliaa           Tue Jan 13 18:31:46 2004 EDT

  Added files:                 (Branch: PHP_4_3)
    /php-src/ext/standard/tests/strings bug26878.phpt 

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/standard       formatted_print.c 
  Log:
  MFH: Fixed bug #26878 (problem with multiple references to the same variable 
  with different types).
  
  
Index: php-src/NEWS
diff -u php-src/NEWS:1.1247.2.523 php-src/NEWS:1.1247.2.524
--- php-src/NEWS:1.1247.2.523   Tue Jan 13 14:00:17 2004
+++ php-src/NEWS        Tue Jan 13 18:31:44 2004
@@ -1,5 +1,10 @@
 PHP 4                                                                      NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+?? Jan 2004, Version 4.3.5
+- Fixed bug #26878 (problem with multiple references to the same variable 
+  with different types). (Ilia)
+- Fixed bug #26896 (ext/ftp does not work as shared extension). (Jani)
+
 12 Jan 2004, Version 4.3.5RC1
 - Synchronized bundled GD library with GD 2.0.17
 - Upgraded PCRE library to version 4.5. (Andrei)
@@ -10,7 +15,6 @@
 - Added a warning when creating temp stream fails with ftp_(n)list(). (Sara)
 - Fixed header handler in NSAPI SAPI module (header->replace was ignored,
   send_default_content_type now sends value from php.ini). (Uwe Schindler)
-- Fixed bug #26896 (ext/ftp does not work as shared extension). (Jani)
 - Fixed bug #26864 (pg_(update|delete) ignore PGSQL_DML_EXEC option). (Ilia)
 - Fixed bug #26847 (memory leak in mail() when to/subject contain only spaces).
   (Ilia)
Index: php-src/ext/standard/formatted_print.c
diff -u php-src/ext/standard/formatted_print.c:1.59.2.5 
php-src/ext/standard/formatted_print.c:1.59.2.6
--- php-src/ext/standard/formatted_print.c:1.59.2.5     Fri May 30 09:50:09 2003
+++ php-src/ext/standard/formatted_print.c      Tue Jan 13 18:31:45 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: formatted_print.c,v 1.59.2.5 2003/05/30 13:50:09 moriyoshi Exp $ */
+/* $Id: formatted_print.c,v 1.59.2.6 2004/01/13 23:31:45 iliaa Exp $ */
 
 #include <math.h>                              /* modf() */
 #include "php.h"
@@ -499,7 +499,8 @@
        currarg = 1;
 
        while (inpos<Z_STRLEN_PP(args[0])) {
-               int expprec = 0;
+               int expprec = 0, multiuse = 0;
+               zval *tmp;
 
                PRINTF_DEBUG(("sprintf: format[%d]='%c'\n", inpos, format[inpos]));
                PRINTF_DEBUG(("sprintf: outpos=%d\n", outpos));
@@ -537,7 +538,8 @@
                                                php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Zero is not a valid argument number");
                                                return NULL;
                                        }
-       
+
+                                       multiuse = 1;
                                        inpos++;  /* skip the '$' */
                                } else {
                                        argnum = currarg++;
@@ -608,29 +610,37 @@
                        }
                        PRINTF_DEBUG(("sprintf: format character='%c'\n", 
format[inpos]));
                        /* now we expect to find a type specifier */
+                       if (multiuse) {
+                               MAKE_STD_ZVAL(tmp);
+                               *tmp = **(args[argnum]);
+                               zval_copy_ctor(tmp);
+                       } else {
+                               tmp = *(args[argnum]);
+                       }
+
                        switch (format[inpos]) {
                                case 's':
-                                       convert_to_string_ex(args[argnum]);
+                                       convert_to_string(tmp);
                                        php_sprintf_appendstring(&result, &outpos, 
&size,
-                                                                                      
  Z_STRVAL_PP(args[argnum]),
+                                                                                      
  Z_STRVAL_P(tmp),
                                                                                       
  width, precision, padding,
                                                                                       
  alignment,
-                                                                                      
  Z_STRLEN_PP(args[argnum]),
+                                                                                      
  Z_STRLEN_P(tmp),
                                                                                       
  0, expprec);
                                        break;
 
                                case 'd':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_appendint(&result, &outpos, &size,
-                                                                                 
Z_LVAL_PP(args[argnum]),
+                                                                                 
Z_LVAL_P(tmp),
                                                                                  
width, padding, alignment,
                                                                                  
always_sign);
                                        break;
 
                                case 'u':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_appenduint(&result, &outpos, &size,
-                                                                                 
Z_LVAL_PP(args[argnum]),
+                                                                                 
Z_LVAL_P(tmp),
                                                                                  
width, padding, alignment,
                                                                                  
always_sign);
                                        break;
@@ -638,9 +648,9 @@
                                case 'e':
                                case 'f':
                                        /* XXX not done */
-                                       convert_to_double_ex(args[argnum]);
+                                       convert_to_double(tmp);
                                        php_sprintf_appenddouble(&result, &outpos, 
&size,
-                                                                                      
  Z_DVAL_PP(args[argnum]),
+                                                                                      
  Z_DVAL_P(tmp),
                                                                                       
  width, padding, alignment,
                                                                                       
  precision, adjusting,
                                                                                       
  format[inpos], always_sign
@@ -648,39 +658,39 @@
                                        break;
                                        
                                case 'c':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_appendchar(&result, &outpos, &size,
-                                                                               (char) 
Z_LVAL_PP(args[argnum]) TSRMLS_CC);
+                                                                               (char) 
Z_LVAL_P(tmp) TSRMLS_CC);
                                        break;
 
                                case 'o':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_append2n(&result, &outpos, &size,
-                                                                                
Z_LVAL_PP(args[argnum]),
+                                                                                
Z_LVAL_P(tmp),
                                                                                 
width, padding, alignment, 3,
                                                                                 
hexchars, expprec);
                                        break;
 
                                case 'x':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_append2n(&result, &outpos, &size,
-                                                                                
Z_LVAL_PP(args[argnum]),
+                                                                                
Z_LVAL_P(tmp),
                                                                                 
width, padding, alignment, 4,
                                                                                 
hexchars, expprec);
                                        break;
 
                                case 'X':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_append2n(&result, &outpos, &size,
-                                                                                
Z_LVAL_PP(args[argnum]),
+                                                                                
Z_LVAL_P(tmp),
                                                                                 
width, padding, alignment, 4,
                                                                                 
HEXCHARS, expprec);
                                        break;
 
                                case 'b':
-                                       convert_to_long_ex(args[argnum]);
+                                       convert_to_long(tmp);
                                        php_sprintf_append2n(&result, &outpos, &size,
-                                                                                
Z_LVAL_PP(args[argnum]),
+                                                                                
Z_LVAL_P(tmp),
                                                                                 
width, padding, alignment, 1,
                                                                                 
hexchars, expprec);
                                        break;
@@ -692,6 +702,9 @@
                                default:
                                        break;
                        }
+                       if (multiuse) {
+                               zval_ptr_dtor(&tmp);
+                       }
                        inpos++;
                }
        }

Index: php-src/ext/standard/tests/strings/bug26878.phpt
+++ php-src/ext/standard/tests/strings/bug26878.phpt
--TEST--
Bug #26878 (problem with multiple references to the same variable with different types)
--FILE--
<?php
        printf('Int: %1$d and as string: %1$s', 'some string');
        echo "\n";
?>
--EXPECT--
Int: 0 and as string: some string

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to