Attached is a better patch, basicly every occurence of
PG_RETURN_POINTER(0) resulted in a segfault, text input like '1.2.3',
'.' or '' would still fail with the first patch.
The behavior here is comparable to what happens when you use
"'foo'::integer"
--
Herwin Weststrate
Quarantainenet BV
--- pgsql-asn1oid-0.0.20100818/asn1oid.c 2010-08-18 17:24:28.000000000 +0200
+++ pgsql-asn1oid-0.0.20100818.patched/asn1oid.c 2016-04-29 08:55:12.952143426 +0200
@@ -101,21 +101,36 @@
tmp[i] += 9;
break;
case '.':
- if(c == str)
- PG_RETURN_POINTER(0);
+ if(c == str) {
+ if (c[1]) {
+ /* Skip over first dot */
+ break;
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type asn1oid: \"%s\"",
+ str)));
+ }
++i;
if(i >= 64)
- PG_RETURN_POINTER(0);
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type asn1oid: \"%s\"",
+ str)));
tmp[i] = 0;
break;
default:
- PG_RETURN_POINTER(0);
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type asn1oid: \"%s\"",
+ str)));
}
}
- if(c == str)
- PG_RETURN_POINTER(0);
- if(c[-1] == '.')
- PG_RETURN_POINTER(0);
+ if(c == str || c[-1] == '.')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type asn1oid: \"%s\"",
+ str)));
++i;