From 418deaec2a76ebdab991209f2a7bd25e36774483 Mon Sep 17 00:00:00 2001 From: Stephan Hesse Date: Thu, 28 Apr 2022 16:27:54 +0200 Subject: [PATCH] node-src.cc: fix erratic value passed to srt_setsockflag for length argument (SRT API params are typeless, and for strings it expects the string **length** obviously, while what was put there is some random constant related to the allocated size of platform specific string container class!! :D) & compiler warning regarding std::string/c_str-pointer lifecycles, std::string needs to stay on stack until srt_setsockflag call to be safe indeed. + add JS-exception thrown for unexpected value type passed + SRT_SOCKOPT cast general style fixes --- src/node-srt.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/node-srt.cc b/src/node-srt.cc index 5378b67..4f8dd4f 100644 --- a/src/node-srt.cc +++ b/src/node-srt.cc @@ -253,7 +253,7 @@ Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) { Napi::Number value = info[2].As(); int32_t optName = option; int optValue = value; - result = srt_setsockflag(socketValue, (SRT_SOCKOPT)optName, &optValue, sizeof(int)); + result = srt_setsockflag(socketValue, (SRT_SOCKOPT) optName, &optValue, sizeof(int)); if (result == SRT_ERROR) { Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException(); return Napi::Number::New(env, SRT_ERROR); @@ -262,7 +262,7 @@ Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) { Napi::Boolean value = info[2].As(); int32_t optName = option; bool optValue = value; - result = srt_setsockflag(socketValue, (SRT_SOCKOPT)optName, &optValue, sizeof(bool)); + result = srt_setsockflag(socketValue, (SRT_SOCKOPT) optName, &optValue, sizeof(bool)); if (result == SRT_ERROR) { Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException(); return Napi::Number::New(env, SRT_ERROR); @@ -270,12 +270,14 @@ Napi::Value NodeSRT::SetSockOpt(const Napi::CallbackInfo& info) { } else if (info[2].IsString()) { Napi::String value = info[2].As(); int32_t optName = option; - const char * optValue = std::string(value).c_str(); - result = srt_setsockflag(socketValue, (SRT_SOCKOPT)optName, optValue, sizeof(string)); + std::string optValue = std::string(value); + result = srt_setsockflag(socketValue, (SRT_SOCKOPT) optName, optValue.c_str(), optValue.length()); if (result == SRT_ERROR) { Napi::Error::New(env, srt_getlasterror_str()).ThrowAsJavaScriptException(); return Napi::Number::New(env, SRT_ERROR); } + } else { + Napi::Error::New(env, "Unexpected argument type for srt_setsockflag").ThrowAsJavaScriptException(); } return Napi::Number::New(env, result); }