Compare commits

...

4 Commits

Author SHA1 Message Date
sskorion 351ffe9a69
Merge e95364e0a6 into 5e82e4f305 2025-01-31 16:49:26 +00:00
Andrey Volk 5e82e4f305
Merge pull request #2755 from signalwire/eslleak
[esl] 1227669 Resource leak
2025-01-31 18:36:53 +03:00
Andrey Volk d895fdff60 [esl] 1227669 Resource leak 2025-01-31 18:09:18 +03:00
sskorion e95364e0a6
Fix #2540 : Release reserved agents if we do not provide call 2024-08-20 15:34:56 +05:30
2 changed files with 29 additions and 1 deletions

View File

@ -990,6 +990,8 @@ ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *
} }
memcpy(&handle->sockaddr, result->ai_addr, result->ai_addrlen); memcpy(&handle->sockaddr, result->ai_addr, result->ai_addrlen);
freeaddrinfo(result);
switch(handle->sockaddr.ss_family) { switch(handle->sockaddr.ss_family) {
case AF_INET: case AF_INET:
sockaddr_in = (struct sockaddr_in*)&(handle->sockaddr); sockaddr_in = (struct sockaddr_in*)&(handle->sockaddr);
@ -1005,7 +1007,6 @@ ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *
strncpy(handle->err, "Host resolves to unsupported address family", sizeof(handle->err)); strncpy(handle->err, "Host resolves to unsupported address family", sizeof(handle->err));
goto fail; goto fail;
} }
freeaddrinfo(result);
handle->sock = socket(handle->sockaddr.ss_family, SOCK_STREAM, IPPROTO_TCP); handle->sock = socket(handle->sockaddr.ss_family, SOCK_STREAM, IPPROTO_TCP);

View File

@ -1169,6 +1169,31 @@ cc_status_t cc_agent_update(const char *key, const char *value, const char *agen
switch_safe_free(sql); switch_safe_free(sql);
} }
} else if (!strcasecmp(key, "state_if_reserved")) {
if (cc_agent_str2state(value) == CC_AGENT_STATE_UNKNOWN) {
result = CC_STATUS_AGENT_INVALID_STATE;
goto done;
} else {
sql = switch_mprintf("UPDATE agents SET state = '%q' WHERE name = '%q' AND state = '%q' AND status IN ('%q', '%q')",
value, agent,
cc_agent_state2str(CC_AGENT_STATE_RESERVED),
cc_agent_status2str(CC_AGENT_STATUS_AVAILABLE),
cc_agent_status2str(CC_AGENT_STATUS_AVAILABLE_ON_DEMAND));
if (cc_execute_sql_affected_rows(sql) > 0) {
result = CC_STATUS_SUCCESS;
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CALLCENTER_EVENT) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "CC-Agent", agent);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "CC-Action", "agent-state-change");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "CC-Agent-State", value);
switch_event_fire(&event);
}
} else {
result = CC_STATUS_AGENT_NOT_FOUND;
}
switch_safe_free(sql);
}
} else { } else {
result = CC_STATUS_INVALID_KEY; result = CC_STATUS_INVALID_KEY;
goto done; goto done;
@ -2391,6 +2416,8 @@ static int agents_callback(void *pArg, int argc, char **argv, char **columnNames
switch (atoi(res)) { switch (atoi(res)) {
case 0: /* Ok, someone else took it, or user hanged up already */ case 0: /* Ok, someone else took it, or user hanged up already */
/* However, if we had reserved this agent, we should release them */
cc_agent_update("state_if_reserved", cc_agent_state2str(CC_AGENT_STATE_WAITING), agent_name);
return 1; return 1;
/* We default to default even if more entry is returned... Should never happen anyway */ /* We default to default even if more entry is returned... Should never happen anyway */
default: /* Go ahead, start thread to try to bridge these 2 caller */ default: /* Go ahead, start thread to try to bridge these 2 caller */