Commit e04fa58d authored by Tom Lane's avatar Tom Lane

Fix unportable usages of tolower(). On signed-char machines, it is necessary

to explicitly cast the output back to char before comparing it to a char
value, else we get the wrong result for high-bit-set characters.  Found by
Rolf Jentsch.  Also, fix several places where <ctype.h> functions were being
called without casting the argument to unsigned char; this is likewise
unportable, but we keep making that mistake :-(.  These found by buildfarm
member salamander, which I will desperately miss if it ever goes belly-up.
parent 3bf822c4
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
* Copyright (c) 1996-2008, PostgreSQL Global Development Group * Copyright (c) 1996-2008, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/like_match.c,v 1.20 2008/01/01 19:45:52 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/like_match.c,v 1.21 2008/03/01 03:26:34 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
*/ */
#ifdef MATCH_LOWER #ifdef MATCH_LOWER
#define TCHAR(t) tolower((t)) #define TCHAR(t) ((char) tolower((unsigned char) (t)))
#else #else
#define TCHAR(t) (t) #define TCHAR(t) (t)
#endif #endif
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.76 2008/02/07 11:09:12 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.77 2008/03/01 03:26:34 tgl Exp $ */
/* /*
* The aim is to get a simpler inteface to the database routines. * The aim is to get a simpler inteface to the database routines.
...@@ -122,13 +122,15 @@ next_insert(char *text, int pos, bool questionmarks) ...@@ -122,13 +122,15 @@ next_insert(char *text, int pos, bool questionmarks)
string = string ? false : true; string = string ? false : true;
else if (!string) else if (!string)
{ {
if (text[p] == '$' && isdigit(text[p + 1])) if (text[p] == '$' && isdigit((unsigned char) text[p + 1]))
{ {
/* this can be either a dollar quote or a variable */ /* this can be either a dollar quote or a variable */
int i; int i;
for (i = p + 1; isdigit(text[i]); i++); for (i = p + 1; isdigit((unsigned char) text[i]); i++)
if (!isalpha(text[i]) && isascii(text[i]) && text[i] != '_') /* empty loop body */ ;
if (!isalpha((unsigned char) text[i]) &&
isascii((unsigned char) text[i]) && text[i] != '_')
/* not dollar delimited quote */ /* not dollar delimited quote */
return p; return p;
} }
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.361 2008/02/15 22:17:06 tgl Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.362 2008/03/01 03:26:35 tgl Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
...@@ -5847,7 +5847,7 @@ prepared_name: name { ...@@ -5847,7 +5847,7 @@ prepared_name: name {
int i; int i;
for (i = 0; i< strlen($1); i++) for (i = 0; i< strlen($1); i++)
$1[i] = tolower($1[i]); $1[i] = tolower((unsigned char) $1[i]);
$$ = make3_str(make_str("\""), $1, make_str("\"")); $$ = make3_str(make_str("\""), $1, make_str("\""));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment