| From chrisw@hera.kernel.org Tue Nov 7 09:26:01 2006 |
| From: Sergey Vlasov <vsu@altlinux.ru> |
| To: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Tue, 7 Nov 2006 20:02:36 +0300 |
| Message-Id: <11629189562984-git-send-email-vsu@altlinux.ru> |
| Cc: linux-input@atrey.karlin.mff.cuni.cz, Sergey Vlasov <vsu@altlinux.ru> |
| Subject: Input: psmouse - fix attribute access on 64-bit systems |
| |
| psmouse_show_int_attr() and psmouse_set_int_attr() were accessing |
| unsigned int fields as unsigned long, which gave garbage on x86_64. |
| |
| Signed-off-by: Sergey Vlasov <vsu@altlinux.ru> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| --- |
| drivers/input/mouse/psmouse-base.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| The problem was found in 2.6.18.2; the same patch applies to the |
| current tree. |
| |
| --- linux-2.6.18.2.orig/drivers/input/mouse/psmouse-base.c |
| +++ linux-2.6.18.2/drivers/input/mouse/psmouse-base.c |
| @@ -1332,20 +1332,22 @@ ssize_t psmouse_attr_set_helper(struct d |
| |
| static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf) |
| { |
| - unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); |
| + unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); |
| |
| - return sprintf(buf, "%lu\n", *field); |
| + return sprintf(buf, "%u\n", *field); |
| } |
| |
| static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count) |
| { |
| - unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); |
| + unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); |
| unsigned long value; |
| char *rest; |
| |
| value = simple_strtoul(buf, &rest, 10); |
| if (*rest) |
| return -EINVAL; |
| + if ((unsigned int)value != value) |
| + return -EINVAL; |
| |
| *field = value; |
| |