Commit 949fdc41d9f for php.net
commit 949fdc41d9fc2f5a0d39b8eca381a4a8f5dabe99
Merge: a0d06f1c296 af780bc2fa1
Author: Ilia Alshanetsky <ilia@ilia.ws>
Date: Fri Jul 31 16:46:55 2026 -0400
Merge branch 'PHP-8.5'
* PHP-8.5:
ext/sysvshm: don't orphan the segment shm_attach() just created
diff --cc ext/sysvshm/sysvshm.c
index 6ca06be935d,179fe0ed139..24403290677
--- a/ext/sysvshm/sysvshm.c
+++ b/ext/sysvshm/sysvshm.c
@@@ -126,17 -130,11 +126,18 @@@ PHP_FUNCTION(shm_attach
sysvshm_shm *shm_list_ptr;
char *shm_ptr;
sysvshm_chunk_head *chunk_ptr;
- zend_long shm_key, shm_id, shm_size, shm_flag = 0666;
- bool shm_size_is_null = 1;
+ zend_long shm_key_arg, shm_id, shm_size, shm_flag = 0666;
+ key_t shm_key;
+ bool shm_size_is_null = true;
+ bool created = false;
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &shm_key, &shm_size, &shm_size_is_null, &shm_flag)) {
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &shm_key_arg, &shm_size, &shm_size_is_null, &shm_flag)) {
+ RETURN_THROWS();
+ }
+
+ shm_key = (key_t) shm_key_arg;
+ if ((zend_long) shm_key != shm_key_arg) {
+ zend_argument_value_error(1, "is out of range");
RETURN_THROWS();
}
@@@ -156,13 -154,17 +157,17 @@@
RETURN_FALSE;
}
if ((shm_id = shmget(shm_key, shm_size, shm_flag | IPC_CREAT | IPC_EXCL)) < 0) {
- php_error_docref(NULL, E_WARNING, "Failed for key 0x" ZEND_XLONG_FMT ": %s", shm_key, strerror(errno));
+ php_error_docref(NULL, E_WARNING, "Failed for key 0x" ZEND_XLONG_FMT ": %s", shm_key_arg, strerror(errno));
RETURN_FALSE;
}
+ created = true;
}
if ((shm_ptr = shmat(shm_id, NULL, 0)) == (void *) -1) {
- php_error_docref(NULL, E_WARNING, "Failed for key 0x" ZEND_XLONG_FMT ": %s", shm_key, strerror(errno));
+ php_error_docref(NULL, E_WARNING, "Failed for key 0x" ZEND_XLONG_FMT ": %s", shm_key_arg, strerror(errno));
+ if (created) {
+ shmctl(shm_id, IPC_RMID, NULL);
+ }
RETURN_FALSE;
}