[SCM] libav/experimental: get_packetheader() forgot to read the header_checksum in big packets patch from Clemens Ladisch cladisch AT fastmail dot net (stray base64 patch reverted in the next commits)

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:57:01 UTC 2013


The following commit has been merged in the experimental branch:
commit bb0eb714bd8343dfc69857914b99ccd3438430bf
Author: Luca Barbato <lu_zero at gentoo.org>
Date:   Wed Feb 28 03:28:31 2007 +0000

    get_packetheader() forgot to read the header_checksum in big packets
    patch from Clemens Ladisch cladisch AT fastmail dot net
    (stray base64 patch reverted in the next commits)
    
    Originally committed as revision 8156 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/http.c b/libavformat/http.c
index 1284c31..da619bb 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -206,14 +206,17 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr,
     HTTPContext *s = h->priv_data;
     int post, err, ch;
     char line[1024], *q;
-    char *auth_b64;
+    char *auth_b64 = av_malloc(strlen(auth) * 4 / 3 + 12);
     offset_t off = s->off;
 
+    if (auth_b64 == NULL) return AVERROR(ENOMEM);
 
     /* send http header */
     post = h->flags & URL_WRONLY;
 
-    auth_b64 = av_base64_encode((uint8_t *)auth, strlen(auth));
+    auth_b64 = av_base64_encode(auth_b64, strlen(auth) * 4 / 3 + 12,
+                                (uint8_t *)auth, strlen(auth));
+
     snprintf(s->buffer, sizeof(s->buffer),
              "%s %s HTTP/1.1\r\n"
              "User-Agent: %s\r\n"
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index e158326..ec1c04e 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -104,6 +104,8 @@ static int get_packetheader(NUTContext *nut, ByteIOContext *bc, int calculate_ch
 //    start= url_ftell(bc) - 8;
 
     size= get_v(bc);
+    if(size > 4096)
+        get_be32(bc); //FIXME check this
 
     init_checksum(bc, calculate_checksum ? av_crc04C11DB7_update : NULL, 0);
 
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 67d4b0c..ebd9ba4 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -18,7 +18,7 @@ OBJS= mathematics.o \
 
 HEADERS = avutil.h common.h mathematics.h integer.h rational.h \
           intfloat_readwrite.h md5.h adler32.h log.h fifo.h lzo.h \
-          random.h
+          random.h base64.h
 
 NAME=avutil
 LIBVERSION=$(LAVUVERSION)
diff --git a/libavutil/avutil.h b/libavutil/avutil.h
index d85755c..32bc40b 100644
--- a/libavutil/avutil.h
+++ b/libavutil/avutil.h
@@ -34,8 +34,8 @@ extern "C" {
 #define AV_STRINGIFY(s)         AV_TOSTRING(s)
 #define AV_TOSTRING(s) #s
 
-#define LIBAVUTIL_VERSION_INT   ((49<<16)+(3<<8)+0)
-#define LIBAVUTIL_VERSION       49.3.0
+#define LIBAVUTIL_VERSION_INT   ((49<<16)+(4<<8)+0)
+#define LIBAVUTIL_VERSION       49.4.0
 #define LIBAVUTIL_BUILD         LIBAVUTIL_VERSION_INT
 
 #define LIBAVUTIL_IDENT         "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
diff --git a/libavutil/base64.c b/libavutil/base64.c
index 6279244..73f41bb 100644
--- a/libavutil/base64.c
+++ b/libavutil/base64.c
@@ -70,17 +70,17 @@ int av_base64_decode(uint8_t * out, const char *in, int out_length)
 * fixed edge cases and made it work from data (vs. strings) by ryan.
 *****************************************************************************/
 
-char *av_base64_encode(uint8_t * src, int len)
+char *av_base64_encode(char *out, int out_len, uint8_t * src, int len)
 {
     static const char b64[] =
         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-    char *ret, *dst;
+    char *dst;
     unsigned i_bits = 0;
     int i_shift = 0;
     int bytes_remaining = len;
 
-    if (len < UINT_MAX / 4) {
-        ret = dst = av_malloc(len * 4 / 3 + 12);
+    if (len < UINT_MAX / 4 && out_len > (len * 4 / 3 + 12) && out) {
+        dst = out;
     } else
         return NULL;
 
@@ -95,12 +95,12 @@ char *av_base64_encode(uint8_t * src, int len)
                 i_shift -= 6;
             } while (i_shift > 6 || (bytes_remaining == 0 && i_shift > 0));
         }
-        while ((dst - ret) & 3)
+        while ((dst - out) & 3)
             *dst++ = '=';
     }
     *dst = '\0';
 
-    return ret;
+    return out;
 }
 
 // #define TEST_BASE64
@@ -131,10 +131,12 @@ int b64test()
     };
     for (t = tests; t->data; t++) {
         char *str;
+        int ret;
 
         av_log(NULL, AV_LOG_ERROR, "Encoding %s...\n", (char *) t->data);
-        str = av_base64_encode(t->data, t->len);
-        if (str) {
+        str = av_malloc(t->len * 4 / 3 + 12);
+        ret = av_base64_encode(str, t->len * 4 / 3 + 12, t->data, t->len);
+        if (ret > 0) {
             av_log(NULL, AV_LOG_ERROR, "Encoded to %s...\n", str);
             if (strcmp(str, t->result) != 0) {
                 av_log(NULL, AV_LOG_ERROR, "failed test %d: %s != %s\n",
@@ -168,9 +170,9 @@ int b64test()
         srand(123141);          // time(NULL));
         for (test_count = 0; test_count < 100; test_count++) {
             int size = rand() % 1024;
-            int ii;
+            int ii, ret;
             uint8_t *data;
-            char *encoded_result;
+            char *encoded_result = av_malloc(size * 4 / 3 + 12);
 
             av_log(NULL, AV_LOG_ERROR, "Test %d: Size %d bytes...",
                    test_count, size);
@@ -179,8 +181,9 @@ int b64test()
                 data[ii] = rand() % 255;
             }
 
-            encoded_result = av_base64_encode(data, size);
-            if (encoded_result) {
+            ret = av_base64_encode(encoded_result, size * 4 / 3 + 12,
+                                   data, size);
+            if (ret > 0) {
                 int decode_buffer_size = size + 10;     // try without 10 as well
                 uint8_t *decode_buffer = av_malloc(decode_buffer_size);
                 if (decode_buffer) {
diff --git a/libavutil/base64.h b/libavutil/base64.h
index 5658ee8..8cabd01 100644
--- a/libavutil/base64.h
+++ b/libavutil/base64.h
@@ -27,7 +27,11 @@ int av_base64_decode(uint8_t * out, const char *in, int out_length);
 
 /**
  * encodes base64
+ * @param out string
+ * @param out_len of the string, must be at least (len * 4 / 3 + 12)
  * @param src data, not a string
+ * @param len data length
+ * @return the zero terminated encoded string or NULL in case of errors
  */
-char *av_base64_encode(uint8_t * src, int len);
+char *av_base64_encode(char *out, int out_len, uint8_t * src, int len);
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list