From 9740d308328ab83a3213ee86aa2db37d509a581d Mon Sep 17 00:00:00 2001 From: Mathieu Parent Date: Mon, 15 Oct 2012 17:46:15 +0200 Subject: [PATCH] Read more byte on Zip read (for thumbnails) See https://bugs.freedesktop.org/show_bug.cgi?id=56007 Change-Id: I26159732cfbf2a539ee491a5129cde0d12abefc4 --- shell/source/win32/zipfile/zipfile.cxx | 55 ++++++++++++++++++-------------- 1 files changed, 31 insertions(+), 24 deletions(-) diff --git a/shell/source/win32/zipfile/zipfile.cxx b/shell/source/win32/zipfile/zipfile.cxx index fb7dc88..b1baa0c 100644 --- a/shell/source/win32/zipfile/zipfile.cxx +++ b/shell/source/win32/zipfile/zipfile.cxx @@ -115,18 +115,35 @@ static unsigned char readByte(StreamInterface *stream) static unsigned short readShort(StreamInterface *stream) { - unsigned short p0 = (unsigned short)readByte(stream); - unsigned short p1 = (unsigned short)readByte(stream); - return (unsigned short)(p0|(p1<<8)); + if (!stream || stream->stell() == -1) + throw IOException(-1); + unsigned short tmpBuf; + unsigned long numBytesRead = stream->sread(&tmpBuf, 2); + if (numBytesRead != 2) + throw IOException(-1); + return tmpBuf; } static unsigned readInt(StreamInterface *stream) { - unsigned p0 = (unsigned)readByte(stream); - unsigned p1 = (unsigned)readByte(stream); - unsigned p2 = (unsigned)readByte(stream); - unsigned p3 = (unsigned)readByte(stream); - return (unsigned)(p0|(p1<<8)|(p2<<16)|(p3<<24)); + if (!stream || stream->stell() == -1) + throw IOException(-1); + unsigned tmpBuf; + unsigned long numBytesRead = stream->sread(&tmpBuf, 4); + if (numBytesRead != 2) + throw IOException(-1); + return tmpBuf; +} + +static std::string readString(StreamInterface *stream, unsigned long size) +{ + if (!stream || stream->stell() == -1) + throw IOException(-1); + unsigned char *tmpBuf(size); + unsigned long numBytesRead = stream->sread(&tmpBuf[0], size); + if (numBytesRead != size) + throw IOException(-1); + return string(tmpBuf, size); } static bool readCentralDirectoryEnd(StreamInterface *stream, CentralDirectoryEnd &end) @@ -144,9 +161,7 @@ static bool readCentralDirectoryEnd(StreamInterface *stream, CentralDirectoryEnd end.cdir_size = readInt(stream); end.cdir_offset = readInt(stream); end.comment_size = readShort(stream); - end.comment.clear(); - for (unsigned short i = 0; i < end.comment_size; i++) - end.comment.append(1,(char)readByte(stream)); + end.comment.assign(readString(stream, end.comment_size)) } catch (...) { @@ -180,15 +195,9 @@ static bool readCentralDirectoryEntry(StreamInterface *stream, CentralDirectoryE entry.external_attr = readInt(stream); entry.offset = readInt(stream); unsigned short i = 0; - entry.filename.clear(); - for (i=0; i < entry.filename_size; i++) - entry.filename.append(1,(char)readByte(stream)); - entry.extra_field.clear(); - for (i=0; i < entry.extra_field_size; i++) - entry.extra_field.append(1,(char)readByte(stream)); - entry.file_comment.clear(); - for (i=0; i < entry.file_comment_size; i++) - entry.file_comment.append(1,(char)readByte(stream)); + entry.filename.assign(readString(stream, entry.filename_size)) + entry.extra_field.assign(readString(stream, entry.extra_field_size)) + entry.file_comment.assign(readString(stream, entry.file_comment_size)) } catch (...) { @@ -216,12 +225,10 @@ static bool readLocalFileHeader(StreamInterface *stream, LocalFileHeader &header header.filename_size = readShort(stream); header.extra_field_size = readShort(stream); unsigned short i = 0; + header.filename.assign(readString(stream, header.filename_size)) header.filename.clear(); - for (i=0; i < header.filename_size; i++) - header.filename.append(1,(char)readByte(stream)); header.extra_field.clear(); - for (i=0; i < header.extra_field_size; i++) - header.extra_field.append(1,(char)readByte(stream)); + header.extra_field.assign(readString(stream, header.extra_field_size)) } catch (...) { -- 1.7.2.5