Memory-Mapped files and DWA compression

darby johnston <[email protected]> Tue, 30 Oct 2018 16:11:37 +0000 (UTC)
Newsgroups gmane.comp.video.openexr.devel
Message-ID <[email protected]>
------=_Part_19170739_1358598961.1540915897885
Content-Type: multipart/alternative; 
	boundary="----=_Part_19170734_1463155478.1540915897711"

------=_Part_19170734_1463155478.1540915897711
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi all,
I was implementing memory-mapped loading of OpenEXR images for my viewer an=
d noticed a crash when loading DWA compressed files. Taking a look at the c=
ode it seems that DwaCompressor::uncompress() is writing to the const char =
* data that is passed to it:
int=20
DwaCompressor::uncompress
=C2=A0=C2=A0=C2=A0 (const char *inPtr,
=C2=A0=C2=A0=C2=A0=C2=A0 int inSize,
=C2=A0=C2=A0=C2=A0=C2=A0 IMATH_NAMESPACE::Box2i range,
=C2=A0=C2=A0=C2=A0=C2=A0 const char *&outPtr)
{=C2=A0=C2=A0=C2=A0 ...
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Int64=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 *dst =3D=C2=A0 (((Int64 *)inPtr) + i);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 const char *src =3D (char *)(((I=
nt64 *)inPtr) + i);

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Xdr::read<CharPtrIO> (src, *dst)=
;=C2=A0=C2=A0=C2=A0 ...
}
When the passed data is memory-mapped as read-only this causes a memory acc=
ess violation on Windows. Copying the data to a temporary buffer and then d=
oing the Xdr conversion fixes the issue; the performance difference should =
be negligible since this is only for some header data, probably less than 1=
00 bytes. If this seems like an OK change I've attached a patch or can also=
 submit a git pull request.

Thanks, Darby

------=_Part_19170734_1463155478.1540915897711
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<html><head></head><body><div class=3D"ydp72254857yahoo-style-wrap" style=
=3D"font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:13px=
;"><div id=3D"ydp72254857yiv0547984884"><div><div>Hi all,</div><div><br></d=
iv><div>I was implementing memory-mapped loading of OpenEXR images for my v=
iewer and noticed a crash when loading DWA compressed files. Taking a look =
at the code it seems that DwaCompressor::uncompress() is writing to the con=
st char * data that is passed to it:</div><div><span><br>int <br>DwaCompres=
sor::uncompress<br>&nbsp;&nbsp;&nbsp; (const char *inPtr,<br>&nbsp;&nbsp;&n=
bsp;&nbsp; int inSize,<br>&nbsp;&nbsp;&nbsp;&nbsp; IMATH_NAMESPACE::Box2i r=
ange,<br>&nbsp;&nbsp;&nbsp;&nbsp; const char *&amp;outPtr)<br></span><div><=
span>{</span></div><div><span>&nbsp;&nbsp;&nbsp; ...<br></span></div><div><=
span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>Int64&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp; *dst =3D&nbsp; (((Int64 *)inPtr) + i);<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *src =3D (char *)(((Int64 *)inPtr)=
 + i);<br><br></span></span><div><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp; Xdr::read&lt;CharPtrIO&gt; (src, *dst);</span></span></div><di=
v>&nbsp;&nbsp;&nbsp; ...<br></div></div><div><div>}</div><div><br></div><di=
v>When the passed data is memory-mapped as read-only this causes a memory a=
ccess violation on Windows. Copying the data to a temporary buffer and then=
 doing the Xdr conversion fixes the issue; the performance difference shoul=
d be negligible since this is only for some header data, probably less than=
 100 bytes. If this seems like an OK change I've attached a patch or can al=
so submit a git pull request.</div><div><br></div><div><br></div><div>Thank=
s, Darby</div><div><br></div><span></span></div></div><div class=3D"ydp7225=
4857yiv0547984884ydpde2b8192yahoo-style-wrap" style=3D"font-family:Helvetic=
a Neue, Helvetica, Arial, sans-serif;font-size:13px;"></div></div></div></d=
iv></body></html>
------=_Part_19170734_1463155478.1540915897711--

------=_Part_19170739_1358598961.1540915897885
Content-Type: text/x-patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ImfDwaCompressor.patch"
Content-ID: <[email protected]>

LS0tIEltZkR3YUNvbXByZXNzb3IuY3BwCTIwMTgtMTAtMjkgMTQ6Mjg6NTIuNzU5MzU5OTg2IC0w
NzAwCisrKyAuLi8uLi8uLi9kanYtZ2l0LXRoaXJkLXBhcnR5LURlYnVnL09wZW5FWFItcHJlZml4
L3NyYy9PcGVuRVhSL0lsbUltZi9JbWZEd2FDb21wcmVzc29yLmNwcAkyMDE4LTEwLTI5IDExOjU2
OjA4LjAwMDAwMDAwMCAtMDcwMApAQCAtMjM1MSwxMCArMjM1MSwxMiBAQAogICAgIC8vIEZsaXAg
dGhlIGNvdW50ZXJzIGZyb20gWERSIHRvIE5BVElWRQogICAgIC8vCiAKKyAgICBJbnQ2NCBjb3Vu
dGVyQnVmW05VTV9TSVpFU19TSU5HTEVdOworICAgIG1lbWNweShjb3VudGVyQnVmLCBpblB0ciwg
TlVNX1NJWkVTX1NJTkdMRSAqIHNpemVvZihJbnQ2NCkpOwogICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgTlVNX1NJWkVTX1NJTkdMRTsgKytpKQogICAgIHsKLSAgICAgICAgSW50NjQgICAgICAqZHN0
ID0gICgoKEludDY0ICopaW5QdHIpICsgaSk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnNyYyA9IChj
aGFyICopKCgoSW50NjQgKilpblB0cikgKyBpKTsKKyAgICAgICAgSW50NjQgICAgICAqZHN0ID0g
Y291bnRlckJ1ZiArIGk7CisgICAgICAgIGNvbnN0IGNoYXIgKnNyYyA9IChjaGFyICopKGNvdW50
ZXJCdWYgKyBpKTsKIAogICAgICAgICBYZHI6OnJlYWQ8Q2hhclB0cklPPiAoc3JjLCAqZHN0KTsK
ICAgICB9CkBAIC0yMzYzLDIxICsyMzY1LDE5IEBACiAgICAgLy8gVW53aW5kIGFsbCB0aGUgY291
bnRlciBpbmZvCiAgICAgLy8KIAotICAgIGNvbnN0IEludDY0ICppblB0cjY0ID0gKGNvbnN0IElu
dDY0KikgaW5QdHI7Ci0KLSAgICBJbnQ2NCB2ZXJzaW9uICAgICAgICAgICAgICAgICAgPSAqKGlu
UHRyNjQgKyBWRVJTSU9OKTsKLSAgICBJbnQ2NCB1bmtub3duVW5jb21wcmVzc2VkU2l6ZSAgPSAq
KGluUHRyNjQgKyBVTktOT1dOX1VOQ09NUFJFU1NFRF9TSVpFKTsKLSAgICBJbnQ2NCB1bmtub3du
Q29tcHJlc3NlZFNpemUgICAgPSAqKGluUHRyNjQgKyBVTktOT1dOX0NPTVBSRVNTRURfU0laRSk7
Ci0gICAgSW50NjQgYWNDb21wcmVzc2VkU2l6ZSAgICAgICAgID0gKihpblB0cjY0ICsgQUNfQ09N
UFJFU1NFRF9TSVpFKTsKLSAgICBJbnQ2NCBkY0NvbXByZXNzZWRTaXplICAgICAgICAgPSAqKGlu
UHRyNjQgKyBEQ19DT01QUkVTU0VEX1NJWkUpOwotICAgIEludDY0IHJsZUNvbXByZXNzZWRTaXpl
ICAgICAgICA9ICooaW5QdHI2NCArIFJMRV9DT01QUkVTU0VEX1NJWkUpOwotICAgIEludDY0IHJs
ZVVuY29tcHJlc3NlZFNpemUgICAgICA9ICooaW5QdHI2NCArIFJMRV9VTkNPTVBSRVNTRURfU0la
RSk7Ci0gICAgSW50NjQgcmxlUmF3U2l6ZSAgICAgICAgICAgICAgID0gKihpblB0cjY0ICsgUkxF
X1JBV19TSVpFKTsKKyAgICBJbnQ2NCB2ZXJzaW9uICAgICAgICAgICAgICAgICAgPSAqKGNvdW50
ZXJCdWYgKyBWRVJTSU9OKTsKKyAgICBJbnQ2NCB1bmtub3duVW5jb21wcmVzc2VkU2l6ZSAgPSAq
KGNvdW50ZXJCdWYgKyBVTktOT1dOX1VOQ09NUFJFU1NFRF9TSVpFKTsKKyAgICBJbnQ2NCB1bmtu
b3duQ29tcHJlc3NlZFNpemUgICAgPSAqKGNvdW50ZXJCdWYgKyBVTktOT1dOX0NPTVBSRVNTRURf
U0laRSk7CisgICAgSW50NjQgYWNDb21wcmVzc2VkU2l6ZSAgICAgICAgID0gKihjb3VudGVyQnVm
ICsgQUNfQ09NUFJFU1NFRF9TSVpFKTsKKyAgICBJbnQ2NCBkY0NvbXByZXNzZWRTaXplICAgICAg
ICAgPSAqKGNvdW50ZXJCdWYgKyBEQ19DT01QUkVTU0VEX1NJWkUpOworICAgIEludDY0IHJsZUNv
bXByZXNzZWRTaXplICAgICAgICA9ICooY291bnRlckJ1ZiArIFJMRV9DT01QUkVTU0VEX1NJWkUp
OworICAgIEludDY0IHJsZVVuY29tcHJlc3NlZFNpemUgICAgICA9ICooY291bnRlckJ1ZiArIFJM
RV9VTkNPTVBSRVNTRURfU0laRSk7CisgICAgSW50NjQgcmxlUmF3U2l6ZSAgICAgICAgICAgICAg
ID0gKihjb3VudGVyQnVmICsgUkxFX1JBV19TSVpFKTsKICAKLSAgICBJbnQ2NCB0b3RhbEFjVW5j
b21wcmVzc2VkQ291bnQgPSAqKGluUHRyNjQgKyBBQ19VTkNPTVBSRVNTRURfQ09VTlQpOyAKLSAg
ICBJbnQ2NCB0b3RhbERjVW5jb21wcmVzc2VkQ291bnQgPSAqKGluUHRyNjQgKyBEQ19VTkNPTVBS
RVNTRURfQ09VTlQpOyAKKyAgICBJbnQ2NCB0b3RhbEFjVW5jb21wcmVzc2VkQ291bnQgPSAqKGNv
dW50ZXJCdWYgKyBBQ19VTkNPTVBSRVNTRURfQ09VTlQpOworICAgIEludDY0IHRvdGFsRGNVbmNv
bXByZXNzZWRDb3VudCA9ICooY291bnRlckJ1ZiArIERDX1VOQ09NUFJFU1NFRF9DT1VOVCk7CiAK
LSAgICBJbnQ2NCBhY0NvbXByZXNzaW9uICAgICAgICAgICAgPSAqKGluUHRyNjQgKyBBQ19DT01Q
UkVTU0lPTik7IAorICAgIEludDY0IGFjQ29tcHJlc3Npb24gICAgICAgICAgICA9ICooY291bnRl
ckJ1ZiArIEFDX0NPTVBSRVNTSU9OKTsKIAogICAgIEludDY0IGNvbXByZXNzZWRTaXplICAgICAg
ICAgICA9IHVua25vd25Db21wcmVzc2VkU2l6ZSArIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFjQ29tcHJlc3NlZFNpemUgKwo=

------=_Part_19170739_1358598961.1540915897885
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Openexr-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/openexr-devel

------=_Part_19170739_1358598961.1540915897885--