|
1 | 1 | /* |
2 | 2 | *PostgreSQL type definitions for MAC addresses. |
3 | 3 | * |
4 | | - *$Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.26 2002/09/04 20:31:28 momjian Exp $ |
| 4 | + *$Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.27 2002/10/13 15:39:17 tgl Exp $ |
5 | 5 | */ |
6 | 6 |
|
7 | 7 | #include"postgres.h" |
@@ -35,19 +35,28 @@ macaddr_in(PG_FUNCTION_ARGS) |
35 | 35 | d, |
36 | 36 | e, |
37 | 37 | f; |
| 38 | +charjunk[2]; |
38 | 39 | intcount; |
39 | 40 |
|
40 | | -count=sscanf(str,"%x:%x:%x:%x:%x:%x",&a,&b,&c,&d,&e,&f); |
| 41 | +/* %1s matches iff there is trailing non-whitespace garbage */ |
| 42 | + |
| 43 | +count=sscanf(str,"%x:%x:%x:%x:%x:%x%1s", |
| 44 | +&a,&b,&c,&d,&e,&f,junk); |
41 | 45 | if (count!=6) |
42 | | -count=sscanf(str,"%x-%x-%x-%x-%x-%x",&a,&b,&c,&d,&e,&f); |
| 46 | +count=sscanf(str,"%x-%x-%x-%x-%x-%x%1s", |
| 47 | +&a,&b,&c,&d,&e,&f,junk); |
43 | 48 | if (count!=6) |
44 | | -count=sscanf(str,"%2x%2x%2x:%2x%2x%2x",&a,&b,&c,&d,&e,&f); |
| 49 | +count=sscanf(str,"%2x%2x%2x:%2x%2x%2x%1s", |
| 50 | +&a,&b,&c,&d,&e,&f,junk); |
45 | 51 | if (count!=6) |
46 | | -count=sscanf(str,"%2x%2x%2x-%2x%2x%2x",&a,&b,&c,&d,&e,&f); |
| 52 | +count=sscanf(str,"%2x%2x%2x-%2x%2x%2x%1s", |
| 53 | +&a,&b,&c,&d,&e,&f,junk); |
47 | 54 | if (count!=6) |
48 | | -count=sscanf(str,"%2x%2x.%2x%2x.%2x%2x",&a,&b,&c,&d,&e,&f); |
| 55 | +count=sscanf(str,"%2x%2x.%2x%2x.%2x%2x%1s", |
| 56 | +&a,&b,&c,&d,&e,&f,junk); |
49 | 57 | if (count!=6) |
50 | | -count=sscanf(str,"%2x%2x%2x%2x%2x%2x",&a,&b,&c,&d,&e,&f); |
| 58 | +count=sscanf(str,"%2x%2x%2x%2x%2x%2x%1s", |
| 59 | +&a,&b,&c,&d,&e,&f,junk); |
51 | 60 | if (count!=6) |
52 | 61 | elog(ERROR,"macaddr_in: error in parsing \"%s\"",str); |
53 | 62 |
|
@@ -122,11 +131,11 @@ text_macaddr(PG_FUNCTION_ARGS) |
122 | 131 | { |
123 | 132 | text*addr=PG_GETARG_TEXT_P(0); |
124 | 133 | Datumresult; |
125 | | -charstr[18]; |
| 134 | +charstr[100]; |
126 | 135 | intlen; |
127 | 136 |
|
128 | 137 | len= (VARSIZE(addr)-VARHDRSZ); |
129 | | -if (len >=18) |
| 138 | +if (len >=sizeof(str)) |
130 | 139 | elog(ERROR,"Text is too long to convert to MAC address"); |
131 | 140 |
|
132 | 141 | memcpy(str,VARDATA(addr),len); |
|