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 };
LC_SOCKADDR saddr;
LC_ASSERT(AudioPortNumber != 0);
memcpy(&saddr, &RemoteAddr, sizeof(saddr));
SET_PORT(&saddr, AudioPortNumber);
@ -94,11 +96,12 @@ int initializeAudioStream(void) {
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
// and will use the well known audio port instead.
int notifyAudioPortNegotiationComplete(void) {
LC_ASSERT(!pingThreadStarted);
LC_ASSERT(AudioPortNumber != 0);
// 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.

View File

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

View File

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

View File

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

View File

@ -133,6 +133,7 @@ static int addGen4Options(PSDP_OPTION* head, char* addrStr) {
char payloadStr[92];
int err = 0;
LC_ASSERT(RtspPortNumber != 0);
sprintf(payloadStr, "rtsp://%s:%u", addrStr, RtspPortNumber);
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
static int fillSdpTail(char* buffer) {
LC_ASSERT(VideoPortNumber != 0);
return sprintf(buffer,
"t=0 0\r\n"
"m=video %d \r\n",

View File

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