Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Input: usbtouchscreen - switch to using __free() cleanup facility

Use __free(kfree) cleanup facility when allocating temporary buffers
for USB transfers.

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20240712051851.3463657-8-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+33 -57
+33 -57
drivers/input/touchscreen/usbtouchscreen.c
··· 167 167 168 168 static int egalax_init(struct usbtouch_usb *usbtouch) 169 169 { 170 - int ret, i; 171 - unsigned char *buf; 172 170 struct usb_device *udev = interface_to_usbdev(usbtouch->interface); 171 + int ret, i; 173 172 174 173 /* 175 174 * An eGalax diagnostic packet kicks the device into using the right ··· 176 177 * read later and ignored. 177 178 */ 178 179 179 - buf = kmalloc(3, GFP_KERNEL); 180 + u8 *buf __free(kfree) = kmalloc(3, GFP_KERNEL); 180 181 if (!buf) 181 182 return -ENOMEM; 182 183 ··· 190 191 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 191 192 0, 0, buf, 3, 192 193 USB_CTRL_SET_TIMEOUT); 193 - if (ret >= 0) { 194 - ret = 0; 195 - break; 196 - } 197 194 if (ret != -EPIPE) 198 195 break; 199 196 } 200 197 201 - kfree(buf); 202 - 203 - return ret; 198 + return ret < 0 ? ret : 0; 204 199 } 205 200 206 201 static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) ··· 351 358 { 352 359 struct usb_device *udev = interface_to_usbdev(usbtouch->interface); 353 360 struct mtouch_priv *priv = usbtouch->priv; 354 - u8 *buf; 355 361 int ret; 356 362 357 - buf = kzalloc(MTOUCHUSB_REQ_CTRLLR_ID_LEN, GFP_NOIO); 363 + u8 *buf __free(kfree) = kzalloc(MTOUCHUSB_REQ_CTRLLR_ID_LEN, GFP_NOIO); 358 364 if (!buf) 359 365 return -ENOMEM; 360 366 ··· 365 373 if (ret != MTOUCHUSB_REQ_CTRLLR_ID_LEN) { 366 374 dev_warn(&usbtouch->interface->dev, 367 375 "Failed to read FW rev: %d\n", ret); 368 - ret = ret < 0 ? ret : -EIO; 369 - goto free; 376 + return ret < 0 ? ret : -EIO; 370 377 } 371 378 372 379 priv->fw_rev_major = buf[3]; 373 380 priv->fw_rev_minor = buf[4]; 374 381 375 - ret = 0; 376 - 377 - free: 378 - kfree(buf); 379 - return ret; 382 + return 0; 380 383 } 381 384 382 385 static int mtouch_alloc(struct usbtouch_usb *usbtouch) ··· 623 636 static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) 624 637 { 625 638 struct usb_device *dev = interface_to_usbdev(usbtouch->interface); 626 - int ret = -ENOMEM; 627 - unsigned char *buf; 639 + int ret; 628 640 629 - buf = kmalloc(2, GFP_NOIO); 641 + u8 *buf __free(kfree) = kmalloc(2, GFP_NOIO); 630 642 if (!buf) 631 - goto err_nobuf; 643 + return -ENOMEM; 644 + 632 645 /* reset */ 633 646 buf[0] = buf[1] = 0xFF; 634 647 ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), 635 - TSC10_CMD_RESET, 636 - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 637 - 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 648 + TSC10_CMD_RESET, 649 + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 650 + 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 638 651 if (ret < 0) 639 - goto err_out; 640 - if (buf[0] != 0x06) { 641 - ret = -ENODEV; 642 - goto err_out; 643 - } 652 + return ret; 653 + 654 + if (buf[0] != 0x06) 655 + return -ENODEV; 644 656 645 657 /* TSC-25 data sheet specifies a delay after the RESET command */ 646 658 msleep(150); ··· 647 661 /* set coordinate output rate */ 648 662 buf[0] = buf[1] = 0xFF; 649 663 ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), 650 - TSC10_CMD_RATE, 651 - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 652 - TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 664 + TSC10_CMD_RATE, 665 + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 666 + TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 653 667 if (ret < 0) 654 - goto err_out; 655 - if ((buf[0] != 0x06) && (buf[0] != 0x15 || buf[1] != 0x01)) { 656 - ret = -ENODEV; 657 - goto err_out; 658 - } 668 + return ret; 669 + 670 + if (buf[0] != 0x06 && (buf[0] != 0x15 || buf[1] != 0x01)) 671 + return -ENODEV; 659 672 660 673 /* start sending data */ 661 - ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 662 - TSC10_CMD_DATA1, 663 - USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 664 - 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); 665 - err_out: 666 - kfree(buf); 667 - err_nobuf: 668 - return ret; 674 + return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 675 + TSC10_CMD_DATA1, 676 + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 677 + 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); 669 678 } 670 - 671 679 672 680 static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 673 681 { ··· 972 992 struct nexio_priv *priv = usbtouch->priv; 973 993 int ret = -ENOMEM; 974 994 int actual_len, i; 975 - unsigned char *buf; 976 995 char *firmware_ver = NULL, *device_name = NULL; 977 996 int input_ep = 0, output_ep = 0; 978 997 ··· 987 1008 if (!input_ep || !output_ep) 988 1009 return -ENXIO; 989 1010 990 - buf = kmalloc(NEXIO_BUFSIZE, GFP_NOIO); 1011 + u8 *buf __free(kfree) = kmalloc(NEXIO_BUFSIZE, GFP_NOIO); 991 1012 if (!buf) 992 - goto out_buf; 1013 + return -ENOMEM; 993 1014 994 1015 /* two empty reads */ 995 1016 for (i = 0; i < 2; i++) { ··· 997 1018 buf, NEXIO_BUFSIZE, &actual_len, 998 1019 NEXIO_TIMEOUT); 999 1020 if (ret < 0) 1000 - goto out_buf; 1021 + return ret; 1001 1022 } 1002 1023 1003 1024 /* send init command */ ··· 1006 1027 buf, sizeof(nexio_init_pkt), &actual_len, 1007 1028 NEXIO_TIMEOUT); 1008 1029 if (ret < 0) 1009 - goto out_buf; 1030 + return ret; 1010 1031 1011 1032 /* read replies */ 1012 1033 for (i = 0; i < 3; i++) { ··· 1037 1058 usb_fill_bulk_urb(priv->ack, dev, usb_sndbulkpipe(dev, output_ep), 1038 1059 priv->ack_buf, sizeof(nexio_ack_pkt), 1039 1060 nexio_ack_complete, usbtouch); 1040 - ret = 0; 1041 1061 1042 - out_buf: 1043 - kfree(buf); 1044 - return ret; 1062 + return 0; 1045 1063 } 1046 1064 1047 1065 static void nexio_exit(struct usbtouch_usb *usbtouch)