also make functions use ff_dynarray directly instead of dynarray_add
macro, macro is removed
---
 libavformat/cutils.c      |   15 +++++++--
 libavformat/hls.c         |    7 ++--
 libavformat/hlsproto.c    |    9 +++--
 libavformat/internal.h    |   17 +---------
 libavformat/matroskadec.c |    8 +++--
 libavformat/mpegtsenc.c   |    3 +-
 libavformat/rtpproto.c    |   17 +++++++---
 libavformat/rtsp.c        |   82 +++++++++++++++++++++++++++++----------------
 libavformat/rtspenc.c     |    5 ++-
 libavformat/utils.c       |    6 ++--
 10 files changed, 107 insertions(+), 62 deletions(-)

diff --git a/libavformat/cutils.c b/libavformat/cutils.c
index f58e152..5cf85b5 100644
--- a/libavformat/cutils.c
+++ b/libavformat/cutils.c
@@ -22,10 +22,10 @@
 #include "internal.h"
 
 /* add one element to a dynamic array */
-void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem)
+int ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem)
 {
     /* see similar avconv.c:grow_array() */
-    int nb, nb_alloc;
+    int nb, nb_alloc, i;
     intptr_t *tab;
 
     nb = *nb_ptr;
@@ -35,11 +35,20 @@ void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, 
intptr_t elem)
             nb_alloc = 1;
         else
             nb_alloc = nb * 2;
-        tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
+        tab = av_realloc(tab, nb_alloc * sizeof(*tab));
+        if (!tab) {
+            for (i = 0; i < nb; i++)
+                av_freep(tab[i]);
+            av_freep(tab);
+            *nb_ptr = 0;
+            return AVERROR(ENOMEM);
+        }
         *tab_ptr = tab;
     }
     tab[nb++] = elem;
     *nb_ptr = nb;
+
+    return 0;
 }
 
 #define ISLEAP(y) (((y) % 4 == 0) && (((y) % 100) != 0 || ((y) % 400) == 0))
diff --git a/libavformat/hls.c b/libavformat/hls.c
index ea16f8a..2d56d80 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -161,7 +161,8 @@ static struct variant *new_variant(HLSContext *c, int 
bandwidth,
     reset_packet(&var->pkt);
     var->bandwidth = bandwidth;
     ff_make_absolute_url(var->url, sizeof(var->url), base, url);
-    dynarray_add(&c->variants, &c->n_variants, var);
+    if (ff_dynarray_add(&c->variants, &c->n_variants, var) < 0)
+        return NULL;
     return var;
 }
 
@@ -287,6 +288,7 @@ static int parse_playlist(HLSContext *c, const char *url,
             }
             if (is_segment) {
                 struct segment *seg;
+                int err;
                 if (!var) {
                     var = new_variant(c, 0, url, NULL);
                     if (!var) {
@@ -310,7 +312,8 @@ static int parse_playlist(HLSContext *c, const char *url,
                 }
                 ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
                 ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
-                dynarray_add(&var->segments, &var->n_segments, seg);
+                if ((err = ff_dynarray_add(&var->segments, &var->n_segments, 
seg)) < 0)
+                    return err;
                 is_segment = 0;
             }
         }
diff --git a/libavformat/hlsproto.c b/libavformat/hlsproto.c
index ec357de..7bb6ca0 100644
--- a/libavformat/hlsproto.c
+++ b/libavformat/hlsproto.c
@@ -146,6 +146,7 @@ static int parse_playlist(URLContext *h, const char *url)
         } else if (av_strstart(line, "#", NULL)) {
             continue;
         } else if (line[0]) {
+            int err;
             if (is_segment) {
                 struct segment *seg = av_malloc(sizeof(struct segment));
                 if (!seg) {
@@ -154,7 +155,10 @@ static int parse_playlist(URLContext *h, const char *url)
                 }
                 seg->duration = duration;
                 ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
-                dynarray_add(&s->segments, &s->n_segments, seg);
+                if ((s->segments = av_realloc_array(s->segments, s->n_segments,
+                                                    sizeof(*s->segments))) < 0)
+
+                    return AVERROR(ENOMEM);
                 is_segment = 0;
             } else if (is_variant) {
                 struct variant *var = av_malloc(sizeof(struct variant));
@@ -164,7 +168,8 @@ static int parse_playlist(URLContext *h, const char *url)
                 }
                 var->bandwidth = bandwidth;
                 ff_make_absolute_url(var->url, sizeof(var->url), url, line);
-                dynarray_add(&s->variants, &s->n_variants, var);
+                if ((err = ff_dynarray_add(&s->variants, &s->n_variants, var)) 
< 0)
+                    return err;
                 is_variant = 0;
             }
         }
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 1bc3e51..2ce9374 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -42,22 +42,7 @@ typedef struct CodecMime{
     enum AVCodecID id;
 } CodecMime;
 
-void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem);
-
-#ifdef __GNUC__
-#define dynarray_add(tab, nb_ptr, elem)\
-do {\
-    __typeof__(tab) _tab = (tab);\
-    __typeof__(elem) _elem = (elem);\
-    (void)sizeof(**_tab == _elem); /* check that types are compatible */\
-    ff_dynarray_add((intptr_t **)_tab, nb_ptr, (intptr_t)_elem);\
-} while(0)
-#else
-#define dynarray_add(tab, nb_ptr, elem)\
-do {\
-    ff_dynarray_add((intptr_t **)(tab), nb_ptr, (intptr_t)(elem));\
-} while(0)
-#endif
+int ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem);
 
 struct tm *ff_brktimegm(time_t secs, struct tm *tm);
 
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e6c9adf..85efc8e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1966,6 +1966,7 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext 
*matroska,
     }
 
     while (track->audio.pkt_cnt) {
+        int err;
         AVPacket *pkt = av_mallocz(sizeof(AVPacket));
         av_new_packet(pkt, a);
         memcpy(pkt->data, track->audio.buf
@@ -1974,7 +1975,8 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext 
*matroska,
         track->audio.buf_timecode = AV_NOPTS_VALUE;
         pkt->pos = pos;
         pkt->stream_index = st->index;
-        dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
+        if ((err = ff_dynarray_add(&matroska->packets, &matroska->num_packets, 
pkt)) < 0)
+            return err;
     }
 
     return 0;
@@ -2135,7 +2137,9 @@ static int matroska_parse_frame(MatroskaDemuxContext 
*matroska,
         st->codec->codec_id == AV_CODEC_ID_SSA)
         matroska_merge_packets(matroska->prev_pkt, pkt);
     else {
-        dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
+        int err;
+        if ((err = ff_dynarray_add(&matroska->packets, &matroska->num_packets, 
pkt)) < 0)
+            return err;
         matroska->prev_pkt = pkt;
     }
 
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 8efd93e..2e02136 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -454,7 +454,8 @@ static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
     service->provider_name = av_strdup(provider_name);
     service->name = av_strdup(name);
     service->pcr_pid = 0x1fff;
-    dynarray_add(&ts->services, &ts->nb_services, service);
+    if (ff_dynarray_add(&ts->services, &ts->nb_services, service) < 0)
+        return NULL;
     return service;
 }
 
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 0f31539..4ddf0fa 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -210,13 +210,14 @@ static void build_udp_url(char *buf, int buf_size,
         url_add_option(buf, buf_size, "block=%s", exclude_sources);
 }
 
-static void rtp_parse_addr_list(URLContext *h, char *buf,
+static int rtp_parse_addr_list(URLContext *h, char *buf,
                                 struct sockaddr_storage ***address_list_ptr,
                                 int *address_list_size_ptr)
 {
     struct addrinfo *ai = NULL;
     struct sockaddr_storage *source_addr;
     char tmp = '\0', *p = buf, *next;
+    int err;
 
     /* Resolve all of the IPs */
 
@@ -236,7 +237,9 @@ static void rtp_parse_addr_list(URLContext *h, char *buf,
 
             memcpy(source_addr, ai->ai_addr, ai->ai_addrlen);
             freeaddrinfo(ai);
-            dynarray_add(address_list_ptr, address_list_size_ptr, source_addr);
+            if ((err = ff_dynarray_add(address_list_ptr, address_list_size_ptr,
+                                       source_addr)) < 0)
+                return err;
         } else {
             av_log(h, AV_LOG_WARNING, "Unable to resolve %s\n", p);
         }
@@ -248,6 +251,7 @@ static void rtp_parse_addr_list(URLContext *h, char *buf,
             p = NULL;
         }
     }
+    return 0;
 }
 
 /**
@@ -293,6 +297,7 @@ static int rtp_open(URLContext *h, const char *uri, int 
flags)
 
     p = strchr(uri, '?');
     if (p) {
+        int err;
         if (av_find_info_tag(buf, sizeof(buf), "ttl", p)) {
             ttl = strtol(buf, NULL, 10);
         }
@@ -319,11 +324,15 @@ static int rtp_open(URLContext *h, const char *uri, int 
flags)
         }
         if (av_find_info_tag(buf, sizeof(buf), "sources", p)) {
             av_strlcpy(include_sources, buf, sizeof(include_sources));
-            rtp_parse_addr_list(h, buf, &s->ssm_include_addrs, 
&s->nb_ssm_include_addrs);
+            if ((err = rtp_parse_addr_list(h, buf, &s->ssm_include_addrs,
+                                           &s->nb_ssm_include_addrs)) < 0)
+                return err;
         }
         if (av_find_info_tag(buf, sizeof(buf), "block", p)) {
             av_strlcpy(exclude_sources, buf, sizeof(exclude_sources));
-            rtp_parse_addr_list(h, buf, &s->ssm_exclude_addrs, 
&s->nb_ssm_exclude_addrs);
+            if ((err = rtp_parse_addr_list(h, buf, &s->ssm_exclude_addrs,
+                                           &s->nb_ssm_exclude_addrs)) < 0)
+                return err;
         }
     }
 
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 16b5d41..ff5b3bb 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -294,22 +294,25 @@ typedef struct SDPParseState {
     struct RTSPSource **default_exclude_source_addrs; /**< Source-specific 
multicast exclude source IP address (from SDP content) */
 } SDPParseState;
 
-static void copy_default_source_addrs(struct RTSPSource **addrs, int count,
+static int copy_default_source_addrs(struct RTSPSource **addrs, int count,
                                       struct RTSPSource ***dest, int 
*dest_count)
 {
     RTSPSource *rtsp_src, *rtsp_src2;
     int i;
     for (i = 0; i < count; i++) {
+        int err;
         rtsp_src = addrs[i];
         rtsp_src2 = av_malloc(sizeof(*rtsp_src2));
         if (!rtsp_src2)
             continue;
         memcpy(rtsp_src2, rtsp_src, sizeof(*rtsp_src));
-        dynarray_add(dest, dest_count, rtsp_src2);
+        if ((err = ff_dynarray_add(dest, dest_count, rtsp_src2)) < 0)
+            return err;
     }
+    return 0;
 }
 
-static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
+static int sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
                            int letter, const char *buf)
 {
     RTSPState *rt = s->priv_data;
@@ -321,24 +324,24 @@ static void sdp_parse_line(AVFormatContext *s, 
SDPParseState *s1,
     RTSPStream *rtsp_st;
     RTSPSource *rtsp_src;
     struct sockaddr_storage sdp_ip;
-    int ttl;
+    int ttl, err;
 
     av_dlog(s, "sdp: %c='%s'\n", letter, buf);
 
     p = buf;
     if (s1->skip_media && letter != 'm')
-        return;
+        return AVERROR_INVALIDDATA;
     switch (letter) {
     case 'c':
         get_word(buf1, sizeof(buf1), &p);
         if (strcmp(buf1, "IN") != 0)
-            return;
+            return AVERROR_INVALIDDATA;
         get_word(buf1, sizeof(buf1), &p);
         if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6"))
-            return;
+            return AVERROR_INVALIDDATA;
         get_word_sep(buf1, sizeof(buf1), "/", &p);
         if (get_sockaddr(buf1, &sdp_ip))
-            return;
+            return AVERROR_INVALIDDATA;
         ttl = 16;
         if (*p == '/') {
             p++;
@@ -377,25 +380,31 @@ static void sdp_parse_line(AVFormatContext *s, 
SDPParseState *s1,
         }
         if (codec_type == AVMEDIA_TYPE_UNKNOWN || !(rt->media_type_mask & (1 
<< codec_type))) {
             s1->skip_media = 1;
-            return;
+            return AVERROR_INVALIDDATA;
         }
         rtsp_st = av_mallocz(sizeof(RTSPStream));
         if (!rtsp_st)
-            return;
+            return AVERROR(ENOMEM);
         rtsp_st->stream_index = -1;
-        dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
+        if ((err = ff_dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams,
+                                   rtsp_st)) < 0)
+            return err;
 
         rtsp_st->sdp_ip = s1->default_ip;
         rtsp_st->sdp_ttl = s1->default_ttl;
 
-        copy_default_source_addrs(s1->default_include_source_addrs,
-                                  s1->nb_default_include_source_addrs,
-                                  &rtsp_st->include_source_addrs,
-                                  &rtsp_st->nb_include_source_addrs);
-        copy_default_source_addrs(s1->default_exclude_source_addrs,
-                                  s1->nb_default_exclude_source_addrs,
-                                  &rtsp_st->exclude_source_addrs,
-                                  &rtsp_st->nb_exclude_source_addrs);
+        if ((err = copy_default_source_addrs(s1->default_include_source_addrs,
+                                             
s1->nb_default_include_source_addrs,
+                                             &rtsp_st->include_source_addrs,
+                                             
&rtsp_st->nb_include_source_addrs)) < 0) {
+            s1->nb_default_include_source_addrs = 0;
+            return err;
+        }
+        if ((err = copy_default_source_addrs(s1->default_exclude_source_addrs,
+                                             
s1->nb_default_exclude_source_addrs,
+                                             &rtsp_st->exclude_source_addrs,
+                                             
&rtsp_st->nb_exclude_source_addrs)) < 0)
+            return err;
 
         get_word(buf1, sizeof(buf1), &p); /* port */
         rtsp_st->sdp_port = atoi(buf1);
@@ -430,7 +439,7 @@ static void sdp_parse_line(AVFormatContext *s, 
SDPParseState *s1,
         } else {
             st = avformat_new_stream(s, NULL);
             if (!st)
-                return;
+                return AVERROR(ENOMEM);
             st->id = rt->nb_rtsp_streams - 1;
             rtsp_st->stream_index = st->index;
             st->codec->codec_type = codec_type;
@@ -530,36 +539,48 @@ static void sdp_parse_line(AVFormatContext *s, 
SDPParseState *s1,
             int exclude = 0;
             get_word(buf1, sizeof(buf1), &p);
             if (strcmp(buf1, "incl") && strcmp(buf1, "excl"))
-                return;
+                return AVERROR_INVALIDDATA;
             exclude = !strcmp(buf1, "excl");
 
             get_word(buf1, sizeof(buf1), &p);
             if (strcmp(buf1, "IN") != 0)
-                return;
+                return AVERROR_INVALIDDATA;
             get_word(buf1, sizeof(buf1), &p);
             if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6") && strcmp(buf1, 
"*"))
-                return;
+                return AVERROR_INVALIDDATA;
             // not checking that the destination address actually matches or 
is wildcard
             get_word(buf1, sizeof(buf1), &p);
 
             while (*p != '\0') {
                 rtsp_src = av_mallocz(sizeof(*rtsp_src));
                 if (!rtsp_src)
-                    return;
+                    return AVERROR(ENOMEM);
                 get_word(rtsp_src->addr, sizeof(rtsp_src->addr), &p);
                 if (exclude) {
                     if (s->nb_streams == 0) {
-                        dynarray_add(&s1->default_exclude_source_addrs, 
&s1->nb_default_exclude_source_addrs, rtsp_src);
+                        if ((err = 
ff_dynarray_add(&s1->default_exclude_source_addrs,
+                                                   
&s1->nb_default_exclude_source_addrs,
+                                                   rtsp_src)) < 0)
+                            return err;
                     } else {
                         rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
-                        dynarray_add(&rtsp_st->exclude_source_addrs, 
&rtsp_st->nb_exclude_source_addrs, rtsp_src);
+                        if ((err = 
ff_dynarray_add(&rtsp_st->exclude_source_addrs,
+                                                   
&rtsp_st->nb_exclude_source_addrs,
+                                                   rtsp_src)) < 0)
+                            return err;
                     }
                 } else {
                     if (s->nb_streams == 0) {
-                        dynarray_add(&s1->default_include_source_addrs, 
&s1->nb_default_include_source_addrs, rtsp_src);
+                        if ((err = 
ff_dynarray_add(&s1->default_include_source_addrs,
+                                                   
&s1->nb_default_include_source_addrs,
+                                                   rtsp_src)) < 0)
+                            return err;
                     } else {
                         rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
-                        dynarray_add(&rtsp_st->include_source_addrs, 
&rtsp_st->nb_include_source_addrs, rtsp_src);
+                        if ((err = 
ff_dynarray_add(&rtsp_st->include_source_addrs,
+                                                   
&rtsp_st->nb_include_source_addrs,
+                                                   rtsp_src)) < 0)
+                            return err;
                     }
                 }
             }
@@ -581,6 +602,7 @@ static void sdp_parse_line(AVFormatContext *s, 
SDPParseState *s1,
         }
         break;
     }
+    return 0;
 }
 
 int ff_sdp_parse(AVFormatContext *s, const char *content)
@@ -601,6 +623,7 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
 
     p = content;
     for (;;) {
+        int err;
         p += strspn(p, SPACE_CHARS);
         letter = *p;
         if (letter == '\0')
@@ -617,7 +640,8 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
             p++;
         }
         *q = '\0';
-        sdp_parse_line(s, s1, letter, buf);
+        if ((err = sdp_parse_line(s, s1, letter, buf)) < 0)
+            return err;
     next_line:
         while (*p != '\n' && *p != '\0')
             p++;
diff --git a/libavformat/rtspenc.c b/libavformat/rtspenc.c
index d8e5b0e..7fac256 100644
--- a/libavformat/rtspenc.c
+++ b/libavformat/rtspenc.c
@@ -88,11 +88,14 @@ int ff_rtsp_setup_output_streams(AVFormatContext *s, const 
char *addr)
     /* Set up the RTSPStreams for each AVStream */
     for (i = 0; i < s->nb_streams; i++) {
         RTSPStream *rtsp_st;
+        int err;
 
         rtsp_st = av_mallocz(sizeof(RTSPStream));
         if (!rtsp_st)
             return AVERROR(ENOMEM);
-        dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
+        if ((err = ff_dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams,
+                                   rtsp_st)) < 0)
+            return err;
 
         rtsp_st->stream_index = i;
 
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0700c5d..2e88aea 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2644,7 +2644,8 @@ AVProgram *av_new_program(AVFormatContext *ac, int id)
         program = av_mallocz(sizeof(AVProgram));
         if (!program)
             return NULL;
-        dynarray_add(&ac->programs, &ac->nb_programs, program);
+        if (ff_dynarray_add(&ac->programs, &ac->nb_programs, program) < 0)
+            return NULL;
         program->discard = AVDISCARD_NONE;
     }
     program->id = id;
@@ -2665,7 +2666,8 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, 
AVRational time_base,
         chapter= av_mallocz(sizeof(AVChapter));
         if(!chapter)
             return NULL;
-        dynarray_add(&s->chapters, &s->nb_chapters, chapter);
+        if (ff_dynarray_add(&s->chapters, &s->nb_chapters, chapter) < 0)
+            return NULL;
     }
     av_dict_set(&chapter->metadata, "title", title, 0);
     chapter->id    = id;
-- 
1.7.10.4

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to