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

serial: max3107: Fix memory leaks when returning on error

Fix memory leaks in max3107_probe() when returning on error.

Signed-off-by: Davidlohr Bueso <dave@gnu.org>
Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Davidlohr Bueso and committed by
Greg Kroah-Hartman
68707539 91efa75c

+25 -9
+25 -9
drivers/serial/max3107.c
··· 986 986 s->rxbuf = kzalloc(sizeof(u16) * (MAX3107_RX_FIFO_SIZE+2), GFP_KERNEL); 987 987 if (!s->rxbuf) { 988 988 pr_err("Allocating RX buffer failed\n"); 989 - return -ENOMEM; 989 + retval = -ENOMEM; 990 + goto err_free4; 990 991 } 991 992 s->rxstr = kzalloc(sizeof(u8) * MAX3107_RX_FIFO_SIZE, GFP_KERNEL); 992 993 if (!s->rxstr) { 993 994 pr_err("Allocating RX buffer failed\n"); 994 - return -ENOMEM; 995 + retval = -ENOMEM; 996 + goto err_free3; 995 997 } 996 998 /* SPI Tx buffer 997 999 * SPI transfer buffer ··· 1004 1002 s->txbuf = kzalloc(sizeof(u16) * MAX3107_TX_FIFO_SIZE + 3, GFP_KERNEL); 1005 1003 if (!s->txbuf) { 1006 1004 pr_err("Allocating TX buffer failed\n"); 1007 - return -ENOMEM; 1005 + retval = -ENOMEM; 1006 + goto err_free2; 1008 1007 } 1009 1008 /* Initialize shared data lock */ 1010 1009 spin_lock_init(&s->data_lock); ··· 1024 1021 buf[0] = MAX3107_REVID_REG; 1025 1022 if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) { 1026 1023 dev_err(&s->spi->dev, "SPI transfer for REVID read failed\n"); 1027 - return -EIO; 1024 + retval = -EIO; 1025 + goto err_free1; 1028 1026 } 1029 1027 if ((buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID1 && 1030 1028 (buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID2) { 1031 1029 dev_err(&s->spi->dev, "REVID %x does not match\n", 1032 1030 (buf[0] & MAX3107_SPI_RX_DATA_MASK)); 1033 - return -ENODEV; 1031 + retval = -ENODEV; 1032 + goto err_free1; 1034 1033 } 1035 1034 1036 1035 /* Disable all interrupts */ ··· 1052 1047 /* Perform SPI transfer */ 1053 1048 if (max3107_rw(s, (u8 *)buf, NULL, 4)) { 1054 1049 dev_err(&s->spi->dev, "SPI transfer for init failed\n"); 1055 - return -EIO; 1050 + retval = -EIO; 1051 + goto err_free1; 1056 1052 } 1057 1053 1058 1054 /* Register UART driver */ ··· 1061 1055 retval = uart_register_driver(&max3107_uart_driver); 1062 1056 if (retval) { 1063 1057 dev_err(&s->spi->dev, "Registering UART driver failed\n"); 1064 - return retval; 1058 + goto err_free1; 1065 1059 } 1066 1060 driver_registered = 1; 1067 1061 } ··· 1080 1074 retval = uart_add_one_port(&max3107_uart_driver, &s->port); 1081 1075 if (retval < 0) { 1082 1076 dev_err(&s->spi->dev, "Adding UART port failed\n"); 1083 - return retval; 1077 + goto err_free1; 1084 1078 } 1085 1079 1086 1080 if (pdata->configure) { 1087 1081 retval = pdata->configure(s); 1088 1082 if (retval < 0) 1089 - return retval; 1083 + goto err_free1; 1090 1084 } 1091 1085 1092 1086 /* Go to suspend mode */ ··· 1094 1088 pdata->hw_suspend(s, 1); 1095 1089 1096 1090 return 0; 1091 + 1092 + err_free1: 1093 + kfree(s->txbuf); 1094 + err_free2: 1095 + kfree(s->rxstr); 1096 + err_free3: 1097 + kfree(s->rxbuf); 1098 + err_free4: 1099 + kfree(s); 1100 + return retval; 1097 1101 } 1098 1102 EXPORT_SYMBOL_GPL(max3107_probe); 1099 1103