130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Copyright 2013 Google Inc. All Rights Reserved. 230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka 330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka Licensed under the Apache License, Version 2.0 (the "License"); 430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka you may not use this file except in compliance with the License. 530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka You may obtain a copy of the License at 630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka 730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka http://www.apache.org/licenses/LICENSE-2.0 830625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka 930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka Unless required by applicable law or agreed to in writing, software 1030625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka distributed under the License is distributed on an "AS IS" BASIS, 1130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka See the License for the specific language governing permissions and 1330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka limitations under the License. 1430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka 1530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka Size-checked memory allocation. 1630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka*/ 1704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka 1804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#include <stdlib.h> 1904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#include "./safe_malloc.h" 2004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka 2104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus) 2204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkaextern "C" { 2304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#endif 2404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka 2530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Returns 0 in case of overflow of nmemb * size. */ 2604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic int CheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) { 2704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka const uint64_t total_size = nmemb * size; 2804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka if (nmemb == 0) return 1; 2904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka if ((uint64_t)size > BROTLI_MAX_ALLOCABLE_MEMORY / nmemb) return 0; 3004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka if (total_size != (size_t)total_size) return 0; 3104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka return 1; 3204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka} 3304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka 3404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkavoid* BrotliSafeMalloc(uint64_t nmemb, size_t size) { 3504163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; 3604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka assert(nmemb * size > 0); 3704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka return malloc((size_t)(nmemb * size)); 3804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka} 3904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka 4004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus) 4130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka} /* extern "C" */ 4204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#endif 43