mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
Prevent a double free by not reentering be_tls_close().
Reentering this function with the right timing caused a double free, typically crashing the backend. By synchronizing a disconnection with the authentication timeout, an unauthenticated attacker could achieve this somewhat consistently. Call be_tls_close() solely from within proc_exit_prepare(). Back-patch to 9.0 (all supported versions). Benkocs Norbert Attila Security: CVE-2015-3165
This commit is contained in:
@@ -3960,7 +3960,16 @@ BackendInitialize(Port *port)
|
||||
* We arrange for a simple exit(1) if we receive SIGTERM or SIGQUIT or
|
||||
* timeout while trying to collect the startup packet. Otherwise the
|
||||
* postmaster cannot shutdown the database FAST or IMMED cleanly if a
|
||||
* buggy client fails to send the packet promptly.
|
||||
* buggy client fails to send the packet promptly. XXX it follows that
|
||||
* the remainder of this function must tolerate losing control at any
|
||||
* instant. Likewise, any pg_on_exit_callback registered before or during
|
||||
* this function must be prepared to execute at any instant between here
|
||||
* and the end of this function. Furthermore, affected callbacks execute
|
||||
* partially or not at all when a second exit-inducing signal arrives
|
||||
* after proc_exit_prepare() decrements on_proc_exit_index. (Thanks to
|
||||
* that mechanic, callbacks need not anticipate more than one call.) This
|
||||
* is fragile; it ought to instead follow the norm of handling interrupts
|
||||
* at selected, safe opportunities.
|
||||
*/
|
||||
pqsignal(SIGTERM, startup_die);
|
||||
pqsignal(SIGQUIT, startup_die);
|
||||
|
||||
Reference in New Issue
Block a user