From 0f4a91afdedc4b1f7b02f8b015fde1889d80c104 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Sat, 6 Feb 2010 13:21:45 +0000 Subject: OOM handling fix --- lib/rtsp.c | 31 ++++++++++++++++++------------- tests/libtest/lib570.c | 3 +++ tests/libtest/lib571.c | 15 +++++++++++---- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/rtsp.c b/lib/rtsp.c index a63784eaa..8f3218947 100644 --- a/lib/rtsp.c +++ b/lib/rtsp.c @@ -127,8 +127,9 @@ CURLcode Curl_rtsp_disconnect(struct connectdata *conn) { CURLcode Curl_rtsp_done(struct connectdata *conn, CURLcode status, bool premature) { - CURLcode httpStatus; struct SessionHandle *data = conn->data; + struct RTSP *rtsp = data->state.proto.rtsp; + CURLcode httpStatus; long CSeq_sent; long CSeq_recv; @@ -138,18 +139,20 @@ CURLcode Curl_rtsp_done(struct connectdata *conn, httpStatus = Curl_http_done(conn, status, premature); - /* Check the sequence numbers */ - CSeq_sent = data->state.proto.rtsp->CSeq_sent; - CSeq_recv = data->state.proto.rtsp->CSeq_recv; - if((data->set.rtspreq != RTSPREQ_RECEIVE) && (CSeq_sent != CSeq_recv)) { - failf(data, "The CSeq of this request %ld did not match the response %ld", - CSeq_sent, CSeq_recv); - return CURLE_RTSP_CSEQ_ERROR; - } - else if (data->set.rtspreq == RTSPREQ_RECEIVE && - (conn->proto.rtspc.rtp_channel == -1)) { - infof(data, "Got an RTP Receive with a CSeq of %ld\n", CSeq_recv); - /* TODO CPC: Server -> Client logic here */ + if(rtsp) { + /* Check the sequence numbers */ + CSeq_sent = rtsp->CSeq_sent; + CSeq_recv = rtsp->CSeq_recv; + if((data->set.rtspreq != RTSPREQ_RECEIVE) && (CSeq_sent != CSeq_recv)) { + failf(data, "The CSeq of this request %ld did not match the response %ld", + CSeq_sent, CSeq_recv); + return CURLE_RTSP_CSEQ_ERROR; + } + else if(data->set.rtspreq == RTSPREQ_RECEIVE && + (conn->proto.rtspc.rtp_channel == -1)) { + infof(data, "Got an RTP Receive with a CSeq of %ld\n", CSeq_recv); + /* TODO CPC: Server -> Client logic here */ + } } return httpStatus; @@ -418,6 +421,8 @@ CURLcode Curl_rtsp(struct connectdata *conn, bool *done) p_range ? p_range : "", p_referrer ? p_referrer : "", p_uagent ? p_uagent : ""); + if(result) + return result; if((rtspreq == RTSPREQ_SETUP) || (rtspreq == RTSPREQ_DESCRIBE)) { result = Curl_add_timecondition(data, req_buffer); diff --git a/tests/libtest/lib570.c b/tests/libtest/lib570.c index 4f40a0276..8cfc0b88b 100644 --- a/tests/libtest/lib570.c +++ b/tests/libtest/lib570.c @@ -95,6 +95,9 @@ int test(char *URL) test_cleanup: + if(stream_uri) + free(stream_uri); + curl_easy_cleanup(curl); curl_global_cleanup(); diff --git a/tests/libtest/lib571.c b/tests/libtest/lib571.c index b91a6fa8b..24c507545 100644 --- a/tests/libtest/lib571.c +++ b/tests/libtest/lib571.c @@ -93,7 +93,7 @@ int test(char *URL) CURL *curl; char *stream_uri = NULL; int request=1; - FILE *protofile; + FILE *protofile = NULL; protofile = fopen(libtest_arg2, "wb"); if(protofile == NULL) { @@ -109,8 +109,8 @@ int test(char *URL) if ((curl = curl_easy_init()) == NULL) { fprintf(stderr, "curl_easy_init() failed\n"); - curl_global_cleanup(); fclose(protofile); + curl_global_cleanup(); return TEST_ERR_MAJOR_BAD; } test_setopt(curl, CURLOPT_URL, URL); @@ -163,7 +163,10 @@ int test(char *URL) if(res) goto test_cleanup; - stream_uri = suburl(URL, request++); + if((stream_uri = suburl(URL, request++)) == NULL) { + res = TEST_ERR_MAJOR_BAD; + goto test_cleanup; + } test_setopt(curl, CURLOPT_RTSP_STREAM_URI, stream_uri); free(stream_uri); stream_uri = NULL; @@ -184,7 +187,11 @@ int test(char *URL) test_cleanup: - fclose(protofile); + if(stream_uri) + free(stream_uri); + + if(protofile) + fclose(protofile); curl_easy_cleanup(curl); curl_global_cleanup(); -- cgit v1.2.3