Re: How to crash postgres using savepoints - Mailing list pgsql-hackers

From Tom Lane
Subject Re: How to crash postgres using savepoints
Date
Msg-id 23710.1091548986@sss.pgh.pa.us
Whole thread Raw
In response to Re: How to crash postgres using savepoints  (Gavin Sherry <swm@linuxworld.com.au>)
List pgsql-hackers
Gavin Sherry <swm@linuxworld.com.au> writes:
> On Tue, 3 Aug 2004, Jeff Davis wrote:
>> I have a question for you also. I just posted a patch at about the same
>> time you did (I sent it to pgsql-patches, but I haven't seen it appear
>> yet). Mine was a one-liner (appended to end of this email) and all it
>> did was add a check into the aforementioned line for a non-null target
>> pointer. My patch seemed to work, so I'd like to know why you changed
>> the structure around more. I did notice some things were a little
>> cleaner, so was it just clean-up or does my patch fail in some way?

> Just a clean up.

Actually, there's an easier fix than either of these, which is just to
pull the savepointLevel test out of the loop and only do it after we've
found a candidate savepoint.  There's no point in checking the level at
every loop iteration (especially since the feature isn't even being used
yet, as noted).

Attached is the patch I just applied (which also includes my own notions
about how to make the loop prettier...)
        regards, tom lane


*** src/backend/access/transam/xact.c.orig    Sun Aug  1 16:57:59 2004
--- src/backend/access/transam/xact.c    Tue Aug  3 11:53:41 2004
***************
*** 2520,2541 ****      Assert(PointerIsValid(name)); 
!     target = CurrentTransactionState;
! 
!     while (target != NULL)     {         if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)
   break;
 
-         target = target->parent;
- 
-         /* we don't cross savepoint level boundaries */
-         if (target->savepointLevel != s->savepointLevel)
-             ereport(ERROR,
-                     (errcode(ERRCODE_S_E_INVALID_SPECIFICATION),
-                      errmsg("no such savepoint")));     }      if (!PointerIsValid(target))         ereport(ERROR,
            (errcode(ERRCODE_S_E_INVALID_SPECIFICATION),                  errmsg("no such savepoint")));
 
--- 2520,2538 ----      Assert(PointerIsValid(name)); 
!     for (target = s; PointerIsValid(target); target = target->parent)     {         if (PointerIsValid(target->name)
&&strcmp(target->name, name) == 0)             break;     }      if (!PointerIsValid(target))
 
+         ereport(ERROR,
+                 (errcode(ERRCODE_S_E_INVALID_SPECIFICATION),
+                  errmsg("no such savepoint")));
+ 
+     /* disallow crossing savepoint level boundaries */
+     if (target->savepointLevel != s->savepointLevel)         ereport(ERROR,
(errcode(ERRCODE_S_E_INVALID_SPECIFICATION),                 errmsg("no such savepoint")));
 


pgsql-hackers by date:

Previous
From: Josh Berkus
Date:
Subject: Re: pg_dump bug fixing
Next
From: Gaetano Mendola
Date:
Subject: CVS comment