Re: Syslogger tries to write to /dev/null on Windows

From: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: PostgreSQL Bugs <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: Syslogger tries to write to /dev/null on Windows
Date: 2010-04-01 19:54:13
Message-ID: 4BB4F9E5.9030805@enterprisedb.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Tom Lane wrote:
> Hmm. I agree with your proposed change, but it seems to me that there
> is still another mystery here: why does the mistaken open() argument
> lead to a crash? Per the second comment, this code is supposed to keep
> working even if the open() fails. If it fails because of that, we have
> robustness problems everywhere not only on Windows --- consider ENFILE
> or some such.

Hmm, good question.

The open() fails and returns a return code as you would expect. But the
dup2() call crashes when passed an invalid file descriptor, I just
tested that with a small test program on Windows.

Googling around, this seems to be because of a feature called Parameter
Validation: http://msdn.microsoft.com/en-us/library/ksazx244.aspx

Following the example there to set a custom Invalid Parameter Handler
Routine makes dup2() not crash on an invalid file handle. We could do
that in PostgreSQL, setting a handler that reports a warning in the log
and continues. Or we could just be more careful when passing parameters
to system functions; this is the first time we hear about this so it
doesn't seem to be a very widespread issue. In this case we should do this:

*** a/src/backend/postmaster/syslogger.c
--- b/src/backend/postmaster/syslogger.c
***************
*** 194,202 ****
*/
close(fileno(stdout));
close(fileno(stderr));
! dup2(fd, fileno(stdout));
! dup2(fd, fileno(stderr));
! close(fd);
}

/*
--- 194,205 ----
*/
close(fileno(stdout));
close(fileno(stderr));
! if (fd != -1)
! {
! dup2(fd, fileno(stdout));
! dup2(fd, fileno(stderr));
! close(fd);
! }
}

/*

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2010-04-01 20:18:54 Re: Syslogger tries to write to /dev/null on Windows
Previous Message Kevin Grittner 2010-04-01 17:08:36 Re: dividing money by money