rtpbin: Safer ts-offset-smoothing-factor calculation

Protect the ts-offset-smoothing-factor calculation from overflow. Output
warning and fallback to ts-offset if it is detected.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1409>
This commit is contained in:
Robert Rosengren 2022-01-18 17:53:30 +01:00 committed by GStreamer Marge Bot
parent 31dd9226ce
commit 265878c4ba

View file

@ -1354,9 +1354,27 @@ stream_set_ts_offset (GstRtpBin * bin, GstRtpBinStream * stream,
stream->avg_ts_offset = ts_offset; stream->avg_ts_offset = ts_offset;
stream->is_initialized = TRUE; stream->is_initialized = TRUE;
} else { } else {
stream->avg_ts_offset = /* RMA algorithm using smoothing factor is following, but split into
((bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset + * parts to check for overflows:
ts_offset) / bin->ts_offset_smoothing_factor; * stream->avg_ts_offset =
* ((bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset
* + ts_offset) / bin->ts_offset_smoothing_factor
*/
guint64 max_possible_smoothing_factor =
G_MAXINT64 / ABS (stream->avg_ts_offset);
gint64 cur_avg_product =
(bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset;
if ((max_possible_smoothing_factor < bin->ts_offset_smoothing_factor) ||
(cur_avg_product > 0 && G_MAXINT64 - cur_avg_product < ts_offset) ||
(cur_avg_product < 0 && G_MININT64 - cur_avg_product > ts_offset)) {
GST_WARNING_OBJECT (bin,
"ts-offset-smoothing-factor calculation overflow, fallback to using ts-offset directly");
stream->avg_ts_offset = ts_offset;
} else {
stream->avg_ts_offset =
(cur_avg_product + ts_offset) / bin->ts_offset_smoothing_factor;
}
} }
} else { } else {
stream->avg_ts_offset = ts_offset; stream->avg_ts_offset = ts_offset;