Re: [PATCH] ALSA: compress: avoid integer overflow for long duration offload playback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 6/18/19 9:44 AM, bgoswami@xxxxxxxxxxxxxx wrote:
From: Banajit Goswami <bgoswami@xxxxxxxxxxxxxx>

Currently a 32 bit variable is used for storing number of bytes
copied to DSP, which can overflow when playback continues for a long
duration.
Change data type for this variable to __u64 to prevent overflow.

This clearly looks like a bug, the number of bytes transferred is stored as u64 in the runtime. I have no memories of this being intentional.

That said, it seems odd to me that you have an overflow on the number of bytes but not on the number of PCM frames. Shouldn't both the pcm_frames and pcm_io_frames fields also be changed to u64 while we are at it?

And the second issue is that this may impact apps. This is a ABI change, isn't it?


Signed-off-by: Dhananjay Kumar <dhakumar@xxxxxxxxxxxxxx>
Signed-off-by: Banajit Goswami <bgoswami@xxxxxxxxxxxxxx>
---
  include/uapi/sound/compress_offload.h | 2 +-
  sound/core/compress_offload.c         | 2 +-
  2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h
index 56d9567..db5edf3 100644
--- a/include/uapi/sound/compress_offload.h
+++ b/include/uapi/sound/compress_offload.h
@@ -67,7 +67,7 @@ struct snd_compr_params {
   */
  struct snd_compr_tstamp {
  	__u32 byte_offset;
-	__u32 copied_total;
+	__u64 copied_total;
  	__u32 pcm_frames;
  	__u32 pcm_io_frames;
  	__u32 sampling_rate;
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
index a1a6fd7..2d0a709 100644
--- a/sound/core/compress_offload.c
+++ b/sound/core/compress_offload.c
@@ -184,7 +184,7 @@ static int snd_compr_update_tstamp(struct snd_compr_stream *stream,
  	if (!stream->ops->pointer)
  		return -ENOTSUPP;
  	stream->ops->pointer(stream, tstamp);
-	pr_debug("dsp consumed till %d total %d bytes\n",
+	pr_debug("dsp consumed till %d total %llu bytes\n",
  		tstamp->byte_offset, tstamp->copied_total);
  	if (stream->direction == SND_COMPRESS_PLAYBACK)
  		stream->runtime->total_bytes_transferred = tstamp->copied_total;


_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux