[FFmpeg-devel] [PATCH] aes: fix array index out of bounds warnings

Måns Rullgård mans
Sat Jun 26 18:39:37 CEST 2010


Reimar D?ffinger <Reimar.Doeffinger at gmx.de> writes:

> On Sat, Jun 26, 2010 at 09:12:52AM +0100, M?ns Rullg?rd wrote:
>> Reimar D?ffinger <Reimar.Doeffinger at gmx.de> writes:
>> 
>> > On Sat, Jun 26, 2010 at 12:54:21AM +0100, Mans Rullgard wrote:
>> >> ---
>> >>  libavutil/aes.c |    4 ++--
>> >>  1 files changed, 2 insertions(+), 2 deletions(-)
>> >> 
>> >> diff --git a/libavutil/aes.c b/libavutil/aes.c
>> >> index d3a271c..763f856 100644
>> >> --- a/libavutil/aes.c
>> >> +++ b/libavutil/aes.c
>> >> @@ -130,7 +130,7 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt) {
>> >>      uint8_t  log8[256];
>> >>      uint8_t alog8[512];
>> >>  
>> >> -    if(!enc_multbl[0][sizeof(enc_multbl)/sizeof(enc_multbl[0][0])-1]){
>> >> +    if(!enc_multbl[FF_ARRAY_ELEMS(enc_multbl)-1][FF_ARRAY_ELEMS(enc_multbl[0])-1]){
>> >>          j=1;
>> >>          for(i=0; i<255; i++){
>> >>              alog8[i]=
>> >> @@ -184,7 +184,7 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt) {
>> >>      }else{
>> >>          for(i=0; i<(rounds+1)>>1; i++){
>> >>              for(j=0; j<16; j++)
>> >> -                FFSWAP(int, a->round_key[i][0][j], a->round_key[rounds-i][0][j]);
>> >> +                FFSWAP(int, a->round_key[i][j>>2][j&3], a->round_key[rounds-i][j>>2][j&3]);
>> >
>> > If the compilers were any good this would be the same,
>> 
>> The existing code has UNDEFINED BEHAVIOUR from indexing outside an
>> array.  Talk about same has no meaning.
>
> I admit I didn't check the standard about that special case but I
> think the conclusion was that given the other constraints for a
> two-dimensional array there isn't a good reason for it not to
> work in any implementation.

The memory is as far as I can tell guaranteed to be laid out like
that, yes.  However, the standard is quite clear about out-of-array
accesses being undefined, which means the compiler might do just about
anything.  Compare to the cases where gcc determines a signed overflow
will occur and removes and entire branch of code, even though the
intuitive behaviour is obvious.

>> > but last time this was checked IIRC produced quite a lot slower
>> > code.
>> 
>> And that matters in an init function?  I also can't find anyone ever
>> claiming to have actually checked it.  All I do find is Michael
>> vehemently rejecting the notion of the out-of-array indexing being a
>> bug.
>
> Sorry, I didn't realize that. For AES the speed of the init function
> might be someonewhat relevant (I think it would matter the way it is misused
> as has etc. for BluRay), however this is even the encode init function.
> I retract my objection.

So can we just fix this bug and slash a page from the warnings in the
process?

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list