Thread: byteain bug(?)

byteain bug(?)

From
"Joe Conway"
Date:
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




Re: byteain bug(?)

From
Bruce Momjian
Date:
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,
Pennsylvania19026
 


Re: byteain bug(?)

From
Tom Lane
Date:
"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


Re: byteain bug(?)

From
"Joe Conway"
Date:
>
> 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




Re: byteain bug(?)

From
Bruce Momjian
Date:
> > > 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,
Pennsylvania19026
 


Re: byteain bug(?)

From
"Joe Conway"
Date:
> > > > 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





Re: byteain bug(?)

From
Bruce Momjian
Date:
> > > > > 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,
Pennsylvania19026