1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2012 Google Inc. All Rights Reserved.
2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
3a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// This code is licensed under the same terms as WebM:
4a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//  Software License Agreement:  http://www.webmproject.org/license/software/
5a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
6a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// -----------------------------------------------------------------------------
7a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Misc. common utility functions
9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Author: Skal (pascal.massimino@gmail.com)
11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
12a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include <stdlib.h>
13a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "./utils.h"
14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern "C" {
17a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
18a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
19a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Checked memory allocation
21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
221e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Returns 0 in case of overflow of nmemb * size.
231e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic int CheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) {
24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  const uint64_t total_size = nmemb * size;
25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  if (nmemb == 0) return 1;
26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  if ((uint64_t)size > WEBP_MAX_ALLOCABLE_MEMORY / nmemb) return 0;
27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  if (total_size != (size_t)total_size) return 0;
28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  return 1;
29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}
30a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
31a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid* WebPSafeMalloc(uint64_t nmemb, size_t size) {
321e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL;
331e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  assert(nmemb * size > 0);
34a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  return malloc((size_t)(nmemb * size));
35a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}
36a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
37a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid* WebPSafeCalloc(uint64_t nmemb, size_t size) {
381e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL;
391e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  assert(nmemb * size > 0);
40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  return calloc((size_t)nmemb, size);
41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}
42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
44a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
45a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
46a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}    // extern "C"
47a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
48