From bd6911172dcf1e32aedb585b9c27a25c3a2b7919 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Wed, 27 May 2026 23:58:31 +0200 Subject: [PATCH] Validate cuOptGetErrorString buffer size --- cpp/src/pdlp/cuopt_c.cpp | 1 + .../c_api_tests/c_api_test.c | 71 +++++++++++++++++++ .../c_api_tests/c_api_tests.cpp | 5 ++ .../c_api_tests/c_api_tests.h | 1 + 4 files changed, 78 insertions(+) diff --git a/cpp/src/pdlp/cuopt_c.cpp b/cpp/src/pdlp/cuopt_c.cpp index 4571b80743..1f74585daf 100644 --- a/cpp/src/pdlp/cuopt_c.cpp +++ b/cpp/src/pdlp/cuopt_c.cpp @@ -1182,6 +1182,7 @@ cuopt_int_t cuOptGetErrorString(cuOptSolution solution, { if (solution == nullptr) { return CUOPT_INVALID_ARGUMENT; } if (error_string_ptr == nullptr) { return CUOPT_INVALID_ARGUMENT; } + if (error_string_size <= 0) { return CUOPT_INVALID_ARGUMENT; } solution_and_stream_view_t* solution_and_stream_view = static_cast(solution); std::string error_string = solution_and_stream_view->get_solution()->get_error_status().what(); diff --git a/cpp/tests/linear_programming/c_api_tests/c_api_test.c b/cpp/tests/linear_programming/c_api_tests/c_api_test.c index 2500e2e9d4..3606125009 100644 --- a/cpp/tests/linear_programming/c_api_tests/c_api_test.c +++ b/cpp/tests/linear_programming/c_api_tests/c_api_test.c @@ -129,6 +129,77 @@ cuopt_int_t test_bad_parameter_name() return status; } +cuopt_int_t test_error_string_invalid_buffer_size() +{ + cuOptOptimizationProblem problem = NULL; + cuOptSolverSettings settings = NULL; + cuOptSolution solution = NULL; + cuopt_int_t status; + + cuopt_float_t objective[] = {1.0}; + cuopt_int_t row_offsets[] = {0, 1}; + cuopt_int_t column_indices[] = {0}; + cuopt_float_t values[] = {1.0}; + char constraint_sense[] = {CUOPT_LESS_THAN}; + cuopt_float_t rhs[] = {1.0}; + cuopt_float_t lower_bounds[] = {0.0}; + cuopt_float_t upper_bounds[] = {1.0}; + char variable_types[] = {CUOPT_CONTINUOUS}; + char error_string[8] = "unset"; + + status = cuOptCreateProblem(1, + 1, + CUOPT_MINIMIZE, + 0.0, + objective, + row_offsets, + column_indices, + values, + constraint_sense, + rhs, + lower_bounds, + upper_bounds, + variable_types, + &problem); + if (status != CUOPT_SUCCESS) { + printf("Error creating optimization problem\n"); + goto DONE; + } + + status = cuOptCreateSolverSettings(&settings); + if (status != CUOPT_SUCCESS) { + printf("Error creating solver settings\n"); + goto DONE; + } + + status = cuOptSolve(problem, settings, &solution); + if (status != CUOPT_SUCCESS) { + printf("Error solving problem\n"); + goto DONE; + } + + status = cuOptGetErrorString(solution, error_string, 0); + if (status != CUOPT_INVALID_ARGUMENT) { + printf("Error: expected invalid argument for zero error buffer size, but got %d\n", status); + goto DONE; + } + + status = cuOptGetErrorString(solution, error_string, -1); + if (status != CUOPT_INVALID_ARGUMENT) { + printf("Error: expected invalid argument for negative error buffer size, but got %d\n", + status); + goto DONE; + } + + status = CUOPT_SUCCESS; + +DONE: + cuOptDestroyProblem(&problem); + cuOptDestroySolverSettings(&settings); + cuOptDestroySolution(&solution); + return status; +} + typedef struct mip_callback_context_t { cuopt_int_t n_variables; int get_calls; diff --git a/cpp/tests/linear_programming/c_api_tests/c_api_tests.cpp b/cpp/tests/linear_programming/c_api_tests/c_api_tests.cpp index 2a70c5a67d..3aa6027de6 100644 --- a/cpp/tests/linear_programming/c_api_tests/c_api_tests.cpp +++ b/cpp/tests/linear_programming/c_api_tests/c_api_tests.cpp @@ -107,6 +107,11 @@ TEST(c_api, solve_time_bb_preemption) TEST(c_api, bad_parameter_name) { EXPECT_EQ(test_bad_parameter_name(), CUOPT_INVALID_ARGUMENT); } +TEST(c_api, error_string_invalid_buffer_size) +{ + EXPECT_EQ(test_error_string_invalid_buffer_size(), CUOPT_SUCCESS); +} + TEST(c_api, mip_get_callbacks_only) { EXPECT_EQ(test_mip_get_callbacks_only(), CUOPT_SUCCESS); } TEST(c_api, mip_get_set_callbacks) { EXPECT_EQ(test_mip_get_set_callbacks(), CUOPT_SUCCESS); } diff --git a/cpp/tests/linear_programming/c_api_tests/c_api_tests.h b/cpp/tests/linear_programming/c_api_tests/c_api_tests.h index 7720cb2c0d..90f26cc9d7 100644 --- a/cpp/tests/linear_programming/c_api_tests/c_api_tests.h +++ b/cpp/tests/linear_programming/c_api_tests/c_api_tests.h @@ -28,6 +28,7 @@ cuopt_int_t solve_mps_file(const char* filename, cuopt_int_t test_missing_file(); cuopt_int_t test_infeasible_problem(); cuopt_int_t test_bad_parameter_name(); +cuopt_int_t test_error_string_invalid_buffer_size(); cuopt_int_t test_mip_get_callbacks_only(); cuopt_int_t test_mip_get_set_callbacks(); cuopt_int_t test_ranged_problem(cuopt_int_t* termination_status_ptr, cuopt_float_t* objective_ptr);