byteain bug(?)
I just noticed some unexpected behavior from byteain:
test=# select '\\009'::bytea;
?column?
----------
\011
(1 row)
test=# select '\\444'::bytea;
?column?
----------
$
(1 row)
test=# select '\\999'::bytea;
?column?
----------
\221
(1 row)
The reason is the following code in byteain:
else if (!isdigit((unsigned char) *tp++) ||
!isdigit((unsigned char) *tp++) ||
!isdigit((unsigned char) *tp++))
elog(ERROR, "Bad input string for type bytea");
It checks for a '\' followed by three digits, but does not attempt to
enforce that the three digits actually produce a valid octal number. Anyone
object to me fixing this?
-- Joe
Should be fixed. I noticed this myself. Should we require three digits?
I just noticed some unexpected behavior from byteain:
test=# select '\\009'::bytea;
?column?
----------
\011
(1 row)test=# select '\\444'::bytea;
?column?
----------
$
(1 row)test=# select '\\999'::bytea;
?column?
----------
\221
(1 row)The reason is the following code in byteain:
else if (!isdigit((unsigned char) *tp++) ||
!isdigit((unsigned char) *tp++) ||
!isdigit((unsigned char) *tp++))
elog(ERROR, "Bad input string for type bytea");It checks for a '\' followed by three digits, but does not attempt to
enforce that the three digits actually produce a valid octal number. Anyone
object to me fixing this?-- Joe
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
"Joe Conway" <joseph.conway@home.com> writes:
It checks for a '\' followed by three digits, but does not attempt to
enforce that the three digits actually produce a valid octal number. Anyone
object to me fixing this?
Clearly a bug. Fix away...
regards, tom lane
Should be fixed. I noticed this myself. Should we require three digits?
I just noticed some unexpected behavior from byteain:
test=# select '\\009'::bytea;
?column?
----------
\011
(1 row)
<snip>
It checks for a '\' followed by three digits, but does not attempt to
enforce that the three digits actually produce a valid octal number.
Anyone
object to me fixing this?
Based on the thread this morning on patches, I was thinking we should allow
'\\', '\0', or '\###' where ### is any valid octal. At least that's what I
was going to have decode(bytea, 'escape') handle.
-- Joe
It checks for a '\' followed by three digits, but does not attempt to
enforce that the three digits actually produce a valid octal number.Anyone
object to me fixing this?
Based on the thread this morning on patches, I was thinking we should allow
'\\', '\0', or '\###' where ### is any valid octal. At least that's what I
was going to have decode(bytea, 'escape') handle.
Yep, it is way too open right now.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
It checks for a '\' followed by three digits, but does not attempt
to
enforce that the three digits actually produce a valid octal number.
Anyone
object to me fixing this?
Based on the thread this morning on patches, I was thinking we should
allow
'\\', '\0', or '\###' where ### is any valid octal. At least that's what
I
was going to have decode(bytea, 'escape') handle.
Yep, it is way too open right now.
On further thought, I think I'll have to not allow '\0' and require '\000'
instead. Otherwise, how should the following be interpreted:
'\0123'
Is that '\0' followed by the literals '1', '2', and '3'? Or is it '\012'
followed by the literal '3'?
So, I'll go with '\\' or '\###' where ### is any valid octal, for both
byteain and decode(bytea, 'escape').
Comments?
-- Joe
It checks for a '\' followed by three digits, but does not attempt
to
enforce that the three digits actually produce a valid octal number.
Anyone
object to me fixing this?
Based on the thread this morning on patches, I was thinking we should
allow
'\\', '\0', or '\###' where ### is any valid octal. At least that's what
I
was going to have decode(bytea, 'escape') handle.
Yep, it is way too open right now.
On further thought, I think I'll have to not allow '\0' and require '\000'
instead. Otherwise, how should the following be interpreted:'\0123'
Is that '\0' followed by the literals '1', '2', and '3'? Or is it '\012'
followed by the literal '3'?So, I'll go with '\\' or '\###' where ### is any valid octal, for both
byteain and decode(bytea, 'escape').
Very good point.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026