data corruption in 2.4.19/drivers/scsi/sg.c
Subsystems (2)
Hi,
As subject suggests generic scsi module from 2.4.19 corrupts data. Backing back to 2.4.18 code [as suggested below] fixes the problem.
Quoted 1 line
From the attached patch it's not clear what's causing the problem
as the code appears equivalent. Corruption occurs if you break out the inner loop few lines later:
if (ksglen > usglen) {
...
p += usglen;
ksglen -= usglen;
break;
}and reenter it. Then ksglen and p are reset which results in some duplicate data injection.
Cheers. Andy.
drivers/scsi/sg.c renamed from drivers/scsi/sg.c.orig +10 -0
@@ -1884,11 +1884,16 @@ res =sg_u_iovec (hp, iovec_count, j,1 , &usglen, &up);if (res)return res; +#if 0 for (; k < schp->k_use_sg; ++k, ++sclp) { ksglen = (int )sclp->length; p = sclp->address;if (NULL == p)break ; +#else +for (; (k < schp->k_use_sg) && p; + ++k, ++sclp, ksglen = (int )sclp->length, p = sclp->address) { +#endif ok = (SG_USER_MEM != mem_src_arr[k]);if (usglen <=0 )break ;
@@ -2040,11 +2045,16 @@ res =sg_u_iovec (hp, iovec_count, j,0 , &usglen, &up);if (res)return res; +#if 0 for (; k < schp->k_use_sg; ++k, ++sclp) { ksglen = (int )sclp->length; p = sclp->address;if (NULL == p)break ; +#else +for (; (k < schp->k_use_sg) && p; + ++k, ++sclp, ksglen = (int )sclp->length, p = sclp->address) { +#endif ok = (SG_USER_MEM != mem_src_arr[k]);if (usglen <=0 )break ;