15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 Google Inc. All Rights Reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Misc. common utility functions
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./utils.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checked memory allocation
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns 0 in case of overflow of nmemb * size.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int CheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint64_t total_size = nmemb * size;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (nmemb == 0) return 1;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((uint64_t)size > WEBP_MAX_ALLOCABLE_MEMORY / nmemb) return 0;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (total_size != (size_t)total_size) return 0;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* WebPSafeMalloc(uint64_t nmemb, size_t size) {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  assert(nmemb * size > 0);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return malloc((size_t)(nmemb * size));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* WebPSafeCalloc(uint64_t nmemb, size_t size) {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  assert(nmemb * size > 0);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return calloc((size_t)nmemb, size);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}    // extern "C"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50