hbirr@svn.reactos.com wrote:
- Initialized an allocated block completely before release the lock.
@@ -719,9 +725,9 @@
{ if ( (NewBlock = RQueRemove ( &pool->Que[que][align] )) ) {
R_RELEASE_MUTEX(pool); RiUsedInit ( NewBlock, Tag ); RiUsedInitRedZone ( NewBlock, NumberOfBytes );
R_RELEASE_MUTEX(pool); return RHdrToBody(NewBlock);} queBytes = 16 << que;
@@ -865,11 +871,10 @@
NewBlock = (PR_USED)BestBlock; RiUsedInit ( NewBlock, Tag );
R_RELEASE_MUTEX(pool);
/* RtlZeroMemory(RHdrToBody(NewBlock), NumberOfBytes);*/
RiUsedInitRedZone ( NewBlock, NumberOfBytes );
R_RELEASE_MUTEX(pool);
return RHdrToBody(NewBlock);
}
Hartmut,
If you don't mind, I'm curious how this was causing a problem, the stuff that was being initialized outside of the lock shouldn't (in my feeble mind) have been "visible" upon reentry until this block is freed again.
Thanks,
Royce
Royce Mitchell III wrote:
hbirr@svn.reactos.com wrote:
- Initialized an allocated block completely before release the lock.
@@ -719,9 +725,9 @@
{ if ( (NewBlock = RQueRemove ( &pool->Que[que][align] )) ) {
R_RELEASE_MUTEX(pool); RiUsedInit ( NewBlock, Tag ); RiUsedInitRedZone ( NewBlock, NumberOfBytes );
R_RELEASE_MUTEX(pool); return RHdrToBody(NewBlock); } queBytes = 16 << que;@@ -865,11 +871,10 @@
NewBlock = (PR_USED)BestBlock; RiUsedInit ( NewBlock, Tag );
R_RELEASE_MUTEX(pool);
/* RtlZeroMemory(RHdrToBody(NewBlock), NumberOfBytes);*/
RiUsedInitRedZone ( NewBlock, NumberOfBytes );
R_RELEASE_MUTEX(pool);
return RHdrToBody(NewBlock);
}
Hartmut,
If you don't mind, I'm curious how this was causing a problem, the stuff that was being initialized outside of the lock shouldn't (in my feeble mind) have been "visible" upon reentry until this block is freed again.
I've add a 'paged pool check thread' which is activated each 10 minutes. The thread allocates a zero size block, which triggers the checking. If the thread does check a new allocated block between releasing the lock and intializing the red zone, I get a wrong hit.
- Hartmut