Make macaddr_in reject trailing garbage (except whitespace).
authorTom Lane
Sun, 13 Oct 2002 15:39:17 +0000 (15:39 +0000)
committerTom Lane
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);