@@ -1397,12 +1397,12 @@ function _setup_segments($gi)
1397
1397
$gi -> databaseType = GEOIP_COUNTRY_EDITION ;
1398
1398
$gi -> record_length = STANDARD_RECORD_LENGTH ;
1399
1399
if ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1400
- $offset = @ shmop_size ($gi -> shmid ) - 3 ;
1400
+ $offset = shmop_size ($gi -> shmid ) - 3 ;
1401
1401
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 );
1403
1403
$offset += 3 ;
1404
1404
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 ));
1406
1406
if ($gi -> databaseType >= 106 ) {
1407
1407
$gi -> databaseType -= 105 ;
1408
1408
}
@@ -1432,7 +1432,7 @@ function _setup_segments($gi)
1432
1432
|| ($gi -> databaseType == GEOIP_ASNUM_EDITION_V6 )
1433
1433
) {
1434
1434
$gi -> databaseSegments = 0 ;
1435
- $buf = @ shmop_read ($gi -> shmid , $offset , SEGMENT_RECORD_LENGTH );
1435
+ $buf = shmop_read ($gi -> shmid , $offset , SEGMENT_RECORD_LENGTH );
1436
1436
for ($j = 0 ; $j < SEGMENT_RECORD_LENGTH ; $j ++ ) {
1437
1437
$gi -> databaseSegments += (ord ($buf [$j ]) << ($j * 8 ));
1438
1438
}
@@ -1494,6 +1494,7 @@ function _setup_segments($gi)
1494
1494
|| ($gi -> databaseType == GEOIP_ASNUM_EDITION_V6 )
1495
1495
) {
1496
1496
$gi -> databaseSegments = 0 ;
1497
+
1497
1498
$buf = fread ($gi -> filehandle , SEGMENT_RECORD_LENGTH );
1498
1499
for ($j = 0 ; $j < SEGMENT_RECORD_LENGTH ; $j ++ ) {
1499
1500
$gi -> databaseSegments += (ord ($buf [$j ]) << ($j * 8 ));
@@ -1525,12 +1526,20 @@ function _setup_segments($gi)
1525
1526
return $gi ;
1526
1527
}
1527
1528
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
+
1528
1537
function geoip_open ($filename , $flags )
1529
1538
{
1530
1539
$gi = new GeoIP ;
1531
1540
$gi -> flags = $flags ;
1532
1541
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 );
1534
1543
} else {
1535
1544
$gi -> filehandle = fopen ($filename , "rb" ) or trigger_error ("GeoIP API: Can not open $filename\n" , E_USER_ERROR );
1536
1545
if ($gi -> flags & GEOIP_MEMORY_CACHE ) {
@@ -1686,8 +1695,7 @@ function _geoip_seek_country_v6($gi, $ipnum)
1686
1695
2 * $gi -> record_length
1687
1696
);
1688
1697
} elseif ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1689
- $buf = @shmop_read (
1690
- $gi -> shmid ,
1698
+ $buf = _sharedMemRead ($gi ,
1691
1699
2 * $gi -> record_length * $offset ,
1692
1700
2 * $gi -> record_length
1693
1701
);
@@ -1733,8 +1741,8 @@ function _geoip_seek_country($gi, $ipnum)
1733
1741
2 * $gi -> record_length
1734
1742
);
1735
1743
} elseif ($gi -> flags & GEOIP_SHARED_MEMORY ) {
1736
- $buf = @ shmop_read (
1737
- $gi -> shmid ,
1744
+ $buf = _sharedMemRead (
1745
+ $gi ,
1738
1746
2 * $gi -> record_length * $offset ,
1739
1747
2 * $gi -> record_length
1740
1748
);
@@ -1769,7 +1777,7 @@ function _common_get_org($gi, $seek_org)
1769
1777
{
1770
1778
$record_pointer = $seek_org + (2 * $gi -> record_length - 1 ) * $gi -> databaseSegments ;
1771
1779
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 );
1773
1781
} else {
1774
1782
fseek ($gi -> filehandle , $record_pointer , SEEK_SET );
1775
1783
$org_buf = fread ($gi -> filehandle , MAX_ORG_RECORD_LENGTH );
0 commit comments