Browse code

ffserver: fix prepare_sdp_description() to dynamically allocate streams

Originally committed as revision 25494 to svn://svn.ffmpeg.org/ffmpeg/trunk

Aurelien Jacobs authored on 2010/10/16 04:09:05
Showing 1 changed files
... ...
@@ -2930,7 +2930,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
2930 2930
                                    struct in_addr my_ip)
2931 2931
 {
2932 2932
     AVFormatContext *avc;
2933
-    AVStream avs[MAX_STREAMS];
2933
+    AVStream *avs = NULL;
2934 2934
     int i;
2935 2935
 
2936 2936
     avc =  avformat_alloc_context();
... ...
@@ -2948,14 +2948,29 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
2948 2948
         snprintf(avc->filename, 1024, "rtp://0.0.0.0");
2949 2949
     }
2950 2950
 
2951
+#if !FF_API_MAX_STREAMS
2952
+    if (avc->nb_streams >= INT_MAX/sizeof(*avc->streams) ||
2953
+        !(avc->streams = av_malloc(avc->nb_streams * sizeof(*avc->streams))))
2954
+        goto sdp_done;
2955
+#endif
2956
+    if (avc->nb_streams >= INT_MAX/sizeof(*avs) ||
2957
+        !(avs = av_malloc(avc->nb_streams * sizeof(*avs))))
2958
+        goto sdp_done;
2959
+
2951 2960
     for(i = 0; i < stream->nb_streams; i++) {
2952 2961
         avc->streams[i] = &avs[i];
2953 2962
         avc->streams[i]->codec = stream->streams[i]->codec;
2954 2963
     }
2955 2964
     *pbuffer = av_mallocz(2048);
2956 2965
     avf_sdp_create(&avc, 1, *pbuffer, 2048);
2966
+
2967
+ sdp_done:
2968
+#if !FF_API_MAX_STREAMS
2969
+    av_free(avc->streams);
2970
+#endif
2957 2971
     av_metadata_free(&avc->metadata);
2958 2972
     av_free(avc);
2973
+    av_free(avs);
2959 2974
 
2960 2975
     return strlen(*pbuffer);
2961 2976
 }