aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Frost <sfrost@snowman.net>2017-03-16 00:13:37 -0400
committerStephen Frost <sfrost@snowman.net>2017-03-16 00:13:37 -0400
commitcccbddeb1483b85f1853a29dc3b6464647b91eee (patch)
treefac5ca3d0a4840364000da701ca405267adfae57 /src
parent7821f7229c6e149046ee0dd8cab57928c4f86a37 (diff)
downloadpostgresql-cccbddeb1483b85f1853a29dc3b6464647b91eee.tar.gz
postgresql-cccbddeb1483b85f1853a29dc3b6464647b91eee.zip
Be more careful about signed vs. unsigned char
The buildfarm has reminded me that not all systems consider char to be signed and we need to be explicit. Adjust the various bits of mac8.c for what we intend, mostly using casts to unsigned char as suggested by Tom, and adjust the tests for valid input accordingly. Explicitly make the hexlookup table signed as it's useful to use -1 there to indicate an invalid value.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/mac8.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/backend/utils/adt/mac8.c b/src/backend/utils/adt/mac8.c
index fe345743aef..c442eae6c10 100644
--- a/src/backend/utils/adt/mac8.c
+++ b/src/backend/utils/adt/mac8.c
@@ -35,9 +35,9 @@
#define lobits(addr) \
((unsigned long)(((addr)->e<<24) | ((addr)->f<<16) | ((addr)->g<<8) | ((addr)->h)))
-static unsigned char hex2_to_uchar(const char *str, const char *ptr);
+static unsigned char hex2_to_uchar(const unsigned char *str, const unsigned char *ptr);
-static const char hexlookup[128] = {
+static const signed char hexlookup[128] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -58,16 +58,16 @@ static const char hexlookup[128] = {
* the entire string, which is used only for error reporting.
*/
static inline unsigned char
-hex2_to_uchar(const char *ptr, const char *str)
+hex2_to_uchar(const unsigned char *ptr, const unsigned char *str)
{
unsigned char ret = 0;
- char lookup;
+ signed char lookup;
/* Handle the first character */
- if (*ptr < 0)
+ if (*ptr > 127)
goto invalid_input;
- lookup = hexlookup[(unsigned char) *ptr];
+ lookup = hexlookup[*ptr];
if (lookup < 0)
goto invalid_input;
@@ -76,10 +76,10 @@ hex2_to_uchar(const char *ptr, const char *str)
/* Move to the second character */
ptr++;
- if (*ptr < 0)
+ if (*ptr > 127)
goto invalid_input;
- lookup = hexlookup[(unsigned char) *ptr];
+ lookup = hexlookup[*ptr];
if (lookup < 0)
goto invalid_input;
@@ -103,8 +103,8 @@ invalid_input:
Datum
macaddr8_in(PG_FUNCTION_ARGS)
{
- const char *str = PG_GETARG_CSTRING(0);
- const char *ptr = str;
+ const unsigned char *str = (unsigned char*) PG_GETARG_CSTRING(0);
+ const unsigned char *ptr = str;
macaddr8 *result;
unsigned char a = 0,
b = 0,
@@ -115,10 +115,10 @@ macaddr8_in(PG_FUNCTION_ARGS)
g = 0,
h = 0;
int count = 0;
- char spacer = '\0';
+ unsigned char spacer = '\0';
/* skip leading spaces */
- while (*ptr && isspace((unsigned char) *ptr))
+ while (*ptr && isspace(*ptr))
ptr++;
/* digits must always come in pairs */
@@ -191,9 +191,9 @@ macaddr8_in(PG_FUNCTION_ARGS)
/* allow trailing whitespace after if we have 6 or 8 bytes */
if (count == 6 || count == 8)
{
- if (isspace((unsigned char) *ptr))
+ if (isspace(*ptr))
{
- while (*++ptr && isspace((unsigned char) *ptr));
+ while (*++ptr && isspace(*ptr));
/* If we found a space and then non-space, it's invalid */
if (*ptr)