#21547 [Bgs->Opn]: segfault in _erealloc

From: Date: Thu, 09 Jan 2003 16:23:40 +0000
Subject: #21547 [Bgs->Opn]: segfault in _erealloc
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-29593@lists.php.net to get a copy of this message
 ID:               21547
 User updated by:  pascal.terjan@free.fr
 Reported By:      pascal.terjan@free.fr
-Status:           Bogus
+Status:           Open
 Bug Type:         Reproducible crash
 Operating System: Linux Mandrake Cooker
 PHP Version:      4.3.0
 New Comment:

The diagnosis is strange as it crashes using about 20MB while the
memory limit is at 128MB and I have more than 200MB free...


Previous Comments:
------------------------------------------------------------------------

[2003-01-09 10:00:04] iliaa@php.net

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php

Simple, PHP has run out of memory and when it fails to allocate it
exits or if you compiled PHP with --enable-debug dies with SIG11
(segmentation fault).

------------------------------------------------------------------------

[2003-01-09 07:59:49] pascal.terjan@free.fr

This quite heavily recursive script produces a segmentation fault :
 
<?php
$depls=Array(
			'G'=>Array(-1, 0),
			'D'=>Array(1, 0),
			'B'=>Array(0, 1),
			'H'=>Array(0, -1));			

$pieces=Array(
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1),
					Array(1,0),
					Array(1,1)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0),
					Array(1,0)));

$init=Array(
			Array(0,0),
			Array(3,0),
			Array(1,3),
			Array(2,3),
			Array(1,0),
			Array(0,3),
			Array(0,4),
			Array(3,3),
			Array(3,4),
			Array(1,2));

function is_final($situation){
  return(($situation[4][0]==1)&&($situation[4][1]==3));
}

function occupable($situation, $x, $y){
  global $pieces;
  if($x>3) return false;
  if($y>4) return false;
  if($x<0) return false;
  if($y<0) return false;
  foreach($situation as $piece=>$pos){
	if($pos=="") continue;
	$p = $pieces[$piece];
	foreach($p as $case){
	  if(($case[0]+$pos[0]==$x)&&
		 ($case[1]+$pos[1]==$y)) return false;
	}
  }
  return true;
}

function valide($situation, $piece, $mov){
  global $pieces;
  $p = $pieces[$piece];
  $x = $situation[$piece][0];
  $y = $situation[$piece][1];
  $situation[$piece]="";
  foreach($p as $case){
	if(!occupable($situation, $x+$case[0]+$mov[0], $y+$case[1]+$mov[1]))
	  return false;
  }
  return true;
}

function resolv($situation){
  global $tab, $depls, $pieces, $solution;
  $d = $depls;
  $p = $pieces;
  if(is_final($situation)){
	$solution = "";
	return;
  }
  foreach($p as $num=>$piece){
	foreach($d as $nom=>$mov){
	  if(valide($situation, $num, $mov)){
		$situation2=serialize($situation);
		$s3=$situation;
		$situation[$num][0]+=$mov[0];
		$situation[$num][1]+=$mov[1];
		$s=serialize($situation);
	   	if(isset($tab[$s])){
		  $situation = $s3;
		  continue;
		}
		$tab[$s]="";
		//echo $num.' '.$nom."\n";
		//print_r($situation);
		$tab[$situation2][$s]=Array($num=>$nom);
		resolv($situation);
		if($tab[$s]=="") unset($tab[$s]);
		if(isset($solution)){
		  $solution=$num.' '.$nom."\n".$solution;
		  return;
		}
		$situation = $s3;
	  }
	}
  }
}

resolv($init);
print_r($tab);
if(isset($solution)) echo $solution;
?>

(gdb) bt
#0  0x400ed1ee in _erealloc () from /usr/lib/libphp_common.so.430
(gdb) 

I tryied it with an older PHP and also got a segfault but somewhere
else.

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=21547&edit=1



Thread (6 messages)

« previous php.bugs (#29593) next »