From 2e18b30d4436d61839a387beb9dcf16eab5605a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 16 Jun 2020 16:36:11 +0200 Subject: [PATCH] Convert resource to object in Sysvshm extension Closes GH-5499 --- UPGRADING | 5 + ext/sysvsem/tests/sysv.phpt | 14 +- ext/sysvshm/php_sysvshm.h | 4 +- ext/sysvshm/sysvshm.c | 178 +++++++++++++++++------- ext/sysvshm/sysvshm.stub.php | 50 +++---- ext/sysvshm/sysvshm_arginfo.h | 21 +-- ext/sysvshm/tests/002.phpt | 68 +++++---- ext/sysvshm/tests/003.phpt | 15 +- ext/sysvshm/tests/006.phpt | 6 +- ext/sysvshm/tests/007.phpt | 10 +- ext/sysvshm/tests/shutdown_crash_0.phpt | 8 +- 11 files changed, 234 insertions(+), 145 deletions(-) diff --git a/UPGRADING b/UPGRADING index b345098b57..7e8b5971ba 100644 --- a/UPGRADING +++ b/UPGRADING @@ -448,6 +448,11 @@ PHP 8.0 UPGRADE NOTES Return value checks using is_resource() should be replaced with checks for `false`. +- Sysvshm: + . shm_attach() will now return an SysvSharedMemory object rather than a resource. + Return value checks using is_resource() should be replaced with checks + for `false`. + - tidy: . The $use_include_path parameter, which was not used internally, has been removed from tidy_repair_string(). diff --git a/ext/sysvsem/tests/sysv.phpt b/ext/sysvsem/tests/sysv.phpt index aa2e7d1041..3e8aeeaee6 100644 --- a/ext/sysvsem/tests/sysv.phpt +++ b/ext/sysvsem/tests/sysv.phpt @@ -29,13 +29,13 @@ if (! sem_acquire($sem_id)) { } echo "Success acquire semaphore.\n"; -$shm_id = shm_attach($SHMKEY, $MEMSIZE); +$shm_id = shm_attach($SHMKEY, $MEMSIZE); if ($shm_id === FALSE) { echo "Fail to attach shared memory.\n"; sem_remove($sem_id); exit; } -echo "Success to attach shared memory : $shm_id.\n"; +echo "Success to attach shared memory.\n"; // Write variable 1 if (!shm_put_var($shm_id, 1, "Variable 1")) { @@ -48,7 +48,7 @@ echo "Write var1 to shared memory.\n"; // Write variable 2 if (!shm_put_var($shm_id, 2, "Variable 2")) { - echo "Fail to put var 2 on shared memory $shm_id.\n"; + echo "Fail to put var 2 on shared memory.\n"; sem_remove($sem_id); shm_remove ($shm_id); exit; @@ -58,7 +58,7 @@ echo "Write var2 to shared memory.\n"; // Read variable 1 $var1 = shm_get_var ($shm_id, 1); if ($var1 === FALSE) { - echo "Fail to retrieve Var 1 from Shared memory $shm_id, return value=$var1.\n"; + echo "Fail to retrieve Var 1 from Shared memory, return value=$var1.\n"; } else { echo "Read var1=$var1.\n"; } @@ -66,7 +66,7 @@ if ($var1 === FALSE) { // Read variable 1 $var2 = shm_get_var ($shm_id, 2); if ($var1 === FALSE) { - echo "Fail to retrieve Var 2 from Shared memory $shm_id, return value=$var2.\n"; + echo "Fail to retrieve Var 2 from Shared memory, return value=$var2.\n"; } else { echo "Read var2=$var2.\n"; } @@ -81,7 +81,7 @@ if (!sem_release($sem_id)) { if (shm_remove ($shm_id)) { echo "Shared memory successfully removed from SysV.\n"; } else { - echo "Fail to remove $shm_id shared memory from SysV.\n"; + echo "Fail to remove shared memory from SysV.\n"; } // Remove semaphore @@ -101,7 +101,7 @@ echo "End.\n"; Start. Got semaphore. Success acquire semaphore. -Success to attach shared memory : %s. +Success to attach shared memory. Write var1 to shared memory. Write var2 to shared memory. Read var1=Variable 1. diff --git a/ext/sysvshm/php_sysvshm.h b/ext/sysvshm/php_sysvshm.h index 5089bd617f..5d2ab6c973 100644 --- a/ext/sysvshm/php_sysvshm.h +++ b/ext/sysvshm/php_sysvshm.h @@ -38,10 +38,7 @@ extern zend_module_entry sysvshm_module_entry; # include #endif -#define PHP_SHM_RSRC_NAME "sysvshm" - typedef struct { - int le_shm; zend_long init_mem; } sysvshm_module; @@ -64,6 +61,7 @@ typedef struct { key_t key; /* key set by user */ zend_long id; /* returned by shmget */ sysvshm_chunk_head *ptr; /* memory address of shared memory */ + zend_object std; } sysvshm_shm; PHP_MINIT_FUNCTION(sysvshm); diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index dbdeaa0eb1..c92f6f9b88 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -29,8 +29,46 @@ #include "ext/standard/info.h" #include "ext/standard/php_var.h" #include "zend_smart_str.h" +#include "Zend/zend_interfaces.h" #include "php_ini.h" +/* SysvSharedMemory class */ + +zend_class_entry *sysvshm_ce; +static zend_object_handlers sysvshm_object_handlers; + +static inline sysvshm_shm *sysvshm_from_obj(zend_object *obj) { + return (sysvshm_shm *)((char *)(obj) - XtOffsetOf(sysvshm_shm, std)); +} + +#define Z_SYSVSHM_P(zv) sysvshm_from_obj(Z_OBJ_P(zv)) + +static zend_object *sysvshm_create_object(zend_class_entry *class_type) { + sysvshm_shm *intern = zend_object_alloc(sizeof(sysvshm_shm), class_type); + + zend_object_std_init(&intern->std, class_type); + object_properties_init(&intern->std, class_type); + intern->std.handlers = &sysvshm_object_handlers; + + return &intern->std; +} + +static zend_function *sysvshm_get_constructor(zend_object *object) { + zend_throw_error(NULL, "Cannot directly construct SysvSharedMemory, use shm_attach() instead"); + return NULL; +} + +static void sysvshm_free_obj(zend_object *object) +{ + sysvshm_shm *sysvshm = sysvshm_from_obj(object); + + if (sysvshm->ptr) { + shmdt((void *) sysvshm->ptr); + } + + zend_object_std_dtor(&sysvshm->std); +} + /* {{{ sysvshm_module_entry */ zend_module_entry sysvshm_module_entry = { @@ -53,33 +91,29 @@ ZEND_GET_MODULE(sysvshm) #undef shm_ptr /* undefine AIX-specific macro */ -#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) do { \ - if ((shm_ptr = (sysvshm_shm *)zend_fetch_resource(Z_RES_P(z_ptr), PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)) == NULL) { \ - RETURN_THROWS(); \ - } \ -} while (0) - THREAD_LS sysvshm_module php_sysvshm; static int php_put_shm_data(sysvshm_chunk_head *ptr, zend_long key, const char *data, zend_long len); static zend_long php_check_shm_data(sysvshm_chunk_head *ptr, zend_long key); static int php_remove_shm_data(sysvshm_chunk_head *ptr, zend_long shm_varpos); -/* {{{ php_release_sysvshm - */ -static void php_release_sysvshm(zend_resource *rsrc) -{ - sysvshm_shm *shm_ptr = (sysvshm_shm *) rsrc->ptr; - shmdt((void *) shm_ptr->ptr); - efree(shm_ptr); -} -/* }}} */ - /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(sysvshm) { - php_sysvshm.le_shm = zend_register_list_destructors_ex(php_release_sysvshm, NULL, PHP_SHM_RSRC_NAME, module_number); + zend_class_entry ce; + INIT_CLASS_ENTRY(ce, "SysvSharedMemory", class_SysvSharedMemory_methods); + sysvshm_ce = zend_register_internal_class(&ce); + sysvshm_ce->ce_flags |= ZEND_ACC_FINAL; + sysvshm_ce->create_object = sysvshm_create_object; + sysvshm_ce->serialize = zend_class_serialize_deny; + sysvshm_ce->unserialize = zend_class_unserialize_deny; + + memcpy(&sysvshm_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + sysvshm_object_handlers.offset = XtOffsetOf(sysvshm_shm, std); + sysvshm_object_handlers.free_obj = sysvshm_free_obj; + sysvshm_object_handlers.get_constructor = sysvshm_get_constructor; + sysvshm_object_handlers.clone_obj = NULL; if (cfg_get_long("sysvshm.init_mem", &php_sysvshm.init_mem) == FAILURE) { php_sysvshm.init_mem=10000; @@ -105,36 +139,36 @@ 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 = php_sysvshm.init_mem, shm_flag = 0666; + zend_long shm_key, shm_id, shm_size, shm_flag = 0666; + zend_bool shm_size_is_null = 1; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|ll", &shm_key, &shm_size, &shm_flag)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &shm_key, &shm_size, &shm_size_is_null, &shm_flag)) { RETURN_THROWS(); } + if (shm_size_is_null) { + shm_size = php_sysvshm.init_mem; + } + if (shm_size < 1) { - php_error_docref(NULL, E_WARNING, "Segment size must be greater than zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than 0"); + RETURN_THROWS(); } - shm_list_ptr = (sysvshm_shm *) emalloc(sizeof(sysvshm_shm)); - /* get the id from a specified key or create new shared memory */ if ((shm_id = shmget(shm_key, 0, 0)) < 0) { if (shm_size < (zend_long)sizeof(sysvshm_chunk_head)) { php_error_docref(NULL, E_WARNING, "Failed for key 0x" ZEND_XLONG_FMT ": memorysize too small", shm_key); - efree(shm_list_ptr); 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)); - efree(shm_list_ptr); RETURN_FALSE; } } 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)); - efree(shm_list_ptr); RETURN_FALSE; } @@ -148,40 +182,56 @@ PHP_FUNCTION(shm_attach) chunk_ptr->free = shm_size-chunk_ptr->end; } + object_init_ex(return_value, sysvshm_ce); + + shm_list_ptr = Z_SYSVSHM_P(return_value); + shm_list_ptr->key = shm_key; shm_list_ptr->id = shm_id; shm_list_ptr->ptr = chunk_ptr; - - RETURN_RES(zend_register_resource(shm_list_ptr, php_sysvshm.le_shm)); } /* }}} */ -/* {{{ proto bool shm_detach(resource shm_identifier) +/* {{{ proto bool shm_detach(SysvSharedMemory shm_identifier) Disconnects from shared memory segment */ PHP_FUNCTION(shm_detach) { zval *shm_id; sysvshm_shm *shm_list_ptr; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "r", &shm_id)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "O", &shm_id, sysvshm_ce)) { + RETURN_THROWS(); + } + + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); RETURN_THROWS(); } - SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); - RETURN_BOOL(SUCCESS == zend_list_close(Z_RES_P(shm_id))); + + shmdt((void *) shm_list_ptr->ptr); + shm_list_ptr->ptr = NULL; + + RETURN_TRUE; } /* }}} */ -/* {{{ proto bool shm_remove(resource shm_identifier) +/* {{{ proto bool shm_remove(SysvSharedMemory shm_identifier) Removes shared memory from Unix systems */ PHP_FUNCTION(shm_remove) { zval *shm_id; sysvshm_shm *shm_list_ptr; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "r", &shm_id)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "O", &shm_id, sysvshm_ce)) { + RETURN_THROWS(); + } + + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); RETURN_THROWS(); } - SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); if (shmctl(shm_list_ptr->id, IPC_RMID, NULL) < 0) { php_error_docref(NULL, E_WARNING, "Failed for key 0x%x, id " ZEND_LONG_FMT ": %s", shm_list_ptr->key, Z_LVAL_P(shm_id), strerror(errno)); @@ -192,7 +242,7 @@ PHP_FUNCTION(shm_remove) } /* }}} */ -/* {{{ proto bool shm_put_var(resource shm_identifier, int variable_key, mixed variable) +/* {{{ proto bool shm_put_var(SysvSharedMemory shm_identifier, int variable_key, mixed variable) Inserts or updates a variable in shared memory */ PHP_FUNCTION(shm_put_var) { @@ -203,7 +253,13 @@ PHP_FUNCTION(shm_put_var) smart_str shm_var = {0}; php_serialize_data_t var_hash; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &shm_id, &shm_key, &arg_var)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "Olz", &shm_id, sysvshm_ce, &shm_key, &arg_var)) { + RETURN_THROWS(); + } + + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); RETURN_THROWS(); } @@ -212,12 +268,6 @@ PHP_FUNCTION(shm_put_var) php_var_serialize(&shm_var, arg_var, &var_hash); PHP_VAR_SERIALIZE_DESTROY(var_hash); - shm_list_ptr = zend_fetch_resource(Z_RES_P(shm_id), PHP_SHM_RSRC_NAME, php_sysvshm.le_shm); - if (!shm_list_ptr) { - smart_str_free(&shm_var); - RETURN_THROWS(); - } - /* insert serialized variable into shared memory */ ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.s? ZSTR_VAL(shm_var.s) : NULL, shm_var.s? ZSTR_LEN(shm_var.s) : 0); @@ -232,7 +282,7 @@ PHP_FUNCTION(shm_put_var) } /* }}} */ -/* {{{ proto mixed shm_get_var(resource id, int variable_key) +/* {{{ proto mixed shm_get_var(SysvSharedMemory id, int variable_key) Returns a variable from shared memory */ PHP_FUNCTION(shm_get_var) { @@ -244,14 +294,19 @@ PHP_FUNCTION(shm_get_var) sysvshm_chunk *shm_var; php_unserialize_data_t var_hash; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &shm_id, &shm_key)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &shm_id, sysvshm_ce, &shm_key)) { + RETURN_THROWS(); + } + + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); RETURN_THROWS(); } - SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); /* setup string-variable and serialize */ /* get serialized variable from shared memory */ - shm_varpos = php_check_shm_data((shm_list_ptr->ptr), shm_key); + shm_varpos = php_check_shm_data(shm_list_ptr->ptr, shm_key); if (shm_varpos < 0) { php_error_docref(NULL, E_WARNING, "Variable key " ZEND_LONG_FMT " doesn't exist", shm_key); @@ -269,7 +324,7 @@ PHP_FUNCTION(shm_get_var) } /* }}} */ -/* {{{ proto bool shm_has_var(resource id, int variable_key) +/* {{{ proto bool shm_has_var(SysvSharedMemory id, int variable_key) Checks whether a specific entry exists */ PHP_FUNCTION(shm_has_var) { @@ -277,15 +332,21 @@ PHP_FUNCTION(shm_has_var) zend_long shm_key; sysvshm_shm *shm_list_ptr; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &shm_id, &shm_key)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &shm_id, sysvshm_ce, &shm_key)) { + RETURN_THROWS(); + } + + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); RETURN_THROWS(); } - SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); + RETURN_BOOL(php_check_shm_data(shm_list_ptr->ptr, shm_key) >= 0); } /* }}} */ -/* {{{ proto bool shm_remove_var(resource id, int variable_key) +/* {{{ proto bool shm_remove_var(SysvSharedMemory id, int variable_key) Removes variable from shared memory */ PHP_FUNCTION(shm_remove_var) { @@ -293,12 +354,17 @@ PHP_FUNCTION(shm_remove_var) zend_long shm_key, shm_varpos; sysvshm_shm *shm_list_ptr; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &shm_id, &shm_key)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &shm_id, sysvshm_ce, &shm_key)) { RETURN_THROWS(); } - SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); - shm_varpos = php_check_shm_data((shm_list_ptr->ptr), shm_key); + shm_list_ptr = Z_SYSVSHM_P(shm_id); + if (!shm_list_ptr->ptr) { + zend_throw_error(NULL, "Shared memory block has already been destroyed"); + RETURN_THROWS(); + } + + shm_varpos = php_check_shm_data(shm_list_ptr->ptr, shm_key); if (shm_varpos < 0) { php_error_docref(NULL, E_WARNING, "Variable key " ZEND_LONG_FMT " doesn't exist", shm_key); @@ -345,6 +411,8 @@ static zend_long php_check_shm_data(sysvshm_chunk_head *ptr, zend_long key) zend_long pos; sysvshm_chunk *shm_var; + ZEND_ASSERT(ptr); + pos = ptr->start; for (;;) { @@ -372,6 +440,8 @@ static int php_remove_shm_data(sysvshm_chunk_head *ptr, zend_long shm_varpos) sysvshm_chunk *chunk_ptr, *next_chunk_ptr; zend_long memcpy_len; + ZEND_ASSERT(ptr); + chunk_ptr = (sysvshm_chunk *) ((char *) ptr + shm_varpos); next_chunk_ptr = (sysvshm_chunk *) ((char *) ptr + shm_varpos + chunk_ptr->next); diff --git a/ext/sysvshm/sysvshm.stub.php b/ext/sysvshm/sysvshm.stub.php index 4d9500dc2c..f775032f46 100644 --- a/ext/sysvshm/sysvshm.stub.php +++ b/ext/sysvshm/sysvshm.stub.php @@ -2,36 +2,20 @@ /** @generate-function-entries */ -/** @return resource|false */ -function shm_attach(int $key, int $memsize = UNKNOWN, int $perm = 0666) {} - -/** - * @param resource $shm_identifier - */ -function shm_detach($shm_identifier): bool {} - -/** - * @param resource $id - */ -function shm_has_var($id, int $variable_key): bool {} - -/** - * @param resource $shm_identifier - */ -function shm_remove($shm_identifier): bool {} - -/** - * @param resource $shm_identifier - */ -function shm_put_var($shm_identifier, int $variable_key, $variable): bool {} - -/** - * @param resource $id - * @return mixed - */ -function shm_get_var($id, int $variable_key) {} - -/** - * @param resource $id - */ -function shm_remove_var($id, int $variable_key): bool {} +final class SysvSharedMemory +{ +} + +function shm_attach(int $key, ?int $memsize = null, int $perm = 0666): SysvSharedMemory|false {} + +function shm_detach(SysvSharedMemory $shm): bool {} + +function shm_has_var(SysvSharedMemory $shm, int $variable_key): bool {} + +function shm_remove(SysvSharedMemory $shm): bool {} + +function shm_put_var(SysvSharedMemory $shm, int $variable_key, mixed $variable): bool {} + +function shm_get_var(SysvSharedMemory $shm, int $variable_key): mixed {} + +function shm_remove_var(SysvSharedMemory $shm, int $variable_key): bool {} diff --git a/ext/sysvshm/sysvshm_arginfo.h b/ext/sysvshm/sysvshm_arginfo.h index 408237ced1..95c5128bba 100644 --- a/ext/sysvshm/sysvshm_arginfo.h +++ b/ext/sysvshm/sysvshm_arginfo.h @@ -1,30 +1,30 @@ /* This is a generated file, edit the .stub.php file instead. */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_attach, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_shm_attach, 0, 1, SysvSharedMemory, MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, key, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, memsize, IS_LONG, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, memsize, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, perm, IS_LONG, 0, "0666") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_shm_detach, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, shm_identifier) + ZEND_ARG_OBJ_INFO(0, shm, SysvSharedMemory, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_shm_has_var, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, id) + ZEND_ARG_OBJ_INFO(0, shm, SysvSharedMemory, 0) ZEND_ARG_TYPE_INFO(0, variable_key, IS_LONG, 0) ZEND_END_ARG_INFO() #define arginfo_shm_remove arginfo_shm_detach ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_shm_put_var, 0, 3, _IS_BOOL, 0) - ZEND_ARG_INFO(0, shm_identifier) + ZEND_ARG_OBJ_INFO(0, shm, SysvSharedMemory, 0) ZEND_ARG_TYPE_INFO(0, variable_key, IS_LONG, 0) - ZEND_ARG_INFO(0, variable) + ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_get_var, 0, 0, 2) - ZEND_ARG_INFO(0, id) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_shm_get_var, 0, 2, IS_MIXED, 0) + ZEND_ARG_OBJ_INFO(0, shm, SysvSharedMemory, 0) ZEND_ARG_TYPE_INFO(0, variable_key, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -50,3 +50,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(shm_remove_var, arginfo_shm_remove_var) ZEND_FE_END }; + + +static const zend_function_entry class_SysvSharedMemory_methods[] = { + ZEND_FE_END +}; diff --git a/ext/sysvshm/tests/002.phpt b/ext/sysvshm/tests/002.phpt index d558623242..aeec6f6e1b 100644 --- a/ext/sysvshm/tests/002.phpt +++ b/ext/sysvshm/tests/002.phpt @@ -10,11 +10,35 @@ if (!function_exists('ftok')){ print 'skip'; } $key = ftok(__FILE__, 't'); -var_dump(shm_attach(-1, 0)); -var_dump(shm_attach(0, -1)); -var_dump(shm_attach(123, -1)); -var_dump(shm_attach($key, -1)); -var_dump(shm_attach($key, 0)); +try { + shm_attach(-1, 0); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + shm_attach(0, -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + shm_attach(123, -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + shm_attach($key, -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + shm_attach($key, 0); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} var_dump($s = shm_attach($key, 1024)); shm_remove($s); @@ -31,23 +55,19 @@ shm_remove($s); echo "Done\n"; ?> --EXPECTF-- -Warning: shm_attach(): Segment size must be greater than zero in %s on line %d -bool(false) - -Warning: shm_attach(): Segment size must be greater than zero in %s on line %d -bool(false) - -Warning: shm_attach(): Segment size must be greater than zero in %s on line %d -bool(false) - -Warning: shm_attach(): Segment size must be greater than zero in %s on line %d -bool(false) - -Warning: shm_attach(): Segment size must be greater than zero in %s on line %d -bool(false) -resource(%d) of type (sysvshm) -resource(%d) of type (sysvshm) -resource(%d) of type (sysvshm) -resource(%d) of type (sysvshm) -resource(%d) of type (sysvshm) +shm_attach(): Argument #2 ($memsize) must be greater than 0 +shm_attach(): Argument #2 ($memsize) must be greater than 0 +shm_attach(): Argument #2 ($memsize) must be greater than 0 +shm_attach(): Argument #2 ($memsize) must be greater than 0 +shm_attach(): Argument #2 ($memsize) must be greater than 0 +object(SysvSharedMemory)#%d (0) { +} +object(SysvSharedMemory)#%d (0) { +} +object(SysvSharedMemory)#%d (0) { +} +object(SysvSharedMemory)#%d (0) { +} +object(SysvSharedMemory)#%d (0) { +} Done diff --git a/ext/sysvshm/tests/003.phpt b/ext/sysvshm/tests/003.phpt index a7fe128aa5..9456891dab 100644 --- a/ext/sysvshm/tests/003.phpt +++ b/ext/sysvshm/tests/003.phpt @@ -14,14 +14,15 @@ $s = shm_attach($key); var_dump(shm_detach($s)); try { - var_dump(shm_detach($s)); -} catch (TypeError $e) { - echo $e->getMessage(), "\n"; + shm_detach($s); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; } + try { shm_remove($s); -} catch (TypeError $e) { - echo $e->getMessage(), "\n"; +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; } echo "Done\n"; @@ -36,6 +37,6 @@ shm_remove($s); ?> --EXPECT-- bool(true) -shm_detach(): supplied resource is not a valid sysvshm resource -shm_remove(): supplied resource is not a valid sysvshm resource +Shared memory block has already been destroyed +Shared memory block has already been destroyed Done diff --git a/ext/sysvshm/tests/006.phpt b/ext/sysvshm/tests/006.phpt index a3e38e2c5c..5474445df9 100644 --- a/ext/sysvshm/tests/006.phpt +++ b/ext/sysvshm/tests/006.phpt @@ -11,7 +11,11 @@ if (!function_exists('ftok')){ print 'skip'; } $key = ftok(__FILE__, 't'); $s = shm_attach($key, 1024); -shm_put_var($s, 1, "test string"); +try { + shm_put_var($s, 1, "test string"); +} catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; +} var_dump(shm_remove_var($s, -10)); diff --git a/ext/sysvshm/tests/007.phpt b/ext/sysvshm/tests/007.phpt index 730e9a3fbd..a24e468d74 100644 --- a/ext/sysvshm/tests/007.phpt +++ b/ext/sysvshm/tests/007.phpt @@ -15,14 +15,14 @@ var_dump(shm_remove($s)); shm_detach($s); try { - var_dump(shm_remove($s)); -} catch (TypeError $e) { - echo $e->getMessage(), "\n"; + shm_remove($s); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; } echo "Done\n"; ?> ---EXPECT-- +--EXPECTF-- bool(true) -shm_remove(): supplied resource is not a valid sysvshm resource +Shared memory block has already been destroyed Done diff --git a/ext/sysvshm/tests/shutdown_crash_0.phpt b/ext/sysvshm/tests/shutdown_crash_0.phpt index 0f2a02dfb5..f75a141323 100644 --- a/ext/sysvshm/tests/shutdown_crash_0.phpt +++ b/ext/sysvshm/tests/shutdown_crash_0.phpt @@ -15,6 +15,8 @@ var_dump($s = shm_attach($key, 1024)); shm_remove($s); var_dump($s = shm_attach($key, 1024)); shm_remove($s); ---EXPECTF-- -resource(%d) of type (sysvshm) -resource(%d) of type (sysvshm) +--EXPECT-- +object(SysvSharedMemory)#1 (0) { +} +object(SysvSharedMemory)#2 (0) { +} -- 2.40.0