Index | Thread | Search

From:
"Ted Unangst" <tedu@tedunangst.com>
Subject:
Re: /sbin/scsi bugfixes
To:
"Crystal Kolipe" <kolipe.c@exoticsilicon.com>
Cc:
tech@openbsd.org
Date:
Thu, 15 May 2025 15:19:15 -0400

Download raw body.

Thread
On 2025-05-15, Crystal Kolipe wrote:

I think this code would benefit from the introduction of some variables.

int page3 = (page & 0x3f) == 0x3;
int offset = page3 ? 3 : 5;

for (i = 0; i < (mh->mdl - mh->bdl - offset; i++)

something like that.

> --- scsi.c.dist	Sun Dec  4 23:50:47 2022
> +++ scsi.c	Thu May 15 15:02:58 2025
> @@ -804,10 +804,23 @@
>  	 */
>  	mh = (struct mode_header *)data;
>  	mph = (struct mode_page_header *)(((char *)mh) + sizeof(*mh) + mh->bdl);
> -	mode_pars = (char *)mph + sizeof(*mph);
>  
> +	/*
> +	 * If the data length was just block descriptors and the three header
> +	 * bytes, we're done.
> +	 */
> +	if (mh->bdl + 3 >= mh->mdl)
> +		return ;
> +
> +	/*
> +	 * Skip mode page header unless we are requesting page 0x3f, (all pages)
> +	 */
> +
> +	mode_pars = (char *)mph + (((page & 0x3f) == 0x3f) ? 0 : sizeof(*mph));
> +
>  	if (!fmt) {
> -		for (i = 0; i < mh->mdl; i++) {
> +		for (i = 0; i < (mh->mdl - mh->bdl -
> +			    (((page & 0x3f) == 0x3f) ? 3 : 5)); i++) {
>  			printf("%02x%c",mode_pars[i],
>  			(((i + 1) % 8) == 0) ? '\n' : ' ');
>  		}
> 
>