Make macaddr_in reject trailing garbage (except whitespace).
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Oct 2002 15:39:17 +0000 (15:39 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Oct 2002 15:39:17 +0000 (15:39 +0000)
Per gripe from Patrick Welche, 13-Oct-2002.

src/backend/utils/adt/mac.c

index e307542bd86a0ce4b37a302f733de8765bebfd4d..ba15342739d079886d0e8f192d751eca4b8c13a1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     PostgreSQL type definitions for MAC addresses.
  *
- *     $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.26 2002/09/04 20:31:28 momjian Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.27 2002/10/13 15:39:17 tgl Exp $
  */
 
 #include "postgres.h"
@@ -35,19 +35,28 @@ macaddr_in(PG_FUNCTION_ARGS)
                                d,
                                e,
                                f;
+       char            junk[2];
        int                     count;
 
-       count = sscanf(str, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
+       /* %1s matches iff there is trailing non-whitespace garbage */
+
+       count = sscanf(str, "%x:%x:%x:%x:%x:%x%1s",
+                                  &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
-               count = sscanf(str, "%x-%x-%x-%x-%x-%x", &a, &b, &c, &d, &e, &f);
+               count = sscanf(str, "%x-%x-%x-%x-%x-%x%1s",
+                                          &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
-               count = sscanf(str, "%2x%2x%2x:%2x%2x%2x", &a, &b, &c, &d, &e, &f);
+               count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%1s",
+                                          &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
-               count = sscanf(str, "%2x%2x%2x-%2x%2x%2x", &a, &b, &c, &d, &e, &f);
+               count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%1s",
+                                          &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
-               count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x", &a, &b, &c, &d, &e, &f);
+               count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x%1s",
+                                          &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
-               count = sscanf(str, "%2x%2x%2x%2x%2x%2x", &a, &b, &c, &d, &e, &f);
+               count = sscanf(str, "%2x%2x%2x%2x%2x%2x%1s",
+                                          &a, &b, &c, &d, &e, &f, junk);
        if (count != 6)
                elog(ERROR, "macaddr_in: error in parsing \"%s\"", str);
 
@@ -122,11 +131,11 @@ text_macaddr(PG_FUNCTION_ARGS)
 {
        text       *addr = PG_GETARG_TEXT_P(0);
        Datum           result;
-       char            str[18];
+       char            str[100];
        int                     len;
 
        len = (VARSIZE(addr) - VARHDRSZ);
-       if (len >= 18)
+       if (len >= sizeof(str))
                elog(ERROR, "Text is too long to convert to MAC address");
 
        memcpy(str, VARDATA(addr), len);