Merge commit 'b97b1adb3f807e1acd00d56319ee6cb41cc727e4'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 20 Sep 2013 13:30:47 +0000 (15:30 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 20 Sep 2013 13:30:51 +0000 (15:30 +0200)
* commit 'b97b1adb3f807e1acd00d56319ee6cb41cc727e4':
  rtmpproto: Add a comment explaining the logic in handle_notify

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/rtmpproto.c

diff --combined libavformat/rtmpproto.c
@@@ -2,20 -2,20 +2,20 @@@
   * RTMP network protocol
   * Copyright (c) 2009 Konstantin Shishkov
   *
 - * 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
   */
  
@@@ -48,7 -48,7 +48,7 @@@
  #include <zlib.h>
  #endif
  
 -#define APP_MAX_LENGTH 128
 +#define APP_MAX_LENGTH 1024
  #define PLAYPATH_MAX_LENGTH 256
  #define TCURL_MAX_LENGTH 512
  #define FLASHVER_MAX_LENGTH 64
@@@ -264,6 -264,9 +264,6 @@@ static int rtmp_write_amf_data(URLConte
          *value = '\0';
          value++;
  
 -        if (!field || !value)
 -            goto fail;
 -
          ff_amf_write_field_name(p, field);
      } else {
          goto fail;
@@@ -310,7 -313,7 +310,7 @@@ static int gen_connect(URLContext *s, R
      int ret;
  
      if ((ret = ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE,
 -                                     0, 4096)) < 0)
 +                                     0, 4096 + APP_MAX_LENGTH)) < 0)
          return ret;
  
      p = pkt.data;
@@@ -1163,7 -1166,7 +1163,7 @@@ static int rtmp_handshake(URLContext *s
      for (i = 9; i <= RTMP_HANDSHAKE_PACKET_SIZE; i++)
          tosend[i] = av_lfg_get(&rnd) >> 24;
  
 -    if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +    if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
          /* When the client wants to use RTMPE, we have to change the command
           * byte to 0x06 which means to use encrypted data and we have to set
           * the flash version to at least 9.0.115.0. */
          if (ret < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Compute the shared secret key sent by the server and initialize
               * the RC4 encryption. */
              if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
          if (ret < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Encrypt the signature to be send to the server. */
              ff_rtmpe_encrypt_sig(rt->stream, tosend +
                                   RTMP_HANDSHAKE_PACKET_SIZE - 32, digest,
                                 RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Set RC4 keys for encryption and update the keystreams. */
              if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
                  return ret;
          }
      } else {
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Compute the shared secret key sent by the server and initialize
               * the RC4 encryption. */
              if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
                                 RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Set RC4 keys for encryption and update the keystreams. */
              if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
                  return ret;
@@@ -2092,9 -2095,11 +2092,11 @@@ static int handle_notify(URLContext *s
  
      // generate packet header and put data into buffer for FLV demuxer
      if (rt->flv_off < rt->flv_size) {
+         // There is old unread data in the buffer, thus append at the end
          old_flv_size  = rt->flv_size;
          rt->flv_size += datatowritelength + 15;
      } else {
+         // All data has been read, write the new data at the start of the buffer
          old_flv_size = 0;
          rt->flv_size = datatowritelength + 15;
          rt->flv_off  = 0;
@@@ -2199,7 -2204,7 +2201,7 @@@ static int get_packet(URLContext *s, in
              }
          }
          rt->bytes_read += ret;
 -        if (rt->bytes_read > rt->last_bytes_read + rt->client_report_size) {
 +        if (rt->bytes_read - rt->last_bytes_read > rt->client_report_size) {
              av_log(s, AV_LOG_DEBUG, "Sending bytes read report\n");
              if ((ret = gen_bytes_read(s, rt, rpkt.timestamp + 1)) < 0)
                  return ret;
@@@ -2452,20 -2457,16 +2454,20 @@@ reconnect
              fname = strchr(p + 1, '/');
              if (!fname || (c && c < fname)) {
                  fname = p + 1;
 -                av_strlcpy(rt->app, path + 1, p - path);
 +                av_strlcpy(rt->app, path + 1, FFMIN(p - path, APP_MAX_LENGTH));
              } else {
                  fname++;
 -                av_strlcpy(rt->app, path + 1, fname - path - 1);
 +                av_strlcpy(rt->app, path + 1, FFMIN(fname - path - 1, APP_MAX_LENGTH));
              }
          }
      }
  
      if (old_app) {
          // The name of application has been defined by the user, override it.
 +        if (strlen(old_app) >= APP_MAX_LENGTH) {
 +            ret = AVERROR(EINVAL);
 +            goto fail;
 +        }
          av_free(rt->app);
          rt->app = old_app;
      }