[vlc-commits] demux: adaptive: remove old TLS api and network primitives

Francois Cartegnie git at videolan.org
Wed Feb 21 23:23:16 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Feb 21 23:18:05 2018 +0100| [55fa460795d4f066c35a4331c40fbe9f12315cbc] | committer: Francois Cartegnie

demux: adaptive: remove old TLS api and network primitives

fixes old api leak

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

 modules/demux/Makefile.am                          |   4 +-
 modules/demux/adaptive/http/ConnectionParams.hpp   |   2 +-
 modules/demux/adaptive/http/HTTPConnection.cpp     |  41 +++--
 modules/demux/adaptive/http/HTTPConnection.hpp     |   6 +-
 .../demux/adaptive/http/HTTPConnectionManager.cpp  |   2 +-
 modules/demux/adaptive/http/Sockets.cpp            | 178 ---------------------
 modules/demux/adaptive/http/Sockets.hpp            |  72 ---------
 modules/demux/adaptive/http/Transport.cpp          | 113 +++++++++++++
 modules/demux/adaptive/http/Transport.hpp          |  51 ++++++
 9 files changed, 191 insertions(+), 278 deletions(-)

diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
index e6006ae0a4..dba3c4c6b6 100644
--- a/modules/demux/Makefile.am
+++ b/modules/demux/Makefile.am
@@ -338,8 +338,8 @@ libadaptive_plugin_la_SOURCES = \
     demux/adaptive/http/HTTPConnection.hpp \
     demux/adaptive/http/HTTPConnectionManager.cpp \
     demux/adaptive/http/HTTPConnectionManager.h \
-    demux/adaptive/http/Sockets.hpp \
-    demux/adaptive/http/Sockets.cpp \
+    demux/adaptive/http/Transport.hpp \
+    demux/adaptive/http/Transport.cpp \
     demux/adaptive/plumbing/CommandsQueue.cpp \
     demux/adaptive/plumbing/CommandsQueue.hpp \
     demux/adaptive/plumbing/Demuxer.cpp \
diff --git a/modules/demux/adaptive/http/ConnectionParams.hpp b/modules/demux/adaptive/http/ConnectionParams.hpp
index 040d7f6e6b..9381e396b7 100644
--- a/modules/demux/adaptive/http/ConnectionParams.hpp
+++ b/modules/demux/adaptive/http/ConnectionParams.hpp
@@ -27,7 +27,7 @@ namespace adaptive
 {
     namespace http
     {
-        class Socket;
+        class Transport;
 
         class ConnectionParams
         {
diff --git a/modules/demux/adaptive/http/HTTPConnection.cpp b/modules/demux/adaptive/http/HTTPConnection.cpp
index b24eb87212..0ed1f98e57 100644
--- a/modules/demux/adaptive/http/HTTPConnection.cpp
+++ b/modules/demux/adaptive/http/HTTPConnection.cpp
@@ -24,7 +24,7 @@
 #include "HTTPConnection.hpp"
 #include "ConnectionParams.hpp"
 #include "AuthStorage.hpp"
-#include "Sockets.hpp"
+#include "Transport.hpp"
 
 #include <cstdio>
 #include <sstream>
@@ -65,10 +65,10 @@ const std::string & AbstractConnection::getContentType() const
 }
 
 HTTPConnection::HTTPConnection(vlc_object_t *p_object_, AuthStorage *auth,
-                               Socket *socket_, const ConnectionParams &proxy, bool persistent)
+                               Transport *socket_, const ConnectionParams &proxy, bool persistent)
     : AbstractConnection( p_object_ )
 {
-    socket = socket_;
+    transport = socket_;
     psz_useragent = var_InheritString(p_object_, "http-user-agent");
     queryOk = false;
     retries = 0;
@@ -83,7 +83,7 @@ HTTPConnection::HTTPConnection(vlc_object_t *p_object_, AuthStorage *auth,
 HTTPConnection::~HTTPConnection()
 {
     free(psz_useragent);
-    delete socket;
+    delete transport;
 }
 
 bool HTTPConnection::canReuse(const ConnectionParams &params_) const
@@ -108,16 +108,16 @@ bool HTTPConnection::canReuse(const ConnectionParams &params_) const
 bool HTTPConnection::connect()
 {
     if(proxyparams.getHostname().empty())
-        return socket->connect(p_object, params.getHostname().c_str(),
+        return transport->connect(p_object, params.getHostname().c_str(),
                                          params.getPort());
     else
-        return socket->connect(p_object, proxyparams.getHostname().c_str(),
+        return transport->connect(p_object, proxyparams.getHostname().c_str(),
                                          proxyparams.getPort());
 }
 
 bool HTTPConnection::connected() const
 {
-    return socket->connected();
+    return transport->connected();
 }
 
 void HTTPConnection::disconnect()
@@ -129,7 +129,7 @@ void HTTPConnection::disconnect()
     chunkLength = 0;
     bytesRange = BytesRange();
     contentType = std::string();
-    socket->disconnect();
+    transport->disconnect();
 }
 
 int HTTPConnection::request(const std::string &path, const BytesRange &range)
@@ -168,7 +168,7 @@ int HTTPConnection::request(const std::string &path, const BytesRange &range)
 
     if(!send( header ))
     {
-        socket->disconnect();
+        transport->disconnect();
         if(!connectionClose)
         {
             /* server closed connection pipeline after last req. need new */
@@ -185,11 +185,11 @@ int HTTPConnection::request(const std::string &path, const BytesRange &range)
     }
     else if(i_ret == VLC_ETIMEOUT) /* redir */
     {
-        socket->disconnect();
+        transport->disconnect();
     }
     else if(i_ret == VLC_EGENERIC)
     {
-        socket->disconnect();
+        transport->disconnect();
         if(!connectionClose)
         {
             connectionClose = true;
@@ -219,14 +219,14 @@ ssize_t HTTPConnection::read(void *p_buffer, size_t len)
         len = toRead;
 
     ssize_t ret = ( chunked ) ? readChunk(p_buffer, len)
-                              : socket->read(p_object, p_buffer, len);
+                              : transport->read(p_buffer, len);
     if(ret >= 0)
         bytesRead += ret;
 
     if(ret < 0 || (size_t)ret < len || /* set EOF */
        (contentLength == bytesRead && connectionClose))
     {
-        socket->disconnect();
+        transport->disconnect();
         return ret;
     }
 
@@ -240,7 +240,7 @@ bool HTTPConnection::send(const std::string &data)
 
 bool HTTPConnection::send(const void *buf, size_t size)
 {
-    return socket->send(p_object, buf, size);
+    return transport->send(buf, size);
 }
 
 int HTTPConnection::parseReply()
@@ -319,7 +319,7 @@ ssize_t HTTPConnection::readChunk(void *p_buffer, size_t len)
             if(toread > chunkLength)
                 toread = chunkLength;
 
-            ssize_t in = socket->read(p_object, &((uint8_t*)p_buffer)[copied], toread);
+            ssize_t in = transport->read(&((uint8_t*)p_buffer)[copied], toread);
             if(in < 0)
             {
                 return (copied == 0) ? in : copied;
@@ -336,7 +336,7 @@ ssize_t HTTPConnection::readChunk(void *p_buffer, size_t len)
         if(chunkLength == 0)
         {
             char crlf[2];
-            ssize_t in = socket->read(p_object, &crlf, 2);
+            ssize_t in = transport->read(&crlf, 2);
             if(in < 2 || memcmp(crlf, "\r\n", 2))
                 return (copied == 0) ? -1 : copied;
         }
@@ -347,7 +347,7 @@ ssize_t HTTPConnection::readChunk(void *p_buffer, size_t len)
 
 std::string HTTPConnection::readLine()
 {
-    return socket->readline(p_object);
+    return transport->readline();
 }
 
 void HTTPConnection::setUsed( bool b )
@@ -591,15 +591,14 @@ AbstractConnection * ConnectionFactory::createConnection(vlc_object_t *p_object,
     }
     else scheme = params.getScheme();
 
-    const int sockettype = (params.getScheme() == "https") ? TLSSocket::TLS : Socket::REGULAR;
-    Socket *socket = (sockettype == TLSSocket::TLS) ? new (std::nothrow) TLSSocket()
-                                                    : new (std::nothrow) Socket();
+    const bool b_secure = (params.getScheme() == "https");
+    Transport *socket = new (std::nothrow) Transport(b_secure);
     if(!socket)
         return NULL;
 
     /* disable pipelined tls until we have ticket/resume session support */
     HTTPConnection *conn = new (std::nothrow)
-            HTTPConnection(p_object, authStorage, socket, proxy, sockettype != TLSSocket::TLS);
+            HTTPConnection(p_object, authStorage, socket, proxy, !b_secure);
     if(!conn)
     {
         delete socket;
diff --git a/modules/demux/adaptive/http/HTTPConnection.hpp b/modules/demux/adaptive/http/HTTPConnection.hpp
index c006a06808..dd8e41a163 100644
--- a/modules/demux/adaptive/http/HTTPConnection.hpp
+++ b/modules/demux/adaptive/http/HTTPConnection.hpp
@@ -34,7 +34,7 @@ namespace adaptive
 {
     namespace http
     {
-        class Socket;
+        class Transport;
         class AuthStorage;
 
         class AbstractConnection
@@ -66,7 +66,7 @@ namespace adaptive
         class HTTPConnection : public AbstractConnection
         {
             public:
-                HTTPConnection(vlc_object_t *, AuthStorage *,  Socket *,
+                HTTPConnection(vlc_object_t *, AuthStorage *,  Transport *,
                                const ConnectionParams &, bool = false);
                 virtual ~HTTPConnection();
 
@@ -107,7 +107,7 @@ namespace adaptive
                 static const int    retryCount = 5;
 
             private:
-                Socket *socket;
+                Transport *transport;
        };
 
        class StreamUrlConnection : public AbstractConnection
diff --git a/modules/demux/adaptive/http/HTTPConnectionManager.cpp b/modules/demux/adaptive/http/HTTPConnectionManager.cpp
index 2f10bde146..a6f1baf347 100644
--- a/modules/demux/adaptive/http/HTTPConnectionManager.cpp
+++ b/modules/demux/adaptive/http/HTTPConnectionManager.cpp
@@ -28,7 +28,7 @@
 #include "HTTPConnectionManager.h"
 #include "HTTPConnection.hpp"
 #include "ConnectionParams.hpp"
-#include "Sockets.hpp"
+#include "Transport.hpp"
 #include "Downloader.hpp"
 #include <vlc_url.h>
 #include <vlc_http.h>
diff --git a/modules/demux/adaptive/http/Sockets.cpp b/modules/demux/adaptive/http/Sockets.cpp
deleted file mode 100644
index d6916ee569..0000000000
--- a/modules/demux/adaptive/http/Sockets.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Sockets.cpp
- *****************************************************************************
- * Copyright (C) 2015 - VideoLAN and VLC authors
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "Sockets.hpp"
-
-#include <vlc_network.h>
-#include <cerrno>
-
-using namespace adaptive::http;
-
-Socket::Socket()
-{
-    netfd = -1;
-    type = REGULAR;
-}
-
-Socket::Socket( int type_ )
-{
-    netfd = -1;
-    type = type_;
-}
-
-Socket::~Socket()
-{
-    disconnect();
-}
-
-bool Socket::connect(vlc_object_t *p_object, const std::string &hostname, int port)
-{
-    netfd = net_ConnectTCP(p_object, hostname.c_str(), port);
-
-    if(netfd == -1)
-        return false;
-
-    return true;
-}
-
-int Socket::getType() const
-{
-    return type;
-}
-
-bool Socket::connected() const
-{
-    return (netfd != -1);
-}
-
-void Socket::disconnect()
-{
-    if (netfd >= 0)
-    {
-        net_Close(netfd);
-        netfd = -1;
-    }
-}
-
-ssize_t Socket::read(vlc_object_t *p_object, void *p_buffer, size_t len)
-{
-    return net_Read(p_object, netfd, p_buffer, len);
-}
-
-std::string Socket::readline(vlc_object_t *p_object)
-{
-    char *line = ::net_Gets(p_object, netfd);
-    if(line == NULL)
-        return "";
-    std::string ret(line);
-    ::free(line);
-    return ret;
-}
-
-bool Socket::send(vlc_object_t *p_object, const void *buf, size_t size)
-{
-    if (netfd == -1)
-        return false;
-
-    if (size == 0)
-        return true;
-
-    return net_Write(p_object, netfd, buf, size) == (ssize_t)size;
-}
-
-TLSSocket::TLSSocket() : Socket( TLS )
-{
-    creds = NULL;
-    tls = NULL;
-}
-
-TLSSocket::~TLSSocket()
-{
-    disconnect();
-}
-
-bool TLSSocket::connect(vlc_object_t *p_object, const std::string &hostname, int port)
-{
-    disconnect();
-    if(!Socket::connect(p_object, hostname, port))
-        return false;
-
-    creds = vlc_tls_ClientCreate(p_object);
-    if(!creds)
-    {
-        disconnect();
-        return false;
-    }
-
-    tls = vlc_tls_ClientSessionCreateFD(creds, netfd, hostname.c_str(), "https", NULL, NULL);
-    if(!tls)
-    {
-        disconnect();
-        return false;
-    }
-
-    return true;
-}
-
-bool TLSSocket::connected() const
-{
-    return Socket::connected() && tls;
-}
-
-ssize_t TLSSocket::read(vlc_object_t *, void *p_buffer, size_t len)
-{
-    return vlc_tls_Read(tls, p_buffer, len, true);
-}
-
-std::string TLSSocket::readline(vlc_object_t *)
-{
-    char *line = ::vlc_tls_GetLine(tls);
-    if(line == NULL)
-        return "";
-
-    std::string ret(line);
-    ::free(line);
-    return ret;
-}
-
-bool TLSSocket::send(vlc_object_t *, const void *buf, size_t size)
-{
-    if (!connected())
-        return false;
-
-    if (size == 0)
-        return true;
-
-    return vlc_tls_Write(tls, buf, size) == (ssize_t)size;
-}
-
-void TLSSocket::disconnect()
-{
-    if(tls)
-        vlc_tls_SessionDelete(tls);
-    if(creds)
-        vlc_tls_Delete(creds);
-    tls = NULL;
-    creds = NULL;
-    Socket::disconnect();
-}
diff --git a/modules/demux/adaptive/http/Sockets.hpp b/modules/demux/adaptive/http/Sockets.hpp
deleted file mode 100644
index d1df1d2df0..0000000000
--- a/modules/demux/adaptive/http/Sockets.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Sockets.hpp
- *****************************************************************************
- * Copyright (C) 2015 - VideoLAN and VLC authors
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-#ifndef SOCKETS_HPP
-#define SOCKETS_HPP
-
-#include <vlc_common.h>
-#include <vlc_tls.h>
-#include <string>
-
-namespace adaptive
-{
-    namespace http
-    {
-        class Socket
-        {
-            public:
-                Socket();
-                virtual ~Socket();
-                virtual bool    connect     (vlc_object_t *, const std::string&, int port = 80);
-                virtual bool    connected   () const;
-                virtual bool    send        (vlc_object_t *, const void *buf, size_t size);
-                virtual ssize_t read        (vlc_object_t *, void *p_buffer, size_t len);
-                virtual std::string readline(vlc_object_t *);
-                virtual void    disconnect  ();
-                int     getType() const;
-                static const int REGULAR = 0;
-
-            protected:
-                Socket( int );
-                int netfd;
-                int type;
-        };
-
-        class TLSSocket : public Socket
-        {
-            public:
-                TLSSocket();
-                virtual ~TLSSocket();
-                virtual bool    connect     (vlc_object_t *, const std::string&, int port = 443);
-                virtual bool    connected   () const;
-                virtual bool    send        (vlc_object_t *, const void *buf, size_t size);
-                virtual ssize_t read        (vlc_object_t *, void *p_buffer, size_t len);
-                virtual std::string readline(vlc_object_t *);
-                virtual void    disconnect  ();
-                static const int TLS = REGULAR + 1;
-
-            private:
-                vlc_tls_creds_t *creds;
-                vlc_tls_t *tls;
-        };
-    }
-}
-
-
-#endif // SOCKETS_HPP
diff --git a/modules/demux/adaptive/http/Transport.cpp b/modules/demux/adaptive/http/Transport.cpp
new file mode 100644
index 0000000000..b827a69a31
--- /dev/null
+++ b/modules/demux/adaptive/http/Transport.cpp
@@ -0,0 +1,113 @@
+/*
+ * Transport.cpp
+ *****************************************************************************
+ * Copyright (C) 2015-2018 VideoLabs, VideoLAN and VLC authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Transport.hpp"
+
+using namespace adaptive::http;
+
+Transport::Transport(bool b_secure_)
+{
+    creds = NULL;
+    tls = NULL;
+    b_secure = b_secure_;
+}
+
+Transport::~Transport()
+{
+    if(connected())
+        disconnect();
+}
+
+bool Transport::connect(vlc_object_t *p_object, const std::string &hostname, int port)
+{
+    if(connected())
+        disconnect();
+
+    if(b_secure)
+    {
+        creds = vlc_tls_ClientCreate(p_object);
+        if(!creds)
+            return false;
+        tls = vlc_tls_SocketOpenTLS(creds, hostname.c_str(), port, "https",
+                                    NULL, NULL );
+        if(!tls)
+        {
+            vlc_tls_Delete(creds);
+            creds = NULL;
+        }
+    }
+    else
+    {
+        tls = vlc_tls_SocketOpenTCP(p_object, hostname.c_str(), port);
+    }
+
+    return tls != NULL;
+}
+
+bool Transport::connected() const
+{
+    return tls != NULL;
+}
+
+void Transport::disconnect()
+{
+    if(tls)
+    {
+        vlc_tls_Close(tls);
+        tls = NULL;
+    }
+
+    if(creds)
+    {
+        vlc_tls_Delete(creds);
+        creds = NULL;
+    }
+}
+
+ssize_t Transport::read(void *p_buffer, size_t len)
+{
+    return vlc_tls_Read(tls, p_buffer, len, true);
+}
+
+std::string Transport::readline()
+{
+    char *line = ::vlc_tls_GetLine(tls);
+    if(line == NULL)
+        return "";
+
+    std::string ret(line);
+    ::free(line);
+    return ret;
+}
+
+bool Transport::send(const void *buf, size_t size)
+{
+    if (!connected())
+        return false;
+
+    if (size == 0)
+        return true;
+
+    return vlc_tls_Write(tls, buf, size) == (ssize_t)size;
+}
+
diff --git a/modules/demux/adaptive/http/Transport.hpp b/modules/demux/adaptive/http/Transport.hpp
new file mode 100644
index 0000000000..c06db0e23f
--- /dev/null
+++ b/modules/demux/adaptive/http/Transport.hpp
@@ -0,0 +1,51 @@
+/*
+ * Transport.hpp
+ *****************************************************************************
+ * Copyright (C) 2015-2018 - VideoLabs, VideoLAN and VLC authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#ifndef TRANSPORT_HPP
+#define TRANSPORT_HPP
+
+#include <vlc_common.h>
+#include <vlc_tls.h>
+#include <string>
+
+namespace adaptive
+{
+    namespace http
+    {
+        class Transport
+        {
+            public:
+                Transport(bool b_secure = false);
+                ~Transport();
+                bool    connect     (vlc_object_t *, const std::string&, int port = 80);
+                bool    connected   () const;
+                bool    send        (const void *buf, size_t size);
+                ssize_t read        (void *p_buffer, size_t len);
+                std::string readline();
+                void    disconnect  ();
+
+            protected:
+                vlc_tls_creds_t *creds;
+                vlc_tls_t *tls;
+                bool b_secure;
+        };
+    }
+}
+
+#endif // TRANSPORT_HPP



More information about the vlc-commits mailing list