summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2010-02-06 13:21:45 +0000
committerYang Tse <yangsita@gmail.com>2010-02-06 13:21:45 +0000
commit0f4a91afdedc4b1f7b02f8b015fde1889d80c104 (patch)
treea3277cf4f8ee0db7523ab4e33b0221faab1a5800
parent2c2464a68211fb788b21de50a51798baa57423be (diff)
downloadgnurl-0f4a91afdedc4b1f7b02f8b015fde1889d80c104.tar.gz
gnurl-0f4a91afdedc4b1f7b02f8b015fde1889d80c104.tar.bz2
gnurl-0f4a91afdedc4b1f7b02f8b015fde1889d80c104.zip
OOM handling fix
-rw-r--r--lib/rtsp.c31
-rw-r--r--tests/libtest/lib570.c3
-rw-r--r--tests/libtest/lib571.c15
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();