Assert that the port numbers are set prior to being used

This commit is contained in:
Cameron Gutman 2021-07-02 01:44:11 -05:00
parent cdda221d64
commit 3b9d8a3176
6 changed files with 29 additions and 6 deletions

View File

@ -45,6 +45,8 @@ static void AudioPingThreadProc(void* context) {
char pingData[] = { 0x50, 0x49, 0x4E, 0x47 }; char pingData[] = { 0x50, 0x49, 0x4E, 0x47 };
LC_SOCKADDR saddr; LC_SOCKADDR saddr;
LC_ASSERT(AudioPortNumber != 0);
memcpy(&saddr, &RemoteAddr, sizeof(saddr)); memcpy(&saddr, &RemoteAddr, sizeof(saddr));
SET_PORT(&saddr, AudioPortNumber); SET_PORT(&saddr, AudioPortNumber);
@ -94,11 +96,12 @@ int initializeAudioStream(void) {
return 0; return 0;
} }
// This is called when the RTSP DESCRIBE message is parsed and the audio port // This is called when the RTSP SETUP message is parsed and the audio port
// number is parsed out of it. Alternatively, it's also called if parsing fails // number is parsed out of it. Alternatively, it's also called if parsing fails
// and will use the well known audio port instead. // and will use the well known audio port instead.
int notifyAudioPortNegotiationComplete(void) { int notifyAudioPortNegotiationComplete(void) {
LC_ASSERT(!pingThreadStarted); LC_ASSERT(!pingThreadStarted);
LC_ASSERT(AudioPortNumber != 0);
// We may receive audio before our threads are started, but that's okay. We'll // We may receive audio before our threads are started, but that's okay. We'll
// drop the first 1 second of audio packets to catch up with the backlog. // drop the first 1 second of audio packets to catch up with the backlog.

View File

@ -238,11 +238,10 @@ int LiStartConnection(PSERVER_INFORMATION serverInfo, PSTREAM_CONFIGURATION stre
OriginalVideoBitrate = streamConfig->bitrate; OriginalVideoBitrate = streamConfig->bitrate;
RemoteAddrString = strdup(serverInfo->address); RemoteAddrString = strdup(serverInfo->address);
// Initialize port numbers to defaults. The values in RTSP SETUP (if valid) // The values in RTSP SETUP will be used to populate these.
// will override these to allow dynamic port selection. VideoPortNumber = 0;
VideoPortNumber = 47998; ControlPortNumber = 0;
ControlPortNumber = 47999; AudioPortNumber = 0;
AudioPortNumber = 48000;
// Parse RTSP port number from RTSP session URL // Parse RTSP port number from RTSP session URL
if (!parseRtspPortNumberFromUrl(serverInfo->rtspSessionUrl, &RtspPortNumber)) { if (!parseRtspPortNumberFromUrl(serverInfo->rtspSessionUrl, &RtspPortNumber)) {

View File

@ -1142,6 +1142,8 @@ int startControlStream(void) {
ENetAddress address; ENetAddress address;
ENetEvent event; ENetEvent event;
LC_ASSERT(ControlPortNumber != 0);
enet_address_set_address(&address, (struct sockaddr *)&RemoteAddr, RemoteAddrLen); enet_address_set_address(&address, (struct sockaddr *)&RemoteAddr, RemoteAddrLen);
enet_address_set_port(&address, ControlPortNumber); enet_address_set_port(&address, ControlPortNumber);
@ -1183,6 +1185,7 @@ int startControlStream(void) {
} }
else { else {
// NB: Do NOT use ControlPortNumber here. 47995 is correct for these old versions. // NB: Do NOT use ControlPortNumber here. 47995 is correct for these old versions.
LC_ASSERT(ControlPortNumber == 0);
ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen,
47995, CONTROL_STREAM_TIMEOUT_SEC); 47995, CONTROL_STREAM_TIMEOUT_SEC);
if (ctlSock == INVALID_SOCKET) { if (ctlSock == INVALID_SOCKET) {

View File

@ -672,6 +672,8 @@ int performRtspHandshake(void) {
strcpy(urlAddr, "0.0.0.0"); strcpy(urlAddr, "0.0.0.0");
} }
LC_ASSERT(RtspPortNumber != 0);
// Initialize global state // Initialize global state
useEnet = (AppVersionQuad[0] >= 5) && (AppVersionQuad[0] <= 7) && (AppVersionQuad[2] < 404); useEnet = (AppVersionQuad[0] >= 5) && (AppVersionQuad[0] <= 7) && (AppVersionQuad[2] < 404);
sprintf(rtspTargetUrl, "rtsp%s://%s:%u", useEnet ? "ru" : "", urlAddr, RtspPortNumber); sprintf(rtspTargetUrl, "rtsp%s://%s:%u", useEnet ? "ru" : "", urlAddr, RtspPortNumber);
@ -833,7 +835,11 @@ int performRtspHandshake(void) {
} }
// Parse the audio port out of the RTSP SETUP response // Parse the audio port out of the RTSP SETUP response
LC_ASSERT(AudioPortNumber == 0);
if (!parseServerPortFromTransport(&response, &AudioPortNumber)) { if (!parseServerPortFromTransport(&response, &AudioPortNumber)) {
// Use the well known port if parsing fails
AudioPortNumber = 48000;
Limelog("Audio port: %u (RTSP parsing failed)\n", AudioPortNumber); Limelog("Audio port: %u (RTSP parsing failed)\n", AudioPortNumber);
} }
else { else {
@ -890,7 +896,11 @@ int performRtspHandshake(void) {
} }
// Parse the video port out of the RTSP SETUP response // Parse the video port out of the RTSP SETUP response
LC_ASSERT(VideoPortNumber == 0);
if (!parseServerPortFromTransport(&response, &VideoPortNumber)) { if (!parseServerPortFromTransport(&response, &VideoPortNumber)) {
// Use the well known port if parsing fails
VideoPortNumber = 47998;
Limelog("Video port: %u (RTSP parsing failed)\n", VideoPortNumber); Limelog("Video port: %u (RTSP parsing failed)\n", VideoPortNumber);
} }
else { else {
@ -920,7 +930,11 @@ int performRtspHandshake(void) {
} }
// Parse the control port out of the RTSP SETUP response // Parse the control port out of the RTSP SETUP response
LC_ASSERT(ControlPortNumber == 0);
if (!parseServerPortFromTransport(&response, &ControlPortNumber)) { if (!parseServerPortFromTransport(&response, &ControlPortNumber)) {
// Use the well known port if parsing fails
ControlPortNumber = 47999;
Limelog("Control port: %u (RTSP parsing failed)\n", ControlPortNumber); Limelog("Control port: %u (RTSP parsing failed)\n", ControlPortNumber);
} }
else { else {

View File

@ -133,6 +133,7 @@ static int addGen4Options(PSDP_OPTION* head, char* addrStr) {
char payloadStr[92]; char payloadStr[92];
int err = 0; int err = 0;
LC_ASSERT(RtspPortNumber != 0);
sprintf(payloadStr, "rtsp://%s:%u", addrStr, RtspPortNumber); sprintf(payloadStr, "rtsp://%s:%u", addrStr, RtspPortNumber);
err |= addAttributeString(head, "x-nv-general.serverAddress", payloadStr); err |= addAttributeString(head, "x-nv-general.serverAddress", payloadStr);
@ -461,6 +462,7 @@ static int fillSdpHeader(char* buffer, int rtspClientVersion, char*urlSafeAddr)
// Populate the SDP tail with required information // Populate the SDP tail with required information
static int fillSdpTail(char* buffer) { static int fillSdpTail(char* buffer) {
LC_ASSERT(VideoPortNumber != 0);
return sprintf(buffer, return sprintf(buffer,
"t=0 0\r\n" "t=0 0\r\n"
"m=video %d \r\n", "m=video %d \r\n",

View File

@ -46,6 +46,8 @@ static void VideoPingThreadProc(void* context) {
char pingData[] = { 0x50, 0x49, 0x4E, 0x47 }; char pingData[] = { 0x50, 0x49, 0x4E, 0x47 };
LC_SOCKADDR saddr; LC_SOCKADDR saddr;
LC_ASSERT(VideoPortNumber != 0);
memcpy(&saddr, &RemoteAddr, sizeof(saddr)); memcpy(&saddr, &RemoteAddr, sizeof(saddr));
SET_PORT(&saddr, VideoPortNumber); SET_PORT(&saddr, VideoPortNumber);