Visitar URL original
Limit radius of -a alphascale to 64 in validate_config (#679) · ARM-software/astc-encoder@1b181e7 · GitHub
Skip to content

Commit 1b181e7

Browse files
authored
Limit radius of -a alphascale to 64 in validate_config (#679)
Clamp out-of-range alpha-scale radius in validate_config to avoid kernel requiring huge amounts of memory that can cause a bad_alloc or ASAN tooling OOM.
1 parent 72fee71 commit 1b181e7

3 files changed

Lines changed: 41 additions & 0 deletions

File tree

‎Source/UnitTest/test_encode.cpp‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,41 @@ TEST(compress, overflow_in_16)
130130
astcenc_context_free(context);
131131
}
132132

133+
/** @brief Input test for an out-of-range alpha-scale radius. */
134+
TEST(compress, ascale_radius_clamped)
135+
{
136+
astcenc_error status;
137+
astcenc_config config;
138+
astcenc_context* context;
139+
140+
static const astcenc_swizzle swizzle {
141+
ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A
142+
};
143+
144+
astcenc_config_init(ASTCENC_PRF_LDR, 4, 4, 1, ASTCENC_PRE_MEDIUM, 0, &config);
145+
146+
// Set to largest possible value to check input validation
147+
config.a_scale_radius = 0xFFFFFFFFu;
148+
status = astcenc_context_alloc(&config, 1, &context, nullptr);
149+
EXPECT_EQ(status, ASTCENC_SUCCESS);
150+
151+
uint8_t data[16];
152+
uint8_t input[4 * 4 * 4];
153+
154+
astcenc_image image;
155+
image.dim_x = 4;
156+
image.dim_y = 4;
157+
image.dim_z = 1;
158+
image.data_type = ASTCENC_TYPE_U8;
159+
uint8_t* slices = input;
160+
image.data = reinterpret_cast<void**>(&slices);
161+
162+
// Compression should succeed without bad_alloc or ASAN failure
163+
status = astcenc_compress_image(context, &image, &swizzle, data, sizeof(data), 0);
164+
EXPECT_EQ(status, ASTCENC_SUCCESS);
165+
166+
astcenc_context_free(context);
167+
}
133168

134169
/** @brief Input data buffer overrun tests. */
135170
TEST(compress, data_buffer_exceeded)

‎Source/astcenc_entry.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,9 @@ static astcenc_error validate_config(
468468

469469
config.rgbm_m_scale = astc::max(config.rgbm_m_scale, 1.0f);
470470

471+
// Clamp alpha-scale kernel radius to put an upper bound on memory use
472+
config.a_scale_radius = astc::min(config.a_scale_radius, ALPHASCALE_MAX_RADIUS);
473+
471474
config.tune_partition_count_limit = astc::clamp(config.tune_partition_count_limit, 1u, 4u);
472475
config.tune_2partition_index_limit = astc::clamp(config.tune_2partition_index_limit, 1u, BLOCK_MAX_PARTITIONINGS);
473476
config.tune_3partition_index_limit = astc::clamp(config.tune_3partition_index_limit, 1u, BLOCK_MAX_PARTITIONINGS);

‎Source/astcenc_internal.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ static constexpr unsigned int WEIGHTS_MAX_DECIMATION_MODES { 87 };
120120
/** @brief The high default error used to initialize error trackers. */
121121
static constexpr float ERROR_CALC_DEFAULT { 1e30f };
122122

123+
/** @brief The maximum alpha-scale kernel radius. */
124+
static constexpr unsigned int ALPHASCALE_MAX_RADIUS { 64 };
125+
123126
/**
124127
* @brief The minimum tuning setting threshold for the one partition fast path.
125128
*/

0 commit comments

Comments
 (0)