[FFmpeg-devel] lavc/qtrle: Do not use aligned writes for odd addresses.

Submitted by Carl Eugen Hoyos on March 14, 2019, 11:21 p.m.

Details

Message ID CAB0OVGq=46WuoCteXkcUJdNY26A-0Mwa2_kUp9VuveSmT-=VZQ@mail.gmail.com
State New
Headers show

Commit Message

Carl Eugen Hoyos March 14, 2019, 11:21 p.m.
2019-03-15 0:13 GMT+01:00, Hendrik Leppkes <h.leppkes@gmail.com>:
> On Fri, Mar 15, 2019 at 12:05 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
> wrote:
>>
>> Hi!
>>
>> Attached patch fixes the qtrle crash on sparc for me.
>>
>
> It should be fine in cases where the pointer is being incremented by
> an aligned amount, ie. writing 32 and incrementing by 4, or 64 and 8,
> etc.

Of course, thank you for the review!
New patch attached.

Carl Eugen

Comments

Hendrik Leppkes March 14, 2019, 11:41 p.m.
On Fri, Mar 15, 2019 at 12:26 AM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:
>
> 2019-03-15 0:13 GMT+01:00, Hendrik Leppkes <h.leppkes@gmail.com>:
> > On Fri, Mar 15, 2019 at 12:05 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
> > wrote:
> >>
> >> Hi!
> >>
> >> Attached patch fixes the qtrle crash on sparc for me.
> >>
> >
> > It should be fine in cases where the pointer is being incremented by
> > an aligned amount, ie. writing 32 and incrementing by 4, or 64 and 8,
> > etc.
>
> Of course, thank you for the review!
> New patch attached.
>

LGTM if tested.

- Hendrik

Patch hide | download patch | download mbox

From a94d32d63cff248d2eb633b162e9e4d4f7234ee5 Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
Date: Fri, 15 Mar 2019 00:02:48 +0100
Subject: [PATCH] lavc/qtrle: Do not used aligned writes for odd addresses.

pixel_ptr can be 3.
Fixes crashes on systems that do not allow unaligned access.
---
 libavcodec/qtrle.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
index a744d7b..1351532 100644
--- a/libavcodec/qtrle.c
+++ b/libavcodec/qtrle.c
@@ -325,7 +325,7 @@  static void qtrle_decode_24bpp(QtrleContext *s, int row_ptr, int lines_to_change
                 CHECK_PIXEL_PTR(rle_code * 3);
 
                 while (rle_code--) {
-                    AV_WN16A(rgb + pixel_ptr, rg);
+                    AV_WN16(rgb + pixel_ptr, rg);
                     rgb[pixel_ptr + 2] = b;
                     pixel_ptr += 3;
                 }
@@ -335,13 +335,13 @@  static void qtrle_decode_24bpp(QtrleContext *s, int row_ptr, int lines_to_change
                 rle_code_half = rle_code / 2;
 
                 while (rle_code_half--) { /* copy 2 raw rgb value at the same time */
-                    AV_WN32A(rgb + pixel_ptr, bytestream2_get_ne32(&s->g)); /* rgbr */
-                    AV_WN16A(rgb + pixel_ptr + 4, bytestream2_get_ne16(&s->g)); /* rgbr */
+                    AV_WN32(rgb + pixel_ptr, bytestream2_get_ne32(&s->g)); /* rgbr */
+                    AV_WN16(rgb + pixel_ptr + 4, bytestream2_get_ne16(&s->g)); /* rgbr */
                     pixel_ptr += 6;
                 }
 
                 if (rle_code % 2 != 0){ /* not even raw value */
-                    AV_WN16A(rgb + pixel_ptr, bytestream2_get_ne16(&s->g));
+                    AV_WN16(rgb + pixel_ptr, bytestream2_get_ne16(&s->g));
                     rgb[pixel_ptr + 2] = bytestream2_get_byte(&s->g);
                     pixel_ptr += 3;
                 }
-- 
1.7.10.4