From:             discussion at vodopivec dot com
Operating system: Linux
PHP version:      4.3.1
PHP Bug Type:     Strings related
Bug description:  shmop_read should return string length, not shm segment size

My opinion is that shmop_read function has wrong behaviour, returning
'count' parameter as the length of the string, instead of real length of
the string, up to the terminating zero.
 
This should be easy to fix, in fact I already did, but 
someone should apply this patch - in shmop_read, 
instead of
 
RETURN_STRINGL(return_string, bytes, 0);
 
you can use 
 
RETURN_STRINGL(return_string, strlen(return_string), 0);
 
Below is the php code that demonstrates this problem.
 
Thanks,
 
Mario.
 
<?php
 
  $buffer = "12345";
 
  // Create 100 byte shared memory block with system id if 0xff3
  $shm_id = shmop_open(0xff3, "c", 0644, 100);
  if(!$shm_id) {
    echo "Couldn't create shared memory segment\n";
  }
 
  // Get shared memory block's size
  $shm_size = shmop_size($shm_id);
  echo "SHM Block Size: ".$shm_size. " has been created.\n";
 
  // Lets write a test string into shared memory
  $shm_bytes_written = shmop_write($shm_id, $buffer, 0);
  if($shm_bytes_written != strlen($buffer)) {
    echo "Couldn't write the entire length of data\n";
  }
 
  // Now lets read the string back
  $my_string = shmop_read($shm_id, 0, $shm_size);
  if(!$my_string) {
    echo "Couldn't read from shared memory block\n";
  }
  echo "The data inside shared memory was: ".$my_string."<br>\n";
 
  if ($my_string != $buffer)
  {
    print "This is where it doesn't make sense"."<br>\n";
    print "buffer len = ".strlen($buffer)."<br>\n";
    print "my string len = ".strlen($my_string)."<br>\n";
  }
 
  //Now lets delete the block and close the shared memory segment
  if(!shmop_delete($shm_id)) {
    echo "Couldn't mark shared memory block for deletion.";
  }
  else
    echo "Deleted shm block";
 
  shmop_close($shm_id);
 
?>
 
-- 
Edit bug report at http://bugs.php.net/?id=22882&edit=1
-- 
Try a CVS snapshot:         http://bugs.php.net/fix.php?id=22882&r=trysnapshot
Fixed in CVS:               http://bugs.php.net/fix.php?id=22882&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=22882&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=22882&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=22882&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=22882&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=22882&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=22882&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=22882&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=22882&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=22882&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=22882&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=22882&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=22882&r=gnused

Reply via email to