diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 49a707edc0a96dd23a9301b8e5e931c23faaede8..419077003d287dab3c8111d3a758fa169bbd16cc 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -3721,7 +3721,7 @@ static int __sip_xmit(struct sip_pvt *p, struct ast_str *data) } else if (p->socket.tcptls_session) { res = sip_tcptls_write(p->socket.tcptls_session, ast_str_buffer(data), ast_str_strlen(data)); } else if (p->socket.ws_session) { - if (!(res = ast_websocket_write(p->socket.ws_session, AST_WEBSOCKET_OPCODE_TEXT, ast_str_buffer(data), ast_str_strlen(data)))) { + if (!(res = ast_websocket_write_string(p->socket.ws_session, ast_str_buffer(data)))) { /* The WebSocket API just returns 0 on success and -1 on failure, while this code expects the payload length to be returned */ res = ast_str_strlen(data); } diff --git a/res/ari/ari_websockets.c b/res/ari/ari_websockets.c index 9a4f2c9fe6b8cd375a27007509268856b82bdf77..ced1e0d697dc781335f7a065d25cf198f22347ca 100644 --- a/res/ari/ari_websockets.c +++ b/res/ari/ari_websockets.c @@ -163,9 +163,7 @@ int ast_ari_websocket_session_write(struct ast_ari_websocket_session *session, #ifdef AST_DEVMODE if (!session->validator(message)) { ast_log(LOG_ERROR, "Outgoing message failed validation\n"); - return ast_websocket_write(session->ws_session, - AST_WEBSOCKET_OPCODE_TEXT, VALIDATION_FAILED, - strlen(VALIDATION_FAILED)); + return ast_websocket_write_string(session->ws_session, VALIDATION_FAILED); } #endif @@ -177,8 +175,7 @@ int ast_ari_websocket_session_write(struct ast_ari_websocket_session *session, } ast_debug(3, "Examining ARI event: \n%s\n", str); - if (ast_websocket_write(session->ws_session, - AST_WEBSOCKET_OPCODE_TEXT, str, strlen(str))) { + if (ast_websocket_write_string(session->ws_session, str)) { ast_log(LOG_NOTICE, "Problem occurred during websocket write, websocket closed\n"); return -1; } diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index 1ecfd964cb0670062c555d8897b936dc87cb0aaf..33905452fbada00dfd9984b35dd29adfcc5177e1 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -1370,8 +1370,17 @@ int AST_OPTIONAL_API_NAME(ast_websocket_read_string) int AST_OPTIONAL_API_NAME(ast_websocket_write_string) (struct ast_websocket *ws, const char *buf) { + uint64_t len = strlen(buf); + + /* We do not pass strlen(buf) to ast_websocket_write() directly because the + * size_t returned by strlen() may not require the same storage size + * as the uint64_t that ast_websocket_write() uses. This normally + * would not cause a problem, but since ast_websocket_write() uses + * the optional API, this function call goes through a series of macros + * that may cause a 32-bit to 64-bit conversion to go awry. + */ return ast_websocket_write(ws, AST_WEBSOCKET_OPCODE_TEXT, - (char *)buf, strlen(buf)); + (char *)buf, len); } static int load_module(void) diff --git a/res/res_pjsip_transport_websocket.c b/res/res_pjsip_transport_websocket.c index e98756fdf402293c30eb7fc6707c9cb0c5a5e081..e48b630e7ddfc28f4c9f832b857bf47f0c690e0a 100644 --- a/res/res_pjsip_transport_websocket.c +++ b/res/res_pjsip_transport_websocket.c @@ -63,8 +63,9 @@ static pj_status_t ws_send_msg(pjsip_transport *transport, pjsip_transport_callback callback) { struct ws_transport *wstransport = (struct ws_transport *)transport; + uint64_t len = tdata->buf.cur - tdata->buf.start; - if (ast_websocket_write(wstransport->ws_session, AST_WEBSOCKET_OPCODE_TEXT, tdata->buf.start, (int)(tdata->buf.cur - tdata->buf.start))) { + if (ast_websocket_write(wstransport->ws_session, AST_WEBSOCKET_OPCODE_TEXT, tdata->buf.start, len)) { return PJ_EUNKNOWN; }