From ad59cf465a413ba4fc56a89806dabf1cc220ac03 Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Sat, 27 Jul 2019 23:49:29 +0200 Subject: [PATCH] kpb: forbid draining requests bigger than history_buffer This patch adds a check if history depth request is bigger than history buffer size. If so refuse to drain. Signed-off-by: Marcin Rajwa --- src/audio/kpb.c | 53 ++----------------------------------------------- 1 file changed, 2 insertions(+), 51 deletions(-) diff --git a/src/audio/kpb.c b/src/audio/kpb.c index 8132f598f..6e74f0ef7 100644 --- a/src/audio/kpb.c +++ b/src/audio/kpb.c @@ -71,8 +71,6 @@ static int kpb_buffer_data(struct comp_dev *dev, struct comp_buffer *source, static size_t kpb_allocate_history_buffer(struct comp_data *kpb); static void kpb_clear_history_buffer(struct hb *buff); static void kpb_free_history_buffer(struct hb *buff); -static bool kpb_has_enough_history_data(struct comp_data *kpb, - struct hb *buff, size_t his_req); static inline bool kpb_is_sample_width_supported(uint32_t sampling_width); static void kpb_copy_samples(struct comp_buffer *sink, struct comp_buffer *source, size_t size, @@ -842,7 +840,8 @@ static void kpb_init_draining(struct comp_dev *dev, struct kpb_client *cli) } else if (!is_sink_ready) { trace_kpb_error("kpb_init_draining() error: " "sink not ready for draining"); - } else if (!kpb_has_enough_history_data(kpb, buff, history_depth)) { + } else if (kpb->buffered_data < history_depth || + kpb->kpb_buffer_size < history_depth) { trace_kpb_error("kpb_init_draining() error: " "not enough data in history buffer"); } else if (!validate_host_params(host_period_size, @@ -1134,54 +1133,6 @@ static void kpb_clear_history_buffer(struct hb *buff) } while (buff != first_buff); } -/** - * \brief Verify if KPB has enough data buffered. - * - * \param[in] kpb - KPB component data pointer. - * \param[in] buff - pointer to current history buffer. - * \param[in] his_req - requested draining size. - * - * \return 1 if there is enough data in history buffer - * and 0 otherwise. - */ -static bool kpb_has_enough_history_data(struct comp_data *kpb, - struct hb *buff, size_t his_req) -{ - size_t buffered_data = 0; - struct hb *first_buff = buff; - - /* Quick check if we've already filled internal buffer */ - if (kpb->is_internal_buffer_full) - return his_req <= kpb->kpb_buffer_size; - - /* Internal buffer isn't full yet. Verify if what already buffered - * is sufficient for draining request. - */ - while (buffered_data < his_req) { - if (buff->state == KPB_BUFFER_FREE) { - if (buff->w_ptr == buff->start_addr && - buff->next->state == KPB_BUFFER_FULL) { - buffered_data += ((uint32_t)buff->end_addr - - (uint32_t)buff->start_addr); - } else { - buffered_data += ((uint32_t)buff->w_ptr - - (uint32_t)buff->start_addr); - } - - } else { - buffered_data += ((uint32_t)buff->end_addr - - (uint32_t)buff->start_addr); - } - - if (buff->next && buff->next != first_buff) - buff = buff->next; - else - break; - } - - return buffered_data >= his_req; -} - static inline bool kpb_is_sample_width_supported(uint32_t sampling_width) { bool ret;