diff --git a/limelight-common/ControlStream.c b/limelight-common/ControlStream.c index 741d7ac..931af71 100644 --- a/limelight-common/ControlStream.c +++ b/limelight-common/ControlStream.c @@ -291,7 +291,13 @@ static int sendMessageEnet(short ptype, short paylen, const void* payload) { return 0; } - enet_peer_send(peer, 0, enetPacket); + if (enet_peer_send(peer, 0, enetPacket) < 0) { + Limelog("Failed to send ENet control packet\n"); + enet_packet_destroy(enetPacket); + free(packet); + return 0; + } + enet_host_flush(client); free(packet); @@ -530,7 +536,9 @@ int stopControlStream(void) { PltSetEvent(&invalidateRefFramesEvent); if (peer != NULL) { + PltLockMutex(&enetMutex); enet_peer_disconnect_now(peer, 0); + PltUnlockMutex(&enetMutex); } if (ctlSock != INVALID_SOCKET) { diff --git a/limelight-common/RtspConnection.c b/limelight-common/RtspConnection.c index c232f22..ffdaaec 100644 --- a/limelight-common/RtspConnection.c +++ b/limelight-common/RtspConnection.c @@ -115,7 +115,11 @@ static int transactRtspMessageEnet(PRTSP_MESSAGE request, PRTSP_MESSAGE response } // Send the message - enet_peer_send(peer, 0, packet); + if (enet_peer_send(peer, 0, packet) < 0) { + enet_packet_destroy(packet); + ret = 0; + goto Exit; + } enet_host_flush(client); // If we have a payload to send, we'll need to send that separately @@ -127,7 +131,12 @@ static int transactRtspMessageEnet(PRTSP_MESSAGE request, PRTSP_MESSAGE response } // Send the payload - enet_peer_send(peer, 0, packet); + if (enet_peer_send(peer, 0, packet) < 0) { + enet_packet_destroy(packet); + ret = 0; + goto Exit; + } + enet_host_flush(client); } @@ -282,12 +291,6 @@ void terminateRtspHandshake(void) { if (peer != NULL) { enet_peer_disconnect_now(peer, 0); - peer = NULL; - } - - if (client != NULL) { - enet_host_destroy(client); - client = NULL; } } @@ -426,6 +429,7 @@ static int sendVideoAnnounce(PRTSP_MESSAGE response, int* error) { // Perform RTSP Handshake with the streaming server machine as part of the connection process int performRtspHandshake(void) { char urlAddr[URLSAFESTRING_LEN]; + int ret; // Initialize global state addrToUrlSafeString(&RemoteAddr, urlAddr); @@ -460,6 +464,8 @@ int performRtspHandshake(void) { // Connect to the host peer = enet_host_connect(client, &address, 1, 0); if (peer == NULL) { + enet_host_destroy(client); + client = NULL; return -1; } @@ -467,6 +473,10 @@ int performRtspHandshake(void) { if (enet_host_service(client, &event, RTSP_TIMEOUT_SEC * 1000) <= 0 || event.type != ENET_EVENT_TYPE_CONNECT) { Limelog("RTSP: Failed to connect to UDP port 48010\n"); + enet_peer_reset(peer); + peer = NULL; + enet_host_destroy(client); + client = NULL; return -1; } @@ -480,13 +490,15 @@ int performRtspHandshake(void) { if (!requestOptions(&response, &error)) { Limelog("RTSP OPTIONS request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP OPTIONS request failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } freeMessage(&response); @@ -498,13 +510,15 @@ int performRtspHandshake(void) { if (!requestDescribe(&response, &error)) { Limelog("RTSP DESCRIBE request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP DESCRIBE request failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } // The RTSP DESCRIBE reply will contain a collection of SDP media attributes that @@ -530,19 +544,22 @@ int performRtspHandshake(void) { if (!setupStream(&response, "streamid=audio", &error)) { Limelog("RTSP SETUP streamid=audio request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP SETUP streamid=audio request failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } sessionId = getOptionContent(response.options, "Session"); if (sessionId == NULL) { Limelog("RTSP SETUP streamid=audio is missing session attribute"); - return -1; + ret = -1; + goto Exit; } strcpy(sessionIdString, sessionId); @@ -557,13 +574,15 @@ int performRtspHandshake(void) { if (!setupStream(&response, "streamid=video", &error)) { Limelog("RTSP SETUP streamid=video request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP SETUP streamid=video request failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } freeMessage(&response); @@ -575,13 +594,15 @@ int performRtspHandshake(void) { if (!sendVideoAnnounce(&response, &error)) { Limelog("RTSP ANNOUNCE request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP ANNOUNCE request failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } freeMessage(&response); @@ -593,13 +614,15 @@ int performRtspHandshake(void) { if (!playStream(&response, "streamid=video", &error)) { Limelog("RTSP PLAY streamid=video request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP PLAY streamid=video failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } freeMessage(&response); @@ -611,18 +634,23 @@ int performRtspHandshake(void) { if (!playStream(&response, "streamid=audio", &error)) { Limelog("RTSP PLAY streamid=audio request failed: %d\n", error); - return error; + ret = error; + goto Exit; } if (response.message.response.statusCode != 200) { Limelog("RTSP PLAY streamid=audio failed: %d\n", response.message.response.statusCode); - return response.message.response.statusCode; + ret = response.message.response.statusCode; + goto Exit; } freeMessage(&response); } + ret = 0; + +Exit: // Cleanup the ENet stuff if (ServerMajorVersion >= 5) { if (peer != NULL) { @@ -636,5 +664,5 @@ int performRtspHandshake(void) { } } - return 0; + return ret; }