lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <48C1B253.4060805@ru.mvista.com>
Date:	Sat, 06 Sep 2008 02:27:31 +0400
From:	Sergei Shtylyov <sshtylyov@...mvista.com>
To:	Masoud Sharbiani <masouds@...gle.com>
Cc:	bzolnier@...il.com, akpm@...ux-foundation.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH] Fix pointer arithmetic in hpt3xx driver code (2nd attempt)

Hello.

Masoud Sharbiani wrote:

> Hi there, 
>   

   Er... I think the maintainer will have to remove this... :-)

> git commit 74811f355f4f69a187fa74892dcf2a684b84ce99 causes crash at
> module load (or boot) time on my machine with a hpt374 controller.
> Sergei says this is due to the pointer arithmatic. This patch fixes that
> and makes my machine boot again.
> cheers, 
> Masoud
>   

   And "cheers" too...

> Signed-Off-By: Masoud Sharbiani <masouds@...gle.com>
>   

Acked-by: Sergei Shtylyov <sshtylyov@...mvista.com>

> diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
> index eb107ee..4e04d0a 100644
> --- a/drivers/ide/pci/hpt366.c
> +++ b/drivers/ide/pci/hpt366.c
> @@ -613,6 +613,14 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list)
>  	return 0;
>  }
>  
> +static struct hpt_info *hpt3xx_get_info(struct device *dev)
>   

   That also will do. Though 'struct pci_dev' seems preferrable as it's 
always pre-calculated by the callers and otherwise needed in them in 4 
cases out of 7.

> +{
> +	struct pci_dev *pci_dev = to_pci_dev(dev);
> +	struct ide_host *host	= pci_get_drvdata(pci_dev);
>   

   Could be just:

	struct ide_host *host	= pci_get_drvdata(to_pci_dev(dev));


> +	struct hpt_info *info	= (struct hpt_info *)host->host_priv;
>   

   No epmty line after declaration block again. :-)

> +	return dev == host->dev[1] ? info + 1 : info;
> +}
> +
>  /*
>   * The Marvell bridge chips used on the HighPoint SATA cards do not seem
>   * to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes...
> @@ -621,9 +629,7 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list)
>  static u8 hpt3xx_udma_filter(ide_drive_t *drive)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	u8 mask 		= hwif->ultra_mask;
>  
>  	switch (info->chip_type) {
> @@ -662,9 +668,7 @@ static u8 hpt3xx_udma_filter(ide_drive_t *drive)
>  static u8 hpt3xx_mdma_filter(ide_drive_t *drive)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  
>  	switch (info->chip_type) {
>  	case HPT372 :
> @@ -700,8 +704,7 @@ static void hpt3xx_set_mode(ide_drive_t *drive, const u8 speed)
>  {
>  	ide_hwif_t *hwif	= drive->hwif;
>  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	struct hpt_timings *t	= info->timings;
>  	u8  itr_addr		= 0x40 + (drive->dn * 4);
>  	u32 old_itr		= 0;
> @@ -743,9 +746,8 @@ static void hpt3xx_quirkproc(ide_drive_t *drive)
>  static void hpt3xx_maskproc(ide_drive_t *drive, int mask)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev	*dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct pci_dev  *dev    = to_pci_dev(hwif->dev);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  
>  	if (drive->quirk_list) {
>  		if (info->chip_type >= HPT370) {
> @@ -973,8 +975,7 @@ static int __devinit hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f
>  static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
>  {
>  	unsigned long io_base	= pci_resource_start(dev, 4);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (&dev->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(&dev->dev);
>  	const char *name	= DRV_NAME;
>  	u8 pci_clk,  dpll_clk	= 0;	/* PCI and DPLL clock in MHz */
>  	u8 chip_type;
> @@ -1217,8 +1218,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
>  static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
>  {
>  	struct pci_dev	*dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	u8 chip_type		= info->chip_type;
>  	u8 scr1 = 0, ata66	= hwif->channel ? 0x01 : 0x02;
>  
> @@ -1262,8 +1262,7 @@ static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
>  static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
>  {
>  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	int serialize		= HPT_SERIALIZE_IO;
>  	u8  chip_type		= info->chip_type;
>  	u8  new_mcr, old_mcr	= 0;
>   

MBR, Sergei


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ