Skip to content

Commit e2890e3

Browse files
committed
Refactor sysvsem, sysvshm, sysmsg
1 parent 9343f87 commit e2890e3

File tree

5 files changed

+49
-45
lines changed

5 files changed

+49
-45
lines changed

ext/sysvmsg/sysvmsg.c

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ zend_module_entry sysvmsg_module_entry = {
119119
ZEND_GET_MODULE(sysvmsg)
120120
#endif
121121

122-
static void sysvmsg_release(zend_rsrc_list_entry *rsrc TSRMLS_DC)
122+
static void sysvmsg_release(zend_resource *rsrc TSRMLS_DC)
123123
{
124-
sysvmsg_queue_t * mq = (sysvmsg_queue_t *) rsrc->ptr;
124+
sysvmsg_queue_t *mq = (sysvmsg_queue_t *) rsrc->ptr;
125125
efree(mq);
126126
}
127127

@@ -164,27 +164,27 @@ PHP_FUNCTION(msg_set_queue)
164164
return;
165165
}
166166

167-
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg);
167+
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg);
168168

169169
if (msgctl(mq->id, IPC_STAT, &stat) == 0) {
170-
zval **item;
170+
zval *item;
171171

172172
/* now pull out members of data and set them in the stat buffer */
173-
if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.uid", sizeof("msg_perm.uid"), (void **) &item) == SUCCESS) {
173+
if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.uid", sizeof("msg_perm.uid") - 1)) != NULL) {
174174
convert_to_long_ex(item);
175-
stat.msg_perm.uid = Z_LVAL_PP(item);
175+
stat.msg_perm.uid = Z_LVAL_P(item);
176176
}
177-
if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.gid", sizeof("msg_perm.gid"), (void **) &item) == SUCCESS) {
177+
if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.gid", sizeof("msg_perm.gid") - 1)) != NULL) {
178178
convert_to_long_ex(item);
179-
stat.msg_perm.gid = Z_LVAL_PP(item);
179+
stat.msg_perm.gid = Z_LVAL_P(item);
180180
}
181-
if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.mode", sizeof("msg_perm.mode"), (void **) &item) == SUCCESS) {
181+
if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.mode", sizeof("msg_perm.mode") - 1)) != NULL) {
182182
convert_to_long_ex(item);
183-
stat.msg_perm.mode = Z_LVAL_PP(item);
183+
stat.msg_perm.mode = Z_LVAL_P(item);
184184
}
185-
if (zend_hash_find(Z_ARRVAL_P(data), "msg_qbytes", sizeof("msg_qbytes"), (void **) &item) == SUCCESS) {
185+
if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_qbytes", sizeof("msg_qbytes") - 1)) != NULL) {
186186
convert_to_long_ex(item);
187-
stat.msg_qbytes = Z_LVAL_PP(item);
187+
stat.msg_qbytes = Z_LVAL_P(item);
188188
}
189189
if (msgctl(mq->id, IPC_SET, &stat) == 0) {
190190
RETVAL_TRUE;
@@ -207,7 +207,7 @@ PHP_FUNCTION(msg_stat_queue)
207207
return;
208208
}
209209

210-
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg);
210+
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg);
211211

212212
if (msgctl(mq->id, IPC_STAT, &stat) == 0) {
213213
array_init(return_value);
@@ -226,7 +226,6 @@ PHP_FUNCTION(msg_stat_queue)
226226
}
227227
/* }}} */
228228

229-
230229
/* {{{ proto bool msg_queue_exists(int key)
231230
Check whether a message queue exists */
232231
PHP_FUNCTION(msg_queue_exists)
@@ -245,7 +244,6 @@ PHP_FUNCTION(msg_queue_exists)
245244
}
246245
/* }}} */
247246

248-
249247
/* {{{ proto resource msg_get_queue(int key [, int perms])
250248
Attach to a message queue */
251249
PHP_FUNCTION(msg_get_queue)
@@ -271,7 +269,7 @@ PHP_FUNCTION(msg_get_queue)
271269
RETURN_FALSE;
272270
}
273271
}
274-
RETVAL_RESOURCE(zend_list_insert(mq, le_sysvmsg TSRMLS_CC));
272+
RETVAL_ZVAL(zend_list_insert(mq, le_sysvmsg TSRMLS_CC), 0, 0);
275273
}
276274
/* }}} */
277275

@@ -286,7 +284,7 @@ PHP_FUNCTION(msg_remove_queue)
286284
return;
287285
}
288286

289-
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg);
287+
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg);
290288

291289
if (msgctl(mq->id, IPC_RMID, NULL) == 0) {
292290
RETVAL_TRUE;
@@ -338,18 +336,21 @@ PHP_FUNCTION(msg_receive)
338336
}
339337
}
340338

341-
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg);
339+
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg);
342340

343341
messagebuffer = (struct php_msgbuf *) safe_emalloc(maxsize, 1, sizeof(struct php_msgbuf));
344342

345343
result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags);
346344

345+
ZVAL_DEREF(out_msgtype);
346+
ZVAL_DEREF(out_message);
347347
zval_dtor(out_msgtype);
348348
zval_dtor(out_message);
349349
ZVAL_LONG(out_msgtype, 0);
350350
ZVAL_FALSE(out_message);
351351

352352
if (zerrcode) {
353+
ZVAL_DEREF(zerrcode);
353354
zval_dtor(zerrcode);
354355
ZVAL_LONG(zerrcode, 0);
355356
}
@@ -361,21 +362,19 @@ PHP_FUNCTION(msg_receive)
361362
RETVAL_TRUE;
362363
if (do_unserialize) {
363364
php_unserialize_data_t var_hash;
364-
zval *tmp = NULL;
365+
zval tmp;
365366
const unsigned char *p = (const unsigned char *) messagebuffer->mtext;
366367

367-
MAKE_STD_ZVAL(tmp);
368368
PHP_VAR_UNSERIALIZE_INIT(var_hash);
369369
if (!php_var_unserialize(&tmp, &p, p + result, &var_hash TSRMLS_CC)) {
370370
php_error_docref(NULL TSRMLS_CC, E_WARNING, "message corrupted");
371371
RETVAL_FALSE;
372372
} else {
373-
REPLACE_ZVAL_VALUE(&out_message, tmp, 0);
373+
ZVAL_COPY_VALUE(out_message, &tmp);
374374
}
375-
FREE_ZVAL(tmp);
376375
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
377376
} else {
378-
ZVAL_STRINGL(out_message, messagebuffer->mtext, result, 1);
377+
ZVAL_STRINGL(out_message, messagebuffer->mtext, result);
379378
}
380379
} else if (zerrcode) {
381380
ZVAL_LONG(zerrcode, errno);
@@ -403,21 +402,21 @@ PHP_FUNCTION(msg_send)
403402
return;
404403
}
405404

406-
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, &queue, -1, "sysvmsg queue", le_sysvmsg);
405+
ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, queue, -1, "sysvmsg queue", le_sysvmsg);
407406

408407
if (do_serialize) {
409408
smart_str msg_var = {0};
410409
php_serialize_data_t var_hash;
411410

412411
PHP_VAR_SERIALIZE_INIT(var_hash);
413-
php_var_serialize(&msg_var, &message, &var_hash TSRMLS_CC);
412+
php_var_serialize(&msg_var, message, &var_hash TSRMLS_CC);
414413
PHP_VAR_SERIALIZE_DESTROY(var_hash);
415414

416415
/* NB: php_msgbuf is 1 char bigger than a long, so there is no need to
417416
* allocate the extra byte. */
418-
messagebuffer = safe_emalloc(msg_var.len, 1, sizeof(struct php_msgbuf));
419-
memcpy(messagebuffer->mtext, msg_var.c, msg_var.len + 1);
420-
message_len = msg_var.len;
417+
messagebuffer = safe_emalloc(msg_var.s->len, 1, sizeof(struct php_msgbuf));
418+
memcpy(messagebuffer->mtext, msg_var.s->val, msg_var.s->len + 1);
419+
message_len = msg_var.s->len;
421420
smart_str_free(&msg_var);
422421
} else {
423422
char *p;
@@ -428,14 +427,17 @@ PHP_FUNCTION(msg_send)
428427
break;
429428

430429
case IS_LONG:
431-
case IS_BOOL:
432430
message_len = spprintf(&p, 0, "%ld", Z_LVAL_P(message));
433431
break;
434-
432+
case IS_FALSE:
433+
message_len = spprintf(&p, 0, "0");
434+
break;
435+
case IS_TRUE:
436+
message_len = spprintf(&p, 0, "1");
437+
break;
435438
case IS_DOUBLE:
436439
message_len = spprintf(&p, 0, "%F", Z_DVAL_P(message));
437440
break;
438-
439441
default:
440442
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Message parameter must be either a string or a number.");
441443
RETURN_FALSE;
@@ -459,6 +461,7 @@ PHP_FUNCTION(msg_send)
459461
if (result == -1) {
460462
php_error_docref(NULL TSRMLS_CC, E_WARNING, "msgsnd failed: %s", strerror(errno));
461463
if (zerror) {
464+
ZVAL_DEREF(zerror);
462465
ZVAL_LONG(zerror, errno);
463466
}
464467
} else {

ext/sysvsem/sysvsem.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ THREAD_LS sysvsem_module php_sysvsem_module;
132132

133133
/* {{{ release_sysvsem_sem
134134
*/
135-
static void release_sysvsem_sem(zend_rsrc_list_entry *rsrc TSRMLS_DC)
135+
static void release_sysvsem_sem(zend_resource *rsrc TSRMLS_DC)
136136
{
137137
sysvsem_sem *sem_ptr = (sysvsem_sem *)rsrc->ptr;
138138
struct sembuf sop[2];
@@ -289,7 +289,8 @@ PHP_FUNCTION(sem_get)
289289
sem_ptr->count = 0;
290290
sem_ptr->auto_release = auto_release;
291291

292-
sem_ptr->id = ZEND_REGISTER_RESOURCE(return_value, sem_ptr, php_sysvsem_module.le_sem);
292+
ZEND_REGISTER_RESOURCE(return_value, sem_ptr, php_sysvsem_module.le_sem);
293+
sem_ptr->id = Z_RES_HANDLE_P(return_value);
293294
}
294295
/* }}} */
295296

@@ -305,7 +306,7 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)
305306
return;
306307
}
307308

308-
ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem);
309+
ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem);
309310

310311
if (!acquire && sem_ptr->count == 0) {
311312
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SysV semaphore %ld (key 0x%x) is not currently acquired", Z_LVAL_P(arg_id), sem_ptr->key);
@@ -365,7 +366,7 @@ PHP_FUNCTION(sem_remove)
365366
return;
366367
}
367368

368-
ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem);
369+
ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem);
369370

370371
#if HAVE_SEMUN
371372
un.buf = &buf;

ext/sysvshm/sysvshm.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ ZEND_GET_MODULE(sysvshm)
112112

113113
#undef shm_ptr /* undefine AIX-specific macro */
114114

115-
#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, &z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)
115+
#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)
116116

117117
THREAD_LS sysvshm_module php_sysvshm;
118118

@@ -122,7 +122,7 @@ static int php_remove_shm_data(sysvshm_chunk_head *ptr, long shm_varpos);
122122

123123
/* {{{ php_release_sysvshm
124124
*/
125-
static void php_release_sysvshm(zend_rsrc_list_entry *rsrc TSRMLS_DC)
125+
static void php_release_sysvshm(zend_resource *rsrc TSRMLS_DC)
126126
{
127127
sysvshm_shm *shm_ptr = (sysvshm_shm *) rsrc->ptr;
128128
shmdt((void *) shm_ptr->ptr);
@@ -212,7 +212,7 @@ PHP_FUNCTION(shm_detach)
212212
return;
213213
}
214214
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
215-
RETURN_BOOL(SUCCESS == zend_list_delete(Z_LVAL_P(shm_id)));
215+
RETURN_BOOL(SUCCESS == zend_list_delete(Z_RES_P(shm_id)));
216216
}
217217
/* }}} */
218218

@@ -254,17 +254,17 @@ PHP_FUNCTION(shm_put_var)
254254

255255
/* setup string-variable and serialize */
256256
PHP_VAR_SERIALIZE_INIT(var_hash);
257-
php_var_serialize(&shm_var, &arg_var, &var_hash TSRMLS_CC);
257+
php_var_serialize(&shm_var, arg_var, &var_hash TSRMLS_CC);
258258
PHP_VAR_SERIALIZE_DESTROY(var_hash);
259259

260-
shm_list_ptr = zend_fetch_resource(&shm_id TSRMLS_CC, -1, PHP_SHM_RSRC_NAME, NULL, 1, php_sysvshm.le_shm);
260+
shm_list_ptr = zend_fetch_resource(shm_id TSRMLS_CC, -1, PHP_SHM_RSRC_NAME, NULL, 1, php_sysvshm.le_shm);
261261
if (!shm_list_ptr) {
262262
smart_str_free(&shm_var);
263263
RETURN_FALSE;
264264
}
265265

266266
/* insert serialized variable into shared memory */
267-
ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.c, shm_var.len);
267+
ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.s? shm_var.s->val : NULL, shm_var.s? shm_var.s->len : 0);
268268

269269
/* free string */
270270
smart_str_free(&shm_var);
@@ -306,7 +306,7 @@ PHP_FUNCTION(shm_get_var)
306306
shm_data = &shm_var->mem;
307307

308308
PHP_VAR_UNSERIALIZE_INIT(var_hash);
309-
if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
309+
if (php_var_unserialize(return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
310310
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable data in shared memory is corrupted");
311311
RETVAL_FALSE;
312312
}

ext/sysvshm/tests/003.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ Warning: shm_detach() expects exactly 1 parameter, 2 given in %s003.php on line
3838
NULL
3939
bool(true)
4040

41-
Warning: shm_detach(): %d is not a valid sysvshm resource in %s003.php on line %d
41+
Warning: shm_detach(): supplied resource is not a valid sysvshm resource in %s003.php on line %d
4242
bool(false)
4343

44-
Warning: shm_remove(): %d is not a valid sysvshm resource in %s003.php on line %d
44+
Warning: shm_remove(): supplied resource is not a valid sysvshm resource in %s003.php on line %d
4545

4646
Warning: shm_detach() expects parameter 1 to be resource, integer given in %s003.php on line %d
4747
NULL

ext/sysvshm/tests/007.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ NULL
3737
bool(true)
3838
bool(true)
3939

40-
Warning: shm_remove(): %d is not a valid sysvshm resource in %s007.php on line %d
40+
Warning: shm_remove(): supplied resource is not a valid sysvshm resource in %s007.php on line %d
4141
bool(false)
4242
Done
4343

0 commit comments

Comments
 (0)