OK. Thanks for the clarification. +1

Regards
Prasanta
On 30-Apr-20 4:47 PM, Jayathirth D v wrote:
Hi Prasanta,

Thats why I pointed to JDK-8195841 <https://bugs.openjdk.java.net/browse/JDK-8195841> where PNGImageReader.readNullTerminatedString() is changed. Second argument that is getting passed to readNullTerminatedString() is maximum length including null termination. While reading the string in readNullTerminatedString() we exit as soon as we hit null termination, it is not necessary to read 80 bytes.

So in case where we have read 80 bytes(where we have corrupted PNG) and last byte is not null termination we throw IIOException.

private String readNullTerminatedString(String charset, int maxLen) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int b = 0;
        int count = 0;
        while ((maxLen > count++) && ((b = stream.read()) != 0)) {
            if (b == -1) throw new EOFException();
            baos.write(b);
        }
        if (b != 0) {
            throw new IIOException("Found non null terminated string");
        }
        return new String(baos.toByteArray(), charset);
    }

So overall in case of reader we throw exception when we have longer than 79 bytes strings and we follow same approach in writer as per specification.

Thanks,
Jay

On 30-Apr-2020, at 3:35 PM, Prasanta Sadhukhan <prasanta.sadhuk...@oracle.com <mailto:prasanta.sadhuk...@oracle.com>> wrote:

Hi Jay,

>> we will throw exception in case of reader also

But in the fix, only PNGWriter is changed. I did not see in existing PNGReader any exception being thrown for > 79 bytes. I see in reader, we have

private void parse_iCCP_chunk(int chunkLength) throws IOException {
        String keyword = readNullTerminatedString("ISO-8859-1", 80);
        int compressedProfileLength = chunkLength - keyword.length() - 2;
        if (compressedProfileLength <= 0) {
            throw new IIOException("iCCP chunk length is not proper");
        }

so chunkLength can be say, 100, keyWord.lenth = 79 so compressedProfileLength = 100-79-2=19 so we will not throw IOException. Am I missing something?

Regards
Prasanta

On 30-Apr-20 3:23 PM, Jayathirth D v wrote:
Hi Prasanta,

I didnt say reader will decode more than 79 bytes but user might expect more than 79 bytes since we allowed more than 79 bytes write. While reading non-standard PNG chunks(having greater than 79 bytes null terminated string) we will throw exception in case of reader also. Its a stream, we will not know the length and we rely completely on null termination and we expect it to be spec complaint and not more than 79 bytes.

Thanks,
Jay

On 30-Apr-2020, at 2:51 PM, Prasanta Sadhukhan <prasanta.sadhuk...@oracle.com <mailto:prasanta.sadhuk...@oracle.com>> wrote:

Hi Jay,

But why reader will read more than 79 bytes from the chunk..It should also limit it's reading to 1st 79 bytes (if the chunks we get from non-oracle non-standard PNG writer is more than 79bytes) as per spec, no?

Regards
Prasanta
On 30-Apr-20 2:01 PM, Jayathirth D v wrote:
Hi Prasanta,

Thanks for the review.
If we consume only 79 bytes and continue writing the image, it will lead to unexpected behaviour when user tries to read the image expecting longer than 79 string data. Our reader is also tightly spec compliant for null terminated strings after JDK-8195841 <https://bugs.openjdk.java.net/browse/JDK-8195841> and JDK-8191023 <https://bugs.openjdk.java.net/browse/JDK-8191023>. Its better to be spec compliant than leaving things open for interpretation.

Regards,
Jay


On 29-Apr-2020, at 1:22 PM, Prasanta Sadhukhan <prasanta.sadhuk...@oracle.com <mailto:prasanta.sadhuk...@oracle.com>> wrote:

Hi Jay,

Looks good to me . Although I have a question which is, instead of throwing Exception, can we proceed with 1st 79 bytes of these chunks and continue?

Regards
Prasanta
On 27-Apr-20 10:51 PM, Philip Race wrote:
I reviewed http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html
and I think you covered all the cases.

I also reviewed the reader and it seems we already check only up to 80 chars there.

I note we assume the same max length of 80 for the language tag for iTxt. The spec. doesn't specify a limit but I think 80 is more than generous here.

+1

-phil.

On 4/27/20, 9:59 AM, Jayathirth D v wrote:
Hello All,

Please review the following fix for JDK 15:

Bug : https://bugs.openjdk.java.net/browse/JDK-8242557
Webrev : http://cr.openjdk.java.net/~jdv/8242557/webrev.00/ <http://cr.openjdk.java.net/%7Ejdv/8242557/webrev.00/>

Issue : PNG specification restricts length of strings in some chunks to 79(http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html ) excluding null termination. But our writer implementation has no such check. Solution : Add checks in different chunks where there must be restrictions.

Thanks,
Jay



Reply via email to