]> git.sesse.net Git - ffmpeg/commitdiff
Merge commit '6a9c00c09d2bc50c0ea64ba092b2f4afc46aa978'
authorJames Almer <jamrial@gmail.com>
Tue, 11 Sep 2018 16:18:52 +0000 (13:18 -0300)
committerJames Almer <jamrial@gmail.com>
Tue, 11 Sep 2018 16:18:52 +0000 (13:18 -0300)
* commit '6a9c00c09d2bc50c0ea64ba092b2f4afc46aa978':
  tls_openssl: Fix checks for SSL_ERROR_WANT_WRITE in nonblocking operation

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavformat/tls_openssl.c

index 59a86150a793dbc18c34f56578f6839c8fd7fb1a,4a2fcfd7718c4431a0599f4d3ce13c5b8fdc3cd2..7ae71bdaf36d7ab01cefa15136cb2d370a70aecd
@@@ -2,20 -2,20 +2,20 @@@
   * TLS/SSL Protocol
   * Copyright (c) 2011 Martin Storsjo
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -66,21 -66,16 +66,21 @@@ static unsigned long openssl_thread_id(
  #endif
  #endif
  
 -void ff_openssl_init(void)
 +int ff_openssl_init(void)
  {
 -    avpriv_lock_avformat();
 +    ff_lock_avformat();
      if (!openssl_init) {
          SSL_library_init();
          SSL_load_error_strings();
  #if HAVE_THREADS
          if (!CRYPTO_get_locking_callback()) {
              int i;
 -            openssl_mutexes = av_malloc(sizeof(pthread_mutex_t) * CRYPTO_num_locks());
 +            openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks());
 +            if (!openssl_mutexes) {
 +                ff_unlock_avformat();
 +                return AVERROR(ENOMEM);
 +            }
 +
              for (i = 0; i < CRYPTO_num_locks(); i++)
                  pthread_mutex_init(&openssl_mutexes[i], NULL);
              CRYPTO_set_locking_callback(openssl_lock);
  #endif
      }
      openssl_init++;
 -    avpriv_unlock_avformat();
 +    ff_unlock_avformat();
 +
 +    return 0;
  }
  
  void ff_openssl_deinit(void)
  {
 -    avpriv_lock_avformat();
 +    ff_lock_avformat();
      openssl_init--;
      if (!openssl_init) {
  #if HAVE_THREADS
          }
  #endif
      }
 -    avpriv_unlock_avformat();
 +    ff_unlock_avformat();
  }
  
  static int print_tls_error(URLContext *h, int ret)
      TLSContext *c = h->priv_data;
      if (h->flags & AVIO_FLAG_NONBLOCK) {
          int err = SSL_get_error(c->ssl, ret);
-         if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_READ)
+         if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
              return AVERROR(EAGAIN);
      }
      av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL));
@@@ -233,8 -226,7 +233,8 @@@ static int tls_open(URLContext *h, cons
      BIO *bio;
      int ret;
  
 -    ff_openssl_init();
 +    if ((ret = ff_openssl_init()) < 0)
 +        return ret;
  
      if ((ret = ff_tls_open_underlying(c, h, uri, options)) < 0)
          goto fail;
          goto fail;
      }
      SSL_CTX_set_options(p->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
 -    if (c->ca_file)
 -        SSL_CTX_load_verify_locations(p->ctx, c->ca_file, NULL);
 +    if (c->ca_file) {
 +        if (!SSL_CTX_load_verify_locations(p->ctx, c->ca_file, NULL))
 +            av_log(h, AV_LOG_ERROR, "SSL_CTX_load_verify_locations %s\n", ERR_error_string(ERR_get_error(), NULL));
 +    }
      if (c->cert_file && !SSL_CTX_use_certificate_chain_file(p->ctx, c->cert_file)) {
          av_log(h, AV_LOG_ERROR, "Unable to load cert file %s: %s\n",
                 c->cert_file, ERR_error_string(ERR_get_error(), NULL));
      // Note, this doesn't check that the peer certificate actually matches
      // the requested hostname.
      if (c->verify)
 -        SSL_CTX_set_verify(p->ctx, SSL_VERIFY_PEER, NULL);
 +        SSL_CTX_set_verify(p->ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
      p->ssl = SSL_new(p->ctx);
      if (!p->ssl) {
          av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL));
@@@ -339,12 -329,6 +339,12 @@@ static int tls_write(URLContext *h, con
      return print_tls_error(h, ret);
  }
  
 +static int tls_get_file_handle(URLContext *h)
 +{
 +    TLSContext *c = h->priv_data;
 +    return ffurl_get_file_handle(c->tls_shared.tcp);
 +}
 +
  static const AVOption options[] = {
      TLS_COMMON_OPTIONS(TLSContext, tls_shared),
      { NULL }
@@@ -363,7 -347,6 +363,7 @@@ const URLProtocol ff_tls_protocol = 
      .url_read       = tls_read,
      .url_write      = tls_write,
      .url_close      = tls_close,
 +    .url_get_file_handle = tls_get_file_handle,
      .priv_data_size = sizeof(TLSContext),
      .flags          = URL_PROTOCOL_FLAG_NETWORK,
      .priv_data_class = &tls_class,