// Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #ifndef LIB_JXL_SIZE_CONSTRAINTS_H_ #define LIB_JXL_SIZE_CONSTRAINTS_H_ #include #include #include "lib/jxl/base/status.h" namespace jxl { struct SizeConstraints { // Upper limit on pixel dimensions/area, enforced by VerifyDimensions // (called from decoders). Fuzzers set smaller values to limit memory use. uint32_t dec_max_xsize = 0xFFFFFFFFu; uint32_t dec_max_ysize = 0xFFFFFFFFu; uint64_t dec_max_pixels = 0xFFFFFFFFu; // Might be up to ~0ull }; template ::value>::type> Status VerifyDimensions(const SizeConstraints* constraints, T xs, T ys) { if (!constraints) return true; if (xs == 0 || ys == 0) return JXL_FAILURE("Empty image."); if (xs > constraints->dec_max_xsize) return JXL_FAILURE("Image too wide."); if (ys > constraints->dec_max_ysize) return JXL_FAILURE("Image too tall."); const uint64_t num_pixels = static_cast(xs) * ys; if (num_pixels > constraints->dec_max_pixels) { return JXL_FAILURE("Image too big."); } return true; } } // namespace jxl #endif // LIB_JXL_SIZE_CONSTRAINTS_H_