From 0f4a91afdedc4b1f7b02f8b015fde1889d80c104 Mon Sep 17 00:00:00 2001
From: Yang Tse <yangsita@gmail.com>
Date: Sat, 6 Feb 2010 13:21:45 +0000
Subject: [PATCH] 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 a63784eaa5..8f3218947f 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 4f40a02765..8cfc0b88b5 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 b91a6fa8b8..24c507545a 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();
-- 
GitLab