Re: [HACKERS] [Bug fix] postmaster always crashes on a debug version of Windows

2012-02-21 Thread Magnus Hagander
2012/2/15 MauMau :
> Hello
>
> I encountered a bug which always causes PostgreSQL to crash on Windows.
> Attached is a patch that fixes it. Please review it and include it in the
> upcoming minor releases of supported versions.

Thanks - good analysis, and good patch. Applied for head and
backpatched to all supported versions.

> I attached a patch against the master HEAD. Is it OK with a patch that has
> CR-LF line endings?

We prefer it without, but it was easy enough to remove them this time
and the patch applied cleanly without them.

-- 
 Magnus Hagander
 Me: http://www.hagander.net/
 Work: http://www.redpill-linpro.com/

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] [Bug fix] postmaster always crashes on a debug version of Windows

2012-02-15 Thread MauMau

Hello

I encountered a bug which always causes PostgreSQL to crash on Windows. 
Attached is a patch that fixes it. Please review it and include it in the 
upcoming minor releases of supported versions.


The following is a bug report.


Your name  :MauMau
Your email address :maumau...@gmail.com


System Configuration:
-
 Architecture (example: Intel Pentium)  :
Intel Xeon

 Operating System (example: Linux 2.4.18) :
I found the bug on Windows 2008 R2 Enterprise x64 Edition, but it should 
apply to all versions of Windows.


 PostgreSQL version (example: PostgreSQL 9.1.1):  PostgreSQL 8.3.12
However, the problem should happen on all versions of PostgreSQL.

 Compiler used (example: gcc 3.3.5)  :
Visual Studio 2005 Professional Edition

Please enter a FULL description of your problem:

On a debug version of Windows, PostgreSQL server fails to start. When I run 
"pg_ctl start" on the command prompt, pg_ctl displays "server starting", but 
the PostgreSQL server does not start.


No message is left which tells the cause. pg_ctl does not show any error 
messages on the command prompt. Even when I include 'eventlog' in 
log_destination parameter, no error message is recorded in the application 
log nor the system log of Windows event log.


This problem does not occur on a release version of Windows.


Please describe a way to repeat the problem.   Please try to provide a
concise reproducible example, if at all possible:
--
On a debug version of Windows, do the following:

1. Run initdb. initdb's option is not relevant.
2. Set logging_collector to on in postgresql.conf.
3. Run "pg_ctl start" on the command prompt.

The problem does not happen when logging_collector is off.


If you know how this problem might be fixed, list the solution below:
-
[Cause]
postmaster crashes in the following CloseHandle() call, which is at line 591 
in src/backend/postmaster/syslogger.c (in case of PostgreSQL 9.1.)


/* Now we are done with the write end of the pipe. */
CloseHandle(syslogPipe[1]);

The CloseHandle() crashes because it receives an already closed handle. 
According the following MSDN article, CloseHandle() causes a crash under a 
debugger. Though I'm not exactly sure, I guess running on the debug version 
of Windows is equivalent to running under a debugger.


http://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx

[Excerpt]
If the application is running under a debugger, the function will throw an 
exception if it receives either a handle value that is not valid or a 
pseudo-handle value. This can happen if you close a handle twice, or if you 
call CloseHandle on a handle returned by the FindFirstFile function instead 
of calling the FindClose function.



Then, where is the handle closed? It was closed in close() at three lines 
above. The pipe handle is associated with a file descriptor by 
_open_osfhandle(). Calling close() for the file descriptor also closes the 
underlying handle. See the MSDN article:


http://msdn.microsoft.com/en-us/library/bdts1c9x(v=vs.80).aspx

[Excerpt]
To close a file opened with _open_osfhandle, call _close. The underlying 
handle is also closed by a call to _close, so it is not necessary to call 
the Win32 function CloseHandle on the original handle.



[Fix]
Remove the unnecessary CloseHandle() call. I sought similar extra closing by 
checking places where _open_osfhandle() or _get_osfhandle() is used, but 
there was nothing elsewhere.


I attached a patch against the master HEAD. Is it OK with a patch that has 
CR-LF line endings?


Regards


postmaster_crash_on_debug_windows.patch
Description: Binary data

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers