channel.c: Fix segfault with Monitor(wav,file,i)
authorValentin Vidic <vvidic@valentin-vidic.from.hr>
Sun, 20 Jan 2019 18:15:51 +0000 (19:15 +0100)
committerValentin Vidic <vvidic@valentin-vidic.from.hr>
Sun, 20 Jan 2019 18:49:11 +0000 (19:49 +0100)
If the Monitor is started with the i option the read_stream will be
NULL. One code path in channel.c checks if write_stream is set but than
uses read_stream instead causing a segfault.

ASTERISK-28249

Change-Id: I1bae9126537be54895c7fea2d08dd9488d8cc525

main/channel.c

index 4fb226d..bad1480 100644 (file)
@@ -5225,7 +5225,7 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
                                if (jump >= 0) {
                                        jump = calc_monitor_jump((ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)),
                                                                 ast_format_get_sample_rate(f->subclass.format),
-                                                                ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
+                                                                ast_format_get_sample_rate(ast_channel_monitor(chan)->write_stream->fmt->format));
                                        if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump, SEEK_FORCECUR) == -1) {
                                                ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
                                        }
@@ -5236,7 +5236,7 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
 #else
                                int jump = calc_monitor_jump((ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)),
                                                             ast_format_get_sample_rate(f->subclass.format),
-                                                            ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
+                                                            ast_format_get_sample_rate(ast_channel_monitor(chan)->write_stream->fmt->format));
                                if (jump - MONITOR_DELAY >= 0) {
                                        if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump - cur->samples, SEEK_FORCECUR) == -1) {
                                                ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");