@henningw commented on this pull request.
Thank you for the pull request! Generally all looks fine. I've had a few questions regarding the memory management in the error cases (I only looked through the code, did not tested it).
In src/modules/async/async_sleep.c:
> + sizeof(struct async_ms_list)); + if(_async_ms_list == NULL) { + LM_ERR("no more shm\n"); + return -1; + } + memset(_async_ms_list, 0, sizeof(struct async_ms_list)); + if(lock_init(&_async_ms_list->lock) == 0) { + LM_ERR("cannot init lock \n"); + shm_free(_async_ms_list); + _async_ms_list = 0; + return -1; + } + return 0; +} + +int async_destroy_ms_timer_list(void)
It is not necessary to shm_free the allocated _async_ms_list as well here?
In src/modules/async/async_sleep.c:
> + return -1; + } + dsize = sizeof(async_task_t) + sizeof(async_task_param_t) + sizeof(async_ms_item_t); + + at = (async_task_t *)shm_malloc(dsize); + if(at == NULL) { + LM_ERR("no more shm memory\n"); + return -1; + } + memset(at, 0, dsize); + at->param = (char *)at + sizeof(async_task_t); + atp = (async_task_param_t *)at->param; + ai = (async_ms_item_t *) ((char *)at + sizeof(async_task_t) + sizeof(async_task_param_t)); + ai->at = at; + + if(cbname && cbname->len>=ASYNC_CBNAME_SIZE-1) {
Is here a shm_free for "at" missing?
In src/modules/async/async_sleep.c:
> + return -1; + } + memset(at, 0, dsize); + at->param = (char *)at + sizeof(async_task_t); + atp = (async_task_param_t *)at->param; + ai = (async_ms_item_t *) ((char *)at + sizeof(async_task_t) + sizeof(async_task_param_t)); + ai->at = at; + + if(cbname && cbname->len>=ASYNC_CBNAME_SIZE-1) { + LM_ERR("callback name is too long: %.*s\n", cbname->len, cbname->s); + return -1; + } + + t = tmb.t_gett(); + if(t == NULL || t == T_UNDEFINED) { + if(tmb.t_newtran(msg) < 0) {
Same as above
In src/modules/async/async_sleep.c:
> + ai = (async_ms_item_t *) ((char *)at + sizeof(async_task_t) + sizeof(async_task_param_t)); + ai->at = at; + + if(cbname && cbname->len>=ASYNC_CBNAME_SIZE-1) { + LM_ERR("callback name is too long: %.*s\n", cbname->len, cbname->s); + return -1; + } + + t = tmb.t_gett(); + if(t == NULL || t == T_UNDEFINED) { + if(tmb.t_newtran(msg) < 0) { + LM_ERR("cannot create the transaction\n"); + return -1; + } + t = tmb.t_gett(); + if(t == NULL || t == T_UNDEFINED) {
Same as above
In src/modules/async/async_sleep.c:
> + t = tmb.t_gett(); + if(t == NULL || t == T_UNDEFINED) { + if(tmb.t_newtran(msg) < 0) { + LM_ERR("cannot create the transaction\n"); + return -1; + } + t = tmb.t_gett(); + if(t == NULL || t == T_UNDEFINED) { + LM_ERR("cannot lookup the transaction\n"); + return -1; + } + } + + if(tmb.t_suspend(msg, &tindex, &tlabel) < 0) { + LM_ERR("failed to suspend the processing\n"); + shm_free(ai);
You free here the "ai" structure - where is this memory actually allocated? And again, what about "at"?
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or mute the thread.