Merge commit '60392480181f24ebf3ab48d8ac3614705de90152'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 1 Feb 2015 12:52:22 +0000 (13:52 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 1 Feb 2015 12:52:22 +0000 (13:52 +0100)
* commit '60392480181f24ebf3ab48d8ac3614705de90152':
  mem: fix pointer pointer aliasing violations

Conflicts:
libavutil/mem.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavutil/mem.c

diff --cc libavutil/mem.c
@@@ -167,25 -137,9 +167,24 @@@ void *av_realloc(void *ptr, size_t size
  #endif
  }
  
 +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize)
 +{
 +    size_t size;
 +    void *r;
 +
 +    if (av_size_mult(elsize, nelem, &size)) {
 +        av_free(ptr);
 +        return NULL;
 +    }
 +    r = av_realloc(ptr, size);
 +    if (!r && size)
 +        av_free(ptr);
 +    return r;
 +}
 +
  int av_reallocp(void *ptr, size_t size)
  {
-     void **ptrptr = ptr;
-     void *ret;
+     void *val;
  
      if (!size) {
          av_freep(ptr);
@@@ -211,10 -167,23 +212,14 @@@ void *av_realloc_array(void *ptr, size_
  
  int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
  {
-     void **ptrptr = ptr;
-     *ptrptr = av_realloc_f(*ptrptr, nmemb, size);
-     if (!*ptrptr && nmemb && size)
+     void *val;
 -    if (!size || nmemb >= INT_MAX / size)
 -        return AVERROR(ENOMEM);
 -    if (!nmemb) {
 -        av_freep(ptr);
 -        return 0;
 -    }
 -
+     memcpy(&val, ptr, sizeof(val));
 -    val = av_realloc(val, nmemb * size);
 -    if (!val) {
 -        av_freep(ptr);
++    val = av_realloc_f(val, nmemb, size);
++    memcpy(ptr, &val, sizeof(val));
++    if (!val && nmemb && size)
          return AVERROR(ENOMEM);
 -    }
 -    memcpy(ptr, &val, sizeof(val));
      return 0;
  }