mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-26 08:49:02 +00:00
Fix buffer overflow in compiler suite (#740)
* Fix buffer overflow in compiler suite * Use ARRAY_SIZE to determine number of source lines * Add static assertion for number of lines
This commit is contained in:
@@ -26,8 +26,6 @@ const char *sample_kernel_code_single_line[] = {
|
|||||||
"\n"
|
"\n"
|
||||||
"}\n" };
|
"}\n" };
|
||||||
|
|
||||||
size_t sample_single_line_lengths[1];
|
|
||||||
|
|
||||||
const char *sample_kernel_code_multi_line[] = {
|
const char *sample_kernel_code_multi_line[] = {
|
||||||
"__kernel void sample_test(__global float *src, __global int *dst)",
|
"__kernel void sample_test(__global float *src, __global int *dst)",
|
||||||
"{",
|
"{",
|
||||||
@@ -37,8 +35,6 @@ const char *sample_kernel_code_multi_line[] = {
|
|||||||
"",
|
"",
|
||||||
"}" };
|
"}" };
|
||||||
|
|
||||||
size_t sample_multi_line_lengths[ 7 ];
|
|
||||||
|
|
||||||
const char *sample_kernel_code_two_line[] = {
|
const char *sample_kernel_code_two_line[] = {
|
||||||
"__kernel void sample_test(__global float *src, __global int *dst)\n"
|
"__kernel void sample_test(__global float *src, __global int *dst)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
@@ -55,7 +51,6 @@ const char *sample_kernel_code_two_line[] = {
|
|||||||
"\n"
|
"\n"
|
||||||
"}\n" };
|
"}\n" };
|
||||||
|
|
||||||
size_t sample_two_line_lengths[1];
|
|
||||||
|
|
||||||
const char *sample_kernel_code_bad_multi_line[] = {
|
const char *sample_kernel_code_bad_multi_line[] = {
|
||||||
"__kernel void sample_test(__global float *src, __global int *dst)",
|
"__kernel void sample_test(__global float *src, __global int *dst)",
|
||||||
@@ -66,8 +61,6 @@ const char *sample_kernel_code_bad_multi_line[] = {
|
|||||||
"",
|
"",
|
||||||
"}" };
|
"}" };
|
||||||
|
|
||||||
size_t sample_bad_multi_line_lengths[ 7 ];
|
|
||||||
|
|
||||||
|
|
||||||
int test_load_program_source(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
|
int test_load_program_source(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
|
||||||
{
|
{
|
||||||
@@ -76,11 +69,12 @@ int test_load_program_source(cl_device_id deviceID, cl_context context, cl_comma
|
|||||||
size_t length;
|
size_t length;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
|
||||||
/* Preprocess: calc the length of each source file line */
|
/* Preprocess: calc the length of the source file line */
|
||||||
sample_single_line_lengths[ 0 ] = strlen( sample_kernel_code_single_line[ 0 ] );
|
size_t line_length = strlen(sample_kernel_code_single_line[0]);
|
||||||
|
|
||||||
/* New OpenCL API only has one entry point, so go ahead and just try it */
|
/* New OpenCL API only has one entry point, so go ahead and just try it */
|
||||||
program = clCreateProgramWithSource( context, 1, sample_kernel_code_single_line, sample_single_line_lengths, &error);
|
program = clCreateProgramWithSource(
|
||||||
|
context, 1, sample_kernel_code_single_line, &line_length, &error);
|
||||||
test_error( error, "Unable to create reference program" );
|
test_error( error, "Unable to create reference program" );
|
||||||
|
|
||||||
/* Now get the source and compare against our original */
|
/* Now get the source and compare against our original */
|
||||||
@@ -88,9 +82,11 @@ int test_load_program_source(cl_device_id deviceID, cl_context context, cl_comma
|
|||||||
test_error( error, "Unable to get length of first program source" );
|
test_error( error, "Unable to get length of first program source" );
|
||||||
|
|
||||||
// Note: according to spec section 5.4.5, the length returned should include the null terminator
|
// Note: according to spec section 5.4.5, the length returned should include the null terminator
|
||||||
if( length != sample_single_line_lengths[0] + 1 )
|
if (length != line_length + 1)
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Length of program (%ld) does not match reference length (%ld)!\n", length, sample_single_line_lengths[0] + 1 );
|
log_error("ERROR: Length of program (%ld) does not match reference "
|
||||||
|
"length (%ld)!\n",
|
||||||
|
length, line_length + 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,15 +113,19 @@ int test_load_multistring_source(cl_device_id deviceID, cl_context context, cl_c
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
constexpr int num_lines = ARRAY_SIZE(sample_kernel_code_multi_line);
|
||||||
|
|
||||||
/* Preprocess: calc the length of each source file line */
|
/* Preprocess: calc the length of each source file line */
|
||||||
for( i = 0; i < 7; i++ )
|
size_t line_lengths[num_lines];
|
||||||
|
for (i = 0; i < num_lines; i++)
|
||||||
{
|
{
|
||||||
sample_multi_line_lengths[ i ] = strlen( sample_kernel_code_multi_line[ i ] );
|
line_lengths[i] = strlen(sample_kernel_code_multi_line[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create another program using the macro function */
|
/* Create another program using the macro function */
|
||||||
program = clCreateProgramWithSource( context, 7, sample_kernel_code_multi_line, sample_multi_line_lengths, &error );
|
program = clCreateProgramWithSource(context, num_lines,
|
||||||
|
sample_kernel_code_multi_line,
|
||||||
|
line_lengths, &error);
|
||||||
if( program == NULL )
|
if( program == NULL )
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Unable to create reference program!\n" );
|
log_error( "ERROR: Unable to create reference program!\n" );
|
||||||
@@ -150,15 +150,18 @@ int test_load_two_kernel_source(cl_device_id deviceID, cl_context context, cl_co
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
constexpr int num_lines = ARRAY_SIZE(sample_kernel_code_two_line);
|
||||||
|
|
||||||
/* Preprocess: calc the length of each source file line */
|
/* Preprocess: calc the length of each source file line */
|
||||||
for( i = 0; i < 2; i++ )
|
size_t line_lengths[num_lines];
|
||||||
|
for (i = 0; i < num_lines; i++)
|
||||||
{
|
{
|
||||||
sample_two_line_lengths[ i ] = strlen( sample_kernel_code_two_line[ i ] );
|
line_lengths[i] = strlen(sample_kernel_code_two_line[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now create a program using the macro function */
|
/* Now create a program using the macro function */
|
||||||
program = clCreateProgramWithSource( context, 2, sample_kernel_code_two_line, sample_two_line_lengths, &error );
|
program = clCreateProgramWithSource(
|
||||||
|
context, num_lines, sample_kernel_code_two_line, line_lengths, &error);
|
||||||
if( program == NULL )
|
if( program == NULL )
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Unable to create two-kernel program!\n" );
|
log_error( "ERROR: Unable to create two-kernel program!\n" );
|
||||||
@@ -211,8 +214,11 @@ int test_load_null_terminated_multi_line_source(cl_device_id deviceID, cl_contex
|
|||||||
cl_program program;
|
cl_program program;
|
||||||
|
|
||||||
|
|
||||||
|
int num_lines = ARRAY_SIZE(sample_kernel_code_multi_line);
|
||||||
|
|
||||||
/* Now create a program using the macro function */
|
/* Now create a program using the macro function */
|
||||||
program = clCreateProgramWithSource( context, 7, sample_kernel_code_multi_line, NULL, &error );
|
program = clCreateProgramWithSource(
|
||||||
|
context, num_lines, sample_kernel_code_multi_line, NULL, &error);
|
||||||
if( program == NULL )
|
if( program == NULL )
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Unable to create null-terminated program!" );
|
log_error( "ERROR: Unable to create null-terminated program!" );
|
||||||
@@ -240,18 +246,23 @@ int test_load_discreet_length_source(cl_device_id deviceID, cl_context context,
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
constexpr int num_lines = ARRAY_SIZE(sample_kernel_code_bad_multi_line);
|
||||||
|
|
||||||
/* Preprocess: calc the length of each source file line */
|
/* Preprocess: calc the length of each source file line */
|
||||||
for( i = 0; i < 7; i++ )
|
size_t line_lengths[num_lines];
|
||||||
|
for (i = 0; i < num_lines; i++)
|
||||||
{
|
{
|
||||||
sample_bad_multi_line_lengths[ i ] = strlen( sample_kernel_code_bad_multi_line[ i ] );
|
line_lengths[i] = strlen(sample_kernel_code_bad_multi_line[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now force the length of the third line to skip the actual error */
|
/* Now force the length of the third line to skip the actual error */
|
||||||
sample_bad_multi_line_lengths[2] -= strlen("thisisanerror");
|
static_assert(num_lines >= 3, "expected at least 3 lines in source");
|
||||||
|
line_lengths[2] -= strlen("thisisanerror");
|
||||||
|
|
||||||
/* Now create a program using the macro function */
|
/* Now create a program using the macro function */
|
||||||
program = clCreateProgramWithSource( context, 7, sample_kernel_code_bad_multi_line, sample_bad_multi_line_lengths, &error );
|
program = clCreateProgramWithSource(context, num_lines,
|
||||||
|
sample_kernel_code_bad_multi_line,
|
||||||
|
line_lengths, &error);
|
||||||
if( program == NULL )
|
if( program == NULL )
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Unable to create null-terminated program!" );
|
log_error( "ERROR: Unable to create null-terminated program!" );
|
||||||
@@ -277,17 +288,23 @@ int test_load_null_terminated_partial_multi_line_source(cl_device_id deviceID, c
|
|||||||
cl_program program;
|
cl_program program;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
constexpr int num_lines = ARRAY_SIZE(sample_kernel_code_multi_line);
|
||||||
|
|
||||||
/* Preprocess: calc the length of each source file line */
|
/* Preprocess: calc the length of each source file line */
|
||||||
for( i = 0; i < 7; i++ )
|
size_t line_lengths[num_lines];
|
||||||
|
for (i = 0; i < num_lines; i++)
|
||||||
{
|
{
|
||||||
if( i & 0x01 )
|
if( i & 0x01 )
|
||||||
sample_multi_line_lengths[ i ] = 0; /* Should force for null-termination on this line only */
|
line_lengths[i] =
|
||||||
|
0; /* Should force for null-termination on this line only */
|
||||||
else
|
else
|
||||||
sample_multi_line_lengths[ i ] = strlen( sample_kernel_code_multi_line[ i ] );
|
line_lengths[i] = strlen(sample_kernel_code_multi_line[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now create a program using the macro function */
|
/* Now create a program using the macro function */
|
||||||
program = clCreateProgramWithSource( context, 7, sample_kernel_code_multi_line, sample_multi_line_lengths, &error );
|
program = clCreateProgramWithSource(context, num_lines,
|
||||||
|
sample_kernel_code_multi_line,
|
||||||
|
line_lengths, &error);
|
||||||
if( program == NULL )
|
if( program == NULL )
|
||||||
{
|
{
|
||||||
log_error( "ERROR: Unable to create null-terminated program!" );
|
log_error( "ERROR: Unable to create null-terminated program!" );
|
||||||
|
|||||||
Reference in New Issue
Block a user