Thread

  1. Re: [HACKERS] ERROR: infinite recursion in proc_exit

    Bruce Momjian <maillist@candle.pha.pa.us> — 1999-11-06T16:57:38Z

    > > 
    > > Hmm.  If that trace is from 6.5 code, then postgres.c should certainly
    > > be calling proc_exit after the recv() fails.  I wonder if proc_exit is
    > > returning because proc_exit_inprogress is nonzero?  proc_exit's use of
    > > elog(ERROR) does look mighty bogus to me --- that path could possibly
    > > cause a recursion just like this, but how did the code get into it to
    > > begin with?
    > 
    > The proc_exit_inprogress stuff was added by me after I found some backends
    > doing exactly that sort of infinite recursion after a socket recv error.
    > It doesn't correct the original error but at least il will exit the backend
    > after 10 iterations. The elog(ERROR) might be bogus in this context, but how
    > can you otherwise notify the error? Maybe a better solution could be this:
    > 
    > 	if (proc_exit_inprogress++ == 9)
    > 		elog(ERROR, "infinite recursion in proc_exit");
    > 	if (proc_exit_inprogress >= 9)
    > 		goto exit;
    
    
    Fix applied:
    
        /*
         * If proc_exit is called too many times something bad is happening, so
         * exit immediately.  This is crafted in two if's for a reason.
         */
        if (proc_exit_inprogress == 9)
            elog(ERROR, "infinite recursion in proc_exit");
        if (proc_exit_inprogress >= 9)
            goto exit;
    
    
    -- 
      Bruce Momjian                        |  http://www.op.net/~candle
      maillist@candle.pha.pa.us            |  (610) 853-3000
      +  If your life is a hard drive,     |  830 Blythe Avenue
      +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026