Re: [sqlite] Potential corruption bug in 2.8.17. Patch attached.

2006-10-24 Thread drh
[EMAIL PROTECTED] wrote:
 This was likely a typo.  In its current state, it's accessing uninitialized
 memory.  It looks like it's conceivable that an incorrect nextRowid could be
 later used if the uninitialized value happens to be a small integer (smaller
 than pC-nextRowid) and the valid flag therefore doesn't get set to false.
 
 --- vdbe.c~   2005-12-19 12:42:25.0 -0500
 +++ vdbe.c2006-10-22 16:32:45.0 -0400
 @@ -2937,7 +2937,7 @@
if( pOp-p2  OPFLAG_NCHANGE ) db-nChange++;
if( pOp-p2  OPFLAG_LASTROWID ) db-lastRowid = pNos-i;
if( pOp-p2  OPFLAG_CSCHANGE ) db-csChange++;
 -  if( pC-nextRowidValid  pTos-i=pC-nextRowid ){
 +  if( pC-nextRowidValid  pNos-i=pC-nextRowid ){
  pC-nextRowidValid = 0;
}
  }
 

As it happens, pC-nextRowidValid is always false in this
context, as far as I can tell, so the pTos-i variable is
never accessed.  The fix checked in was to remove the test
altogether and unconditionally set pC-nextRowidValid to 0.

Because the code is unreachable, this fix does not require
a new release of SQLite 2.8.

--
D. Richard Hipp  [EMAIL PROTECTED]


-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Potential corruption bug in 2.8.17. Patch attached.

2006-10-24 Thread Derrell . Lipman
[EMAIL PROTECTED] writes:

 [EMAIL PROTECTED] wrote:
 This was likely a typo.  In its current state, it's accessing uninitialized
 memory.  It looks like it's conceivable that an incorrect nextRowid could be
 later used if the uninitialized value happens to be a small integer (smaller
 than pC-nextRowid) and the valid flag therefore doesn't get set to false.
 
 --- vdbe.c~  2005-12-19 12:42:25.0 -0500
 +++ vdbe.c   2006-10-22 16:32:45.0 -0400
 @@ -2937,7 +2937,7 @@
if( pOp-p2  OPFLAG_NCHANGE ) db-nChange++;
if( pOp-p2  OPFLAG_LASTROWID ) db-lastRowid = pNos-i;
if( pOp-p2  OPFLAG_CSCHANGE ) db-csChange++;
 -  if( pC-nextRowidValid  pTos-i=pC-nextRowid ){
 +  if( pC-nextRowidValid  pNos-i=pC-nextRowid ){
  pC-nextRowidValid = 0;
}
  }
 

 As it happens, pC-nextRowidValid is always false in this
 context, as far as I can tell, so the pTos-i variable is
 never accessed.

That explains why in many years of use, I've never seen an actual corruption
caused by this.  Thanks.

 The fix checked in was to remove the test altogether and unconditionally set
 pC-nextRowidValid to 0.

If, as you say, pC-nextRowidValid is always false anyway, wouldn't the
correct fix be to not even unconditionally set pC-nextRowidValid to 0; just
delete those two original lines entirely?  It sounds like you're now
unnecessarily setting a variable that's already false to false. (Or did I
misunderstand your statement?)

Derrell

-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Potential corruption bug in 2.8.17. Patch attached.

2006-10-24 Thread drh
[EMAIL PROTECTED] wrote:
  
  --- vdbe.c~2005-12-19 12:42:25.0 -0500
  +++ vdbe.c 2006-10-22 16:32:45.0 -0400
  @@ -2937,7 +2937,7 @@
 if( pOp-p2  OPFLAG_NCHANGE ) db-nChange++;
 if( pOp-p2  OPFLAG_LASTROWID ) db-lastRowid = pNos-i;
 if( pOp-p2  OPFLAG_CSCHANGE ) db-csChange++;
  -  if( pC-nextRowidValid  pTos-i=pC-nextRowid ){
  +  if( pC-nextRowidValid  pNos-i=pC-nextRowid ){
   pC-nextRowidValid = 0;
 }
   }
  
 
 
  The fix checked in was to remove the test altogether and unconditionally set
  pC-nextRowidValid to 0.
 
 If, as you say, pC-nextRowidValid is always false anyway, wouldn't the
 correct fix be to not even unconditionally set pC-nextRowidValid to 0; just
 delete those two original lines entirely?  It sounds like you're now
 unnecessarily setting a variable that's already false to false. (Or did I
 misunderstand your statement?)
 

I could not find a case where pC-nextRowidValid was true.  But
neither did I prove it was impossible.  Lets just say it was
very unlikely.  

Setting pC-nextRowidValid merely invalidates a cache.  Invalidating
the cache might make the code a little slower, but it will still get
the correct answer.  So it is always safe to set pC-newRowidValid to
0.  But we cannot leave pC-nextRowidValid in the true state because
that might leave an invalid value in the cache, resulting in a wrong
answer.  So for safety, we always clear the cache here, even though
we have never seen an example where it is necessary.  Better safe than
sorry.
--
D. Richard Hipp  [EMAIL PROTECTED]


-
To unsubscribe, send email to [EMAIL PROTECTED]
-



[sqlite] Potential corruption bug in 2.8.17. Patch attached.

2006-10-22 Thread Derrell . Lipman
This was likely a typo.  In its current state, it's accessing uninitialized
memory.  It looks like it's conceivable that an incorrect nextRowid could be
later used if the uninitialized value happens to be a small integer (smaller
than pC-nextRowid) and the valid flag therefore doesn't get set to false.

--- vdbe.c~ 2005-12-19 12:42:25.0 -0500
+++ vdbe.c  2006-10-22 16:32:45.0 -0400
@@ -2937,7 +2937,7 @@
   if( pOp-p2  OPFLAG_NCHANGE ) db-nChange++;
   if( pOp-p2  OPFLAG_LASTROWID ) db-lastRowid = pNos-i;
   if( pOp-p2  OPFLAG_CSCHANGE ) db-csChange++;
-  if( pC-nextRowidValid  pTos-i=pC-nextRowid ){
+  if( pC-nextRowidValid  pNos-i=pC-nextRowid ){
 pC-nextRowidValid = 0;
   }
 }

Cheers,

Derrell

-
To unsubscribe, send email to [EMAIL PROTECTED]
-