From:             benoit dot sibaud at rd dot francetelecom dot com
Operating system: Debian GNU/Linux Woody
PHP version:      4.3.4
PHP Bug Type:     YP/NIS related
Bug description:  Bad results in yp_first/yp_next with a Solaris NIS server

Description:
------------
YP/NIS server is a Solaris 2.7 Sparc.
PHP clients are Debian GNU/Linux Intel (several versions). (php version
4.1.2, at the beginning).

It looks like there is some problems with (non)null terminated strings in
yp_first and yp_next functions.

The following patch sanitizes the outkey in yp_first and yp_next (code
taken from yp_cat), and removes the unneeded warning from bug #12345, "[16
Oct 2002 9:14am EDT] tshort at cisco dot com"

--- php-4.3.4/ext/yp/yp.c       2003-09-26 12:13:30.000000000 +0200
+++ php-4.1.2-patched/ext/yp/yp.c       2003-11-13 09:48:32.000000000
+0100
@@ -167,7 +167,7 @@
 PHP_FUNCTION(yp_first)
 {
        pval **domain, **map;
-       char *outval, *outkey;
+       char *outval, *outkey, *goodkey;
        int outvallen, outkeylen;

        if((ZEND_NUM_ARGS() != 2) ||
zend_get_parameters_ex(2,&domain,&map) == FAILURE) {
@@ -182,7 +182,15 @@
                RETURN_FALSE;
        }
        array_init(return_value);
-      
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);
+       goodkey = emalloc(outkeylen+1);
+       if(goodkey) {
+               strlcpy(goodkey, outkey, outkeylen+1);
+               add_assoc_stringl_ex(return_value, goodkey, outkeylen+1,
outval, outvallen, 1);
+               efree(goodkey);
+       } else {
+               php_error(E_WARNING, "Can't allocate %d bytes for key
buffer in yp_next()", outkeylen+1);
+       }
+/*    
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);*/

        /* Deprecated */
        add_assoc_stringl(return_value,"key",outkey,outkeylen,1);
@@ -195,7 +203,7 @@
 PHP_FUNCTION(yp_next)
 {
        pval **domain, **map, **key;
-       char *outval, *outkey;
+       char *outval, *outkey, *goodkey;
        int outvallen, outkeylen;

        if((ZEND_NUM_ARGS() != 3) ||
zend_get_parameters_ex(3,&domain,&map,&key) == FAILURE) {
@@ -207,12 +215,20 @@
        convert_to_string_ex(key);

        if((YP(error) = yp_next(Z_STRVAL_PP (domain), Z_STRVAL_PP (map),
Z_STRVAL_PP (key), Z_STRLEN_PP (key), &outkey, &outkeylen, &outval,
&outvallen))) {
-               php_error(E_WARNING, yperr_string (YP(error)));
+               /*php_error(E_WARNING, yperr_string (YP(error)));*/
                RETURN_FALSE;
        }
        array_init(return_value);
-      
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);
+       goodkey = emalloc(outkeylen+1);
+       if(goodkey) {
+               strlcpy(goodkey, outkey, outkeylen+1);
+               add_assoc_stringl_ex(return_value, goodkey, outkeylen+1,
outval, outvallen, 1);
+               efree(goodkey);
+       } else {
+               php_error(E_WARNING, "Can't allocate %d bytes for key
buffer in yp_next()", outkeylen+1);
+       }
+/*    
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);
*/
 }
 /* }}} */


Reproduce code:
---------------
<?php
$entry = yp_first($domain, $map);
$key = $entry ["key"];
echo "key #" . $key . "# value #" . $entry["value"]."#\n";

while ($entry) {
  $entry = yp_next($domain, $map, $key);
  if ($entry) {
    $key = key ($entry);
    $yplist[$key] = $entry[$key];
    echo "key #" . $key . "# value #" . $entry[$key]."#\n";
  } 
}
?>


Expected result:
----------------
### With PHP 3.0.18 (from Debian GNU/Linux Woody), this script works.

key #goodkey1# value #goodvalue1#
key #goodkey2# value #goodvalue2#
(...)
key #goodkey3# value #goodvalue3#

### With PHP 4.1.2 (from Debian GNU/Linux Woody) + php-4.3.4/ext/yp/yp.c +
patch

It works.

Actual result:
--------------
### With PHP 4.1.2 (from Debian GNU/Linux Woody), this script fails.

key #goodkey1# value #goodvalue1#
key #goodkey2# value ##
(...)
key #goodkey3# value ##
<br />
<b>Warning</b>:  No more records in map database in <b>foobar.php</b> on
line <b>11</b><br />

Debug with serialization and print_r:

a:3:{s:7:"goodkey1_without_last_char";s:99:"goodvalue1";s:3:"key";s:8:"goodkey1";s:5:"value";s:99:"goodvalue1";}
Array
(
    [goodkey1+garbage] => goodvalue1
    [key] => goodkey1
    [value] => goodvalue1
)
key #goodkey1# value #goodvalue1#
a:1:{s:7:"goodkey2_without_last_char";s:93:"goodvalue2";}
Array
(
    [goodkey2+garbage] => goodvalue2
)
key #goodkey2# value ##

### With PHP 4.1.2 (from Debian GNU/Linux Woody) + php-4.3.4/ext/yp/yp.c
(I believe it's equivalent to a full PHP 4.3.4 for this test)

Same wrong results.

-- 
Edit bug report at http://bugs.php.net/?id=26235&edit=1
-- 
Try a CVS snapshot (php4):  http://bugs.php.net/fix.php?id=26235&r=trysnapshot4
Try a CVS snapshot (php5):  http://bugs.php.net/fix.php?id=26235&r=trysnapshot5
Fixed in CVS:               http://bugs.php.net/fix.php?id=26235&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=26235&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=26235&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=26235&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=26235&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=26235&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=26235&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=26235&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=26235&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=26235&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=26235&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=26235&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=26235&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=26235&r=float

Reply via email to