@@ -1397,12 +1397,12 @@ function _setup_segments($gi)
13971397 $gi -> databaseType = GEOIP_COUNTRY_EDITION ;
13981398 $gi -> record_length = STANDARD_RECORD_LENGTH ;
13991399 if ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1400- $offset = @ shmop_size ($gi -> shmid ) - 3 ;
1400+ $offset = shmop_size ($gi -> shmid ) - 3 ;
14011401 for ($i = 0 ; $i < STRUCTURE_INFO_MAX_SIZE ; $i ++ ) {
1402- $delim = @ shmop_read ($gi -> shmid , $offset , 3 );
1402+ $delim = shmop_read ($gi -> shmid , $offset , 3 );
14031403 $offset += 3 ;
14041404 if ($delim == (chr (255 ) . chr (255 ) . chr (255 ))) {
1405- $gi -> databaseType = ord (@ shmop_read ($gi -> shmid , $offset , 1 ));
1405+ $gi -> databaseType = ord (shmop_read ($gi -> shmid , $offset , 1 ));
14061406 if ($gi -> databaseType >= 106 ) {
14071407 $gi -> databaseType -= 105 ;
14081408 }
@@ -1432,7 +1432,7 @@ function _setup_segments($gi)
14321432 || ($gi -> databaseType == GEOIP_ASNUM_EDITION_V6 )
14331433 ) {
14341434 $gi -> databaseSegments = 0 ;
1435- $buf = @ shmop_read ($gi -> shmid , $offset , SEGMENT_RECORD_LENGTH );
1435+ $buf = shmop_read ($gi -> shmid , $offset , SEGMENT_RECORD_LENGTH );
14361436 for ($j = 0 ; $j < SEGMENT_RECORD_LENGTH ; $j ++ ) {
14371437 $gi -> databaseSegments += (ord ($buf [$j ]) << ($j * 8 ));
14381438 }
@@ -1494,6 +1494,7 @@ function _setup_segments($gi)
14941494 || ($gi -> databaseType == GEOIP_ASNUM_EDITION_V6 )
14951495 ) {
14961496 $gi -> databaseSegments = 0 ;
1497+
14971498 $buf = fread ($gi -> filehandle , SEGMENT_RECORD_LENGTH );
14981499 for ($j = 0 ; $j < SEGMENT_RECORD_LENGTH ; $j ++ ) {
14991500 $gi -> databaseSegments += (ord ($buf [$j ]) << ($j * 8 ));
@@ -1525,12 +1526,20 @@ function _setup_segments($gi)
15251526 return $gi ;
15261527}
15271528
1529+ # This should be only used for variable-length records where
1530+ # $start + $maxLength may be greater than the shared mem size
1531+ function _sharedMemRead ($gi , $start , $maxLength )
1532+ {
1533+ $readLength = min (shmop_size ($gi -> shmid ) - $start , $maxLength );
1534+ return shmop_read ($gi -> shmid , $start , $readLength );
1535+ }
1536+
15281537function geoip_open ($filename , $flags )
15291538{
15301539 $gi = new GeoIP ;
15311540 $gi -> flags = $flags ;
15321541 if ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1533- $gi -> shmid = @ shmop_open (GEOIP_SHM_KEY , "a" , 0 , 0 );
1542+ $gi -> shmid = shmop_open (GEOIP_SHM_KEY , "a" , 0 , 0 );
15341543 } else {
15351544 $gi -> filehandle = fopen ($filename , "rb" ) or trigger_error ("GeoIP API: Can not open $filename\n" , E_USER_ERROR );
15361545 if ($gi -> flags & GEOIP_MEMORY_CACHE ) {
@@ -1686,8 +1695,7 @@ function _geoip_seek_country_v6($gi, $ipnum)
16861695 2 * $gi -> record_length
16871696 );
16881697 } elseif ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1689- $buf = @shmop_read (
1690- $gi -> shmid ,
1698+ $buf = _sharedMemRead ($gi ,
16911699 2 * $gi -> record_length * $offset ,
16921700 2 * $gi -> record_length
16931701 );
@@ -1733,8 +1741,8 @@ function _geoip_seek_country($gi, $ipnum)
17331741 2 * $gi -> record_length
17341742 );
17351743 } elseif ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1736- $buf = @ shmop_read (
1737- $gi -> shmid ,
1744+ $buf = _sharedMemRead (
1745+ $gi ,
17381746 2 * $gi -> record_length * $offset ,
17391747 2 * $gi -> record_length
17401748 );
@@ -1769,7 +1777,7 @@ function _common_get_org($gi, $seek_org)
17691777{
17701778 $record_pointer = $seek_org + (2 * $gi -> record_length - 1 ) * $gi -> databaseSegments ;
17711779 if ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1772- $org_buf = @ shmop_read ($gi -> shmid , $record_pointer , MAX_ORG_RECORD_LENGTH );
1780+ $org_buf = _sharedMemRead ($gi , $record_pointer , MAX_ORG_RECORD_LENGTH );
17731781 } else {
17741782 fseek ($gi -> filehandle , $record_pointer , SEEK_SET );
17751783 $org_buf = fread ($gi -> filehandle , MAX_ORG_RECORD_LENGTH );
0 commit comments