wsmouse(4) doesn't free the memory allocated for the wstpad state
when an external touchpad is being unplugged. This patch fixes
the leak.
OK?
Index: wsmouse.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsmouse.c,v
retrieving revision 1.66
diff -u -p -r1.66 wsmouse.c
--- wsmouse.c 29 Jul 2020 05:53:52 -0000 1.66
+++ wsmouse.c 20 Mar 2021 22:23:35 -0000
@@ -1712,5 +1712,8 @@ wsmouse_input_reset(struct wsmouseinput
void
wsmouse_input_cleanup(struct wsmouseinput *input)
{
+ if (input->tp != NULL)
+ wstpad_cleanup(input);
+
free_mt_slots(input);
}
Index: wsmouseinput.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsmouseinput.h,v
retrieving revision 1.14
diff -u -p -r1.14 wsmouseinput.h
--- wsmouseinput.h 19 Aug 2019 21:19:38 -0000 1.14
+++ wsmouseinput.h 20 Mar 2021 22:23:35 -0000
@@ -193,6 +193,7 @@ void wstpad_compat_convert(struct wsmous
void wstpad_init_deceleration(struct wsmouseinput *);
int wstpad_configure(struct wsmouseinput *);
void wstpad_reset(struct wsmouseinput *);
+void wstpad_cleanup(struct wsmouseinput *);
int wstpad_get_param(struct wsmouseinput *, int, int *);
int wstpad_set_param(struct wsmouseinput *, int, int);
Index: wstpad.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wstpad.c,v
retrieving revision 1.27
diff -u -p -r1.27 wstpad.c
--- wstpad.c 3 Mar 2021 19:44:37 -0000 1.27
+++ wstpad.c 20 Mar 2021 22:23:35 -0000
@@ -1670,6 +1670,19 @@ wstpad_reset(struct wsmouseinput *input)
}
}
+void
+wstpad_cleanup(struct wsmouseinput *input)
+{
+ struct wstpad *tp = input->tp;
+ int slots;
+
+ timeout_del(&tp->tap.to);
+ slots = imax(input->mt.num_slots, 1);
+ free(tp->tpad_touches, M_DEVBUF, slots * sizeof(struct tpad_touch));
+ free(tp, M_DEVBUF, sizeof(struct wstpad));
+ input->tp = NULL;
+}
+
int
wstpad_set_param(struct wsmouseinput *input, int key, int val)
{