1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-19 23:22:23 +03:00

Try to log current the query string when a backend crashes.

To avoid minimize risk inside the postmaster, we subject this feature
to a number of significant limitations.  We very much wish to avoid
doing any complex processing inside the postmaster, due to the
posssibility that the crashed backend has completely corrupted shared
memory.  To that end, no encoding conversion is done; instead, we just
replace anything that doesn't look like an ASCII character with a
question mark.  We limit the amount of data copied to 1024 characters,
and carefully sanity check the source of that data.  While these
restrictions would doubtless be unacceptable in a general-purpose
logging facility, even this limited facility seems like an improvement
over the status quo ante.

Marti Raudsepp, reviewed by PDXPUG and myself
This commit is contained in:
Robert Haas
2011-10-21 13:26:40 -04:00
parent 980261929f
commit c8e8b5a6e2
5 changed files with 125 additions and 7 deletions

View File

@@ -158,3 +158,37 @@ to_ascii_default(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(encode_to_ascii(data, enc));
}
/* ----------
* "Escape" a string in unknown encoding to a valid ASCII string.
* Replace non-ASCII bytes with '?'
* This must not trigger ereport(ERROR), as it is called from postmaster.
*
* Unlike C strncpy(), the result is always terminated with exactly one null
* byte.
* ----------
*/
void
ascii_safe_strncpy(char *dest, const char *src, int len)
{
int i;
for (i = 0; i < (len - 1); i++)
{
unsigned char ch = src[i]; /* use unsigned char here to avoid compiler warning */
if (ch == '\0')
break;
/* Keep printable ASCII characters */
if (32 <= ch && ch <= 127)
dest[i] = ch;
/* White-space is also OK */
else if (ch == '\n' || ch == '\r' || ch == '\t')
dest[i] = ch;
/* Everything else is replaced with '?' */
else
dest[i] = '?';
}
dest[i] = '\0';
}