longjmp in psql considered harmful
От | Tom Lane |
---|---|
Тема | longjmp in psql considered harmful |
Дата | |
Msg-id | 11527.1150043542@sss.pgh.pa.us обсуждение исходный текст |
Ответы |
Re: longjmp in psql considered harmful
|
Список | pgsql-hackers |
This has come up before, but I was reminded of it again after noticing how confused psql gets if you use control-C to get out of a long "\lo_import" operation. Usually the control-C hits while waiting for the backend to respond to a lowrite() function call. As psql is currently coded, it just longjmp's back to the main loop. Eventually the function call response arrives, and it'll be taken as the response to the *next* command psql issues to the backend! All sorts of fun ensues, but it's particularly bad if the next command is also a function call (eg, you try \lo_import again). A narrow view of this is that cancelConn should be set non-NULL while doing \lo operations, but I think the problem is bigger than that. Allowing a signal handler to do siglongjmp at random times is basically guaranteed to break any program. For instance, if it happens during a malloc() or free() call you probably get corrupted malloc data structures, leading to crash later. I think we should try very hard to get rid of the longjmp in the signal handler altogether. I notice it doesn't work anyway in the Windows port, so this would improve portability as well as safety. The signal handler should just set a flag that would be checked at safe points, much as we do in the backend. (The bit about doing PQcancel can stay, though, since that's carefully designed to be signal-safe.) Does anyone see a real strong reason why we need a longjmp directly from the signal handler? I had first thought that we couldn't preserve the current behavior of clearing the input buffer when control-C is typed in the midst of entering a line --- but according to the readline manual, libreadline handles that for itself. I'm not seeing any other killer reasons to have it. regards, tom lane
В списке pgsql-hackers по дате отправления: