Index: chrome/renderer/extensions/cast_streaming_native_handler.cc |
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
index 55d0a69eaacd47726a0bf4d3887eddb461c32500..dcc1ede5b0691efd216c29a64547bcdbbc3b9135 100644 |
--- a/chrome/renderer/extensions/cast_streaming_native_handler.cc |
+++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
@@ -6,6 +6,7 @@ |
#include <functional> |
+#include "base/base64.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop.h" |
#include "chrome/common/extensions/api/cast_streaming_rtp_stream.h" |
@@ -35,6 +36,8 @@ const char kRtpStreamNotFound[] = "The RTP stream cannot be found"; |
const char kUdpTransportNotFound[] = "The UDP transport cannot be found"; |
const char kInvalidUdpParams[] = "Invalid UDP params"; |
const char kInvalidRtpParams[] = "Invalid value for RTP params"; |
+const char kInvalidAesKey[] = "Invalid value for AES key"; |
+const char kInvalidAesIvMask[] = "Invalid value for AES IV mask"; |
const char kUnableToConvertArgs[] = "Unable to convert arguments"; |
const char kUnableToConvertParams[] = "Unable to convert params"; |
@@ -52,8 +55,9 @@ void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params, |
ext_params->value = cast_params.value; |
} |
-void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params, |
- CastRtpPayloadParams* cast_params) { |
+bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate, |
+ const RtpPayloadParams& ext_params, |
+ CastRtpPayloadParams* cast_params) { |
cast_params->payload_type = ext_params.payload_type; |
cast_params->codec_name = ext_params.codec_name; |
cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0; |
@@ -67,12 +71,26 @@ void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params, |
cast_params->channels = ext_params.channels ? *ext_params.channels : 0; |
cast_params->width = ext_params.width ? *ext_params.width : 0; |
cast_params->height = ext_params.height ? *ext_params.height : 0; |
+ if (ext_params.aes_key && |
+ !base::Base64Decode(*ext_params.aes_key, &cast_params->aes_key)) { |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kInvalidAesKey))); |
+ return false; |
+ } |
+ if (ext_params.aes_iv_mask && |
+ !base::Base64Decode(*ext_params.aes_iv_mask, |
+ &cast_params->aes_iv_mask)) { |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kInvalidAesIvMask))); |
+ return false; |
+ } |
for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) { |
CastCodecSpecificParams cast_codec_params; |
ToCastCodecSpecificParams(*ext_params.codec_specific_params[i], |
&cast_codec_params); |
cast_params->codec_specific_params.push_back(cast_codec_params); |
} |
+ return true; |
} |
void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params, |
@@ -114,14 +132,21 @@ void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { |
} |
} |
-void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { |
+bool ToCastRtpParamsOrThrow(v8::Isolate* isolate, |
+ const RtpParams& ext_params, |
+ CastRtpParams* cast_params) { |
std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(), |
cast_params->rtcp_features.begin()); |
for (size_t i = 0; i < ext_params.payloads.size(); ++i) { |
CastRtpPayloadParams cast_payload_params; |
- ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params); |
+ if (!ToCastRtpPayloadParamsOrThrow(isolate, |
+ *ext_params.payloads[i], |
+ &cast_payload_params)) { |
+ return false; |
+ } |
cast_params->payloads.push_back(cast_payload_params); |
} |
+ return true; |
} |
} // namespace |
@@ -277,7 +302,9 @@ void CastStreamingNativeHandler::StartCastRtpStream( |
} |
CastRtpCaps cast_params; |
- ToCastRtpParams(*params, &cast_params); |
+ v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
+ if (!ToCastRtpParamsOrThrow(isolate, *params, &cast_params)) |
+ return; |
transport->Start(cast_params); |
} |