summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2016-08-18 14:40:20 +0200
committerAnatol Belski <ab@php.net>2016-08-18 14:40:20 +0200
commitb81a073b856b6f12025013361e2567a82f9b99d0 (patch)
tree5594cb3f911aa7cf063083f1b8f420167aad4b2b
parenta2ee13b5ea9c2b69661bf0e440091ccaceeb49f5 (diff)
parent67f8c14c297cf2c3d1fdf9f5143603b6d09ebbc5 (diff)
downloadphp-git-b81a073b856b6f12025013361e2567a82f9b99d0.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: Fixed bug #72858 shm_attach null dereference
-rw-r--r--TSRM/tsrm_win32.c10
-rw-r--r--ext/sysvshm/tests/bug72858.phpt20
2 files changed, 30 insertions, 0 deletions
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index b6002bea84..c080f17a7c 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -715,6 +715,7 @@ TSRM_API int shmget(int key, int size, int flags)
TSRM_API void *shmat(int key, const void *shmaddr, int flags)
{
shm_pair *shm = shm_get(key, NULL);
+ int err;
if (!shm->segment) {
return (void*)-1;
@@ -726,6 +727,15 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags)
shm->addr = MapViewOfFileEx(shm->segment, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL);
+ err = GetLastError();
+ if (err) {
+ /* Catch more errors */
+ if (ERROR_NOT_ENOUGH_MEMORY == err) {
+ _set_errno(ENOMEM);
+ }
+ return (void*)-1;
+ }
+
return shm->addr;
}
diff --git a/ext/sysvshm/tests/bug72858.phpt b/ext/sysvshm/tests/bug72858.phpt
new file mode 100644
index 0000000000..087329e2df
--- /dev/null
+++ b/ext/sysvshm/tests/bug72858.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #72858 shm_attach null dereference
+--SKIPIF--
+<?php
+if (!extension_loaded("sysvshm")){ print 'skip'; }
+if (4 < PHP_INT_SIZE) { print "skip 32-bit only"; }
+if( substr(PHP_OS, 0, 3) != "WIN" ) { print "skip windows only" }
+?>
+--FILE--
+<?php
+
+$v1=100;
+$v2=0xffffffff / 4 + 0x1337;
+shm_attach($v1,$v2);
+
+?>
+==DONE==
+--EXPECTF--
+Warning: shm_attach(): failed for key 0x64: Not enough space in %s on line %d
+==DONE==