vlc | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Fri Nov 24 
15:03:33 2017 +0100| [d192a702d6c9ddaf0ba7b55cbd6006e6189dc7a1] | committer: 
Hugo Beauzée-Luyssen

contrib: live555: Fix undefined behaviors

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d192a702d6c9ddaf0ba7b55cbd6006e6189dc7a1
---

 contrib/src/live555/no-null-reference.patch | 128 ++++++++++++++++++++++++++++
 contrib/src/live555/rules.mak               |   2 +
 2 files changed, 130 insertions(+)

diff --git a/contrib/src/live555/no-null-reference.patch 
b/contrib/src/live555/no-null-reference.patch
new file mode 100644
index 0000000000..a1dea30fbc
--- /dev/null
+++ b/contrib/src/live555/no-null-reference.patch
@@ -0,0 +1,128 @@
+--- live555/liveMedia/RTSPClient.cpp.old       2017-11-24 14:34:20.588181348 
+0100
++++ live555/liveMedia/RTSPClient.cpp   2017-11-24 14:56:37.520204839 +0100
+@@ -183,13 +183,13 @@
+   }
+ }
+ 
+-void RTSPClient::setSpeed(MediaSession& session, float speed) { 
++void RTSPClient::setSpeed(MediaSession* session, float speed) {
+   // Optionally set download speed for session to be used later on PLAY 
command:
+   // The user should call this function after the MediaSession is 
instantiated, but before the
+   // first "sendPlayCommand()" is called.
+-  if (&session != NULL) {
+-    session.speed() = speed;
+-    MediaSubsessionIterator iter(session);
++  if (session != NULL) {
++    session->speed() = speed;
++    MediaSubsessionIterator iter(*session);
+     MediaSubsession* subsession;
+ 
+     while ((subsession = iter.next()) != NULL) {
+@@ -1215,26 +1215,26 @@
+   return success;
+ }
+ 
+-Boolean RTSPClient::handlePLAYResponse(MediaSession& session, 
MediaSubsession& subsession,
++Boolean RTSPClient::handlePLAYResponse(MediaSession* session, 
MediaSubsession* subsession,
+                                        char const* scaleParamsStr, char 
const* speedParamsStr,
+                                        char const* rangeParamsStr, char 
const* rtpInfoParamsStr) {
+   Boolean scaleOK = False, rangeOK = False, speedOK = False;
+   do {
+-    if (&session != NULL) {
++    if (session != NULL) {
+       // The command was on the whole session
+-      if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, 
session.scale())) break;
++      if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, 
session->scale())) break;
+       scaleOK = True;
+-      if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, 
session.speed())) break;
++      if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, 
session->speed())) break;
+       speedOK = True;
+       Boolean startTimeIsNow;
+       if (rangeParamsStr != NULL &&
+         !parseRangeParam(rangeParamsStr,
+-                         session.playStartTime(), session.playEndTime(),
+-                         session._absStartTime(), session._absEndTime(),
++               session->playStartTime(), session->playEndTime(),
++               session->_absStartTime(), session->_absEndTime(),
+                          startTimeIsNow)) break;
+       rangeOK = True;
+ 
+-      MediaSubsessionIterator iter(session);
++      MediaSubsessionIterator iter(*session);
+       MediaSubsession* subsession;
+       while ((subsession = iter.next()) != NULL) {
+       u_int16_t seqNum; u_int32_t timestamp;
+@@ -1249,27 +1249,27 @@
+       }
+     } else {
+       // The command was on a subsession
+-      if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, 
subsession.scale())) break;
++      if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, 
subsession->scale())) break;
+       scaleOK = True;
+-      if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, 
session.speed())) break;
++      if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, 
subsession->speed())) break;
+       speedOK = True;
+       Boolean startTimeIsNow;
+       if (rangeParamsStr != NULL &&
+         !parseRangeParam(rangeParamsStr,
+-                         subsession._playStartTime(), 
subsession._playEndTime(),
+-                         subsession._absStartTime(), subsession._absEndTime(),
++               subsession->_playStartTime(), subsession->_playEndTime(),
++               subsession->_absStartTime(), subsession->_absEndTime(),
+                          startTimeIsNow)) break;
+       rangeOK = True;
+ 
+       u_int16_t seqNum; u_int32_t timestamp;
+-      subsession.rtpInfo.infoIsNew = False;
++      subsession->rtpInfo.infoIsNew = False;
+       if (parseRTPInfoParams(rtpInfoParamsStr, seqNum, timestamp)) {
+-      subsession.rtpInfo.seqNum = seqNum;
+-      subsession.rtpInfo.timestamp = timestamp;
+-      subsession.rtpInfo.infoIsNew = True;
++    subsession->rtpInfo.seqNum = seqNum;
++    subsession->rtpInfo.timestamp = timestamp;
++    subsession->rtpInfo.infoIsNew = True;
+       }
+ 
+-      if (subsession.rtpSource() != NULL) 
subsession.rtpSource()->enableRTCPReports() = True; // start sending RTCP "RR"s 
now
++      if (subsession->rtpSource() != NULL) 
subsession->rtpSource()->enableRTCPReports() = True; // start sending RTCP 
"RR"s now
+     }
+ 
+     return True;
+@@ -1809,12 +1809,12 @@
+       if (responseCode == 200) {
+         // Do special-case response handling for some commands:
+         if (strcmp(foundRequest->commandName(), "SETUP") == 0) {
+-          if (!handleSETUPResponse(*foundRequest->subsession(), 
sessionParamsStr, transportParamsStr, foundRequest->booleanFlags()&0x1)) break;
++        if (!handleSETUPResponse(*foundRequest->subsession(), 
sessionParamsStr, transportParamsStr, foundRequest->booleanFlags()&0x1)) break;
+         } else if (strcmp(foundRequest->commandName(), "PLAY") == 0) {
+-          if (!handlePLAYResponse(*foundRequest->session(), 
*foundRequest->subsession(), scaleParamsStr, speedParamsStr, rangeParamsStr, 
rtpInfoParamsStr)) break;
++        if (!handlePLAYResponse(foundRequest->session(), 
foundRequest->subsession(), scaleParamsStr, speedParamsStr, rangeParamsStr, 
rtpInfoParamsStr)) break;
+         } else if (strcmp(foundRequest->commandName(), "TEARDOWN") == 0) {
+-          if (!handleTEARDOWNResponse(*foundRequest->session(), 
*foundRequest->subsession())) break;
+-        } else if (strcmp(foundRequest->commandName(), "GET_PARAMETER") == 0) 
{
++        if (!handleTEARDOWNResponse(*foundRequest->session(), 
*foundRequest->subsession())) break;
++      } else if (strcmp(foundRequest->commandName(), "GET_PARAMETER") == 0) {
+           if (!handleGET_PARAMETERResponse(foundRequest->contentStr(), 
bodyStart, responseEnd)) break;
+         }
+       } else if (responseCode == 401 && 
handleAuthenticationFailure(wwwAuthenticateParamsStr)) {
+--- live555/liveMedia/include/RTSPClient.hh.old.h      2017-11-24 
14:48:30.544196283 +0100
++++ live555/liveMedia/include/RTSPClient.hh    2017-11-24 14:56:57.836205196 
+0100
+@@ -155,7 +155,7 @@
+       // Our implementation automatically does this just prior to sending 
each "PLAY" command;
+       // You should not call these functions yourself unless you know what 
you're doing.
+ 
+-  void setSpeed(MediaSession& session, float speed = 1.0f);
++  void setSpeed(MediaSession* session, float speed = 1.0f);
+       // Set (recorded) media download speed to given value to support faster 
download using 'Speed:'
+       // option on 'PLAY' command.
+ 
+@@ -286,7 +286,7 @@
+   Boolean parseRTPInfoParams(char const*& paramStr, u_int16_t& seqNum, 
u_int32_t& timestamp);
+   Boolean handleSETUPResponse(MediaSubsession& subsession, char const* 
sessionParamsStr, char const* transportParamsStr,
+                             Boolean streamUsingTCP);
+-  Boolean handlePLAYResponse(MediaSession& session, MediaSubsession& 
subsession,
++  Boolean handlePLAYResponse(MediaSession* session, MediaSubsession* 
subsession,
+                              char const* scaleParamsStr, const char* 
speedParamsStr,
+                            char const* rangeParamsStr, char const* 
rtpInfoParamsStr);
+   Boolean handleTEARDOWNResponse(MediaSession& session, MediaSubsession& 
subsession);
diff --git a/contrib/src/live555/rules.mak b/contrib/src/live555/rules.mak
index 19d04541d8..c389f2c33d 100644
--- a/contrib/src/live555/rules.mak
+++ b/contrib/src/live555/rules.mak
@@ -66,6 +66,8 @@ endif
        $(APPLY) $(SRC)/live555/live555-nosignal.patch
        # Don't use FormatMessageA on WinRT
        $(APPLY) $(SRC)/live555/winstore.patch
+       # Don't rely on undefined behaviors
+       $(APPLY) $(SRC)/live555/no-null-reference.patch
        # Add a pkg-config file
        $(APPLY) $(SRC)/live555/add-pkgconfig-file.patch
 

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to