diff --git a/libavformat/http.c b/libavformat/http.c index 9e8fce59ab..e057d6efe9 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -210,13 +210,14 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, int post, err, ch; char line[1024], *q; char *auth_b64; + int auth_b64_len = strlen(auth)* 4 / 3 + 12; offset_t off = s->off; /* send http header */ post = h->flags & URL_WRONLY; - - auth_b64 = av_base64_encode((uint8_t *)auth, strlen(auth)); + auth_b64 = av_malloc(auth_b64_len); + av_base64_encode(auth_b64, auth_b64_len, (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/libavutil/Makefile b/libavutil/Makefile index 1203281993..a760401ab7 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 mem.h + random.h mem.h base64.h NAME=avutil LIBVERSION=$(LAVUVERSION) diff --git a/libavutil/avutil.h b/libavutil/avutil.h index d85755cd8b..32bc40bfbf 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 6279244d3b..bee800c824 100644 --- a/libavutil/base64.c +++ b/libavutil/base64.c @@ -70,7 +70,7 @@ 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 * buf, int buf_len, uint8_t * src, int len) { static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -79,11 +79,10 @@ char *av_base64_encode(uint8_t * src, int len) int i_shift = 0; int bytes_remaining = len; - if (len < UINT_MAX / 4) { - ret = dst = av_malloc(len * 4 / 3 + 12); - } else + if (len >= UINT_MAX / 4 || + buf_len < len * 4 / 3 + 12) return NULL; - + ret = dst = buf; if (len) { // special edge case, what should we really do here? while (bytes_remaining) { i_bits = (i_bits << 8) + *src++; diff --git a/libavutil/base64.h b/libavutil/base64.h index 5658ee837a..3d905313cf 100644 --- a/libavutil/base64.h +++ b/libavutil/base64.h @@ -28,6 +28,7 @@ int av_base64_decode(uint8_t * out, const char *in, int out_length); /** * encodes base64 * @param src data, not a string + * @param buf output string */ -char *av_base64_encode(uint8_t * src, int len); +char *av_base64_encode(char * buf, int buf_len, uint8_t * src, int len);