mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-06-19 05:28:28 +02:00
filter: validate custom acceleration function's points size
Adds min and max size limit for custom acceleration function's points. Adds tests to make sure validation works properly. Signed-off-by: Yinon Burgansky <51504-Yinon@users.noreply.gitlab.freedesktop.org>
This commit is contained in:
parent
32c0af17f0
commit
886f1c6767
4 changed files with 47 additions and 13 deletions
|
|
@ -49,6 +49,12 @@ create_custom_accel_function(double step, const double *points, size_t npoints)
|
|||
if (step <= 0 || step > LIBINPUT_ACCEL_STEP_MAX)
|
||||
return NULL;
|
||||
|
||||
for (size_t idx = 0; idx < npoints; idx++) {
|
||||
if (points[idx] < LIBINPUT_ACCEL_POINT_MIN_VALUE ||
|
||||
points[idx] > LIBINPUT_ACCEL_POINT_MAX_VALUE)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct custom_accel_function *cf = zalloc(sizeof(*cf) + npoints * sizeof(*points));
|
||||
cf->last_time = 0;
|
||||
cf->step = step;
|
||||
|
|
|
|||
|
|
@ -244,6 +244,16 @@ struct libinput_device_config_send_events {
|
|||
*/
|
||||
#define LIBINPUT_ACCEL_NPOINTS_MAX 64
|
||||
|
||||
/**
|
||||
* Custom acceleration function min point value
|
||||
*/
|
||||
#define LIBINPUT_ACCEL_POINT_MIN_VALUE 0
|
||||
|
||||
/**
|
||||
* Custom acceleration function max point value
|
||||
*/
|
||||
#define LIBINPUT_ACCEL_POINT_MAX_VALUE 10000
|
||||
|
||||
/**
|
||||
* Custom acceleration function max step size
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -4267,6 +4267,12 @@ libinput_config_accel_set_points(struct libinput_config_accel *config,
|
|||
if (npoints < LIBINPUT_ACCEL_NPOINTS_MIN || npoints > LIBINPUT_ACCEL_NPOINTS_MAX)
|
||||
return LIBINPUT_CONFIG_STATUS_INVALID;
|
||||
|
||||
for (size_t idx = 0; idx < npoints; idx++) {
|
||||
if (points[idx] < LIBINPUT_ACCEL_POINT_MIN_VALUE ||
|
||||
points[idx] > LIBINPUT_ACCEL_POINT_MAX_VALUE)
|
||||
return LIBINPUT_CONFIG_STATUS_INVALID;
|
||||
}
|
||||
|
||||
struct libinput_config_accel_custom_func *func = libinput_config_accel_custom_func_create();
|
||||
|
||||
func->step = step;
|
||||
|
|
|
|||
|
|
@ -2281,12 +2281,25 @@ START_TEST(pointer_accel_config)
|
|||
struct libinput_device *device = dev->libinput_device;
|
||||
enum libinput_config_status status;
|
||||
enum libinput_config_accel_profile profile;
|
||||
double custom_speed[] = {0.1234, -0.567, 0.89};
|
||||
double custom_step[] = {0.5, 0.003, 2.7};
|
||||
double custom_npoints = 4;
|
||||
double custom_points[3][4] = {{1.0, 2.0, 2.5, 2.6},
|
||||
{0.1, 0.3, 0.4, 0.45},
|
||||
{1.0, 3.0, 4.5, 4.5}};
|
||||
enum libinput_config_status valid = LIBINPUT_CONFIG_STATUS_SUCCESS,
|
||||
invalid = LIBINPUT_CONFIG_STATUS_INVALID;
|
||||
enum libinput_config_accel_type fallback = LIBINPUT_ACCEL_TYPE_FALLBACK,
|
||||
motion = LIBINPUT_ACCEL_TYPE_MOTION;
|
||||
struct custom_config_test {
|
||||
enum libinput_config_accel_type accel_type;
|
||||
double step;
|
||||
double points[4];
|
||||
enum libinput_config_status expected_status;
|
||||
} tests[] = {
|
||||
{ fallback, 0.5, { 1.0, 2.0, 2.5, 2.6 }, valid },
|
||||
{ motion, 0.003, { 0.1, 0.3, 0.4, 0.45 }, valid },
|
||||
{ fallback, 2.7, { 1.0, 3.0, 4.5, 4.5 }, valid },
|
||||
{ motion, 0, { 1.0, 2.0, 2.5, 2.6 }, invalid },
|
||||
{ fallback, -1, { 1.0, 2.0, 2.5, 2.6 }, invalid },
|
||||
{ motion, 1e10, { 1.0, 2.0, 2.5, 2.6 }, invalid },
|
||||
{ fallback, 1, { 1.0, 2.0, -2.5, 2.6 }, invalid },
|
||||
{ motion, 1, { 1.0, 2.0, 1e10, 2.6 }, invalid },
|
||||
};
|
||||
|
||||
ck_assert(libinput_device_config_accel_is_available(device));
|
||||
|
||||
|
|
@ -2298,14 +2311,13 @@ START_TEST(pointer_accel_config)
|
|||
ck_assert_ptr_nonnull(config_custom_default);
|
||||
ck_assert_ptr_nonnull(config_custom_changed);
|
||||
|
||||
|
||||
for (size_t idx = 0; idx < ARRAY_LENGTH(custom_speed); idx++) {
|
||||
ARRAY_FOR_EACH(tests, t) {
|
||||
status = libinput_config_accel_set_points(config_custom_changed,
|
||||
LIBINPUT_ACCEL_TYPE_FALLBACK,
|
||||
custom_step[idx],
|
||||
custom_npoints,
|
||||
custom_points[idx]);
|
||||
ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
|
||||
t->accel_type,
|
||||
t->step,
|
||||
ARRAY_LENGTH(t->points),
|
||||
t->points);
|
||||
ck_assert_int_eq(status, t->expected_status);
|
||||
|
||||
status = libinput_device_config_accel_apply(device, config_custom_changed);
|
||||
ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue