From 2974bbbee377933872c64c78dd31fcfc1ce0189a Mon Sep 17 00:00:00 2001 From: Joshua Holmer Date: Mon, 4 Apr 2016 11:06:00 -0400 Subject: [PATCH] Fix issue with very small images [ci skip] --- src/deflate/deflate.rs | 7 +++++-- tests/files/small_files.png | Bin 0 -> 3586 bytes tests/interlaced.rs | 2 +- tests/reduction.rs | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/files/small_files.png diff --git a/src/deflate/deflate.rs b/src/deflate/deflate.rs index 14ddf550..312b3a33 100644 --- a/src/deflate/deflate.rs +++ b/src/deflate/deflate.rs @@ -1,5 +1,6 @@ use libz_sys; use libc::c_int; +use std::cmp::max; /// Decompress a data stream using the DEFLATE algorithm pub fn inflate(data: &[u8]) -> Result, String> { @@ -25,10 +26,12 @@ pub fn deflate(data: &[u8], zc: u8, zm: u8, zs: u8, zw: u8) -> Result, S zw as c_int, zm as c_int, zs as c_int); - let mut output = Vec::with_capacity(data.len() / 20); + // Compressed input should be smaller than decompressed, so allocate less than data.len() + // However, it needs a minimum capacity in order to handle very small images + let mut output = Vec::with_capacity(max(1024, data.len() / 20)); loop { match stream.compress_vec(input.as_mut(), output.as_mut()) { - libz_sys::Z_OK => output.reserve(data.len() / 20), + libz_sys::Z_OK => output.reserve(max(1024, data.len() / 20)), libz_sys::Z_STREAM_END => break, c => return Err(format!("Error code on compress: {}", c)), } diff --git a/tests/files/small_files.png b/tests/files/small_files.png new file mode 100644 index 0000000000000000000000000000000000000000..576b88c9af735c88ab6203999c8cab06f0261363 GIT binary patch literal 3586 zcmaJ^c|26@+dsBKS+a&?jCd-`7)vo3+gL^orm>Amj4>F@(iqD~Qc_B`Y*`ZuHMA*{ zY!#ugM3GQ-5*ka$+B=@#)AM`(cze(1bI!T%>%P9<>$@L-w!avL>s|+loITb_083hywb=)evtS$ z`<0JC0|3nOF+wBg4^7s29#8;YfZC@7@0fS(Pi5)zN7@$eZu}KPO z+6_E(c;Y1tqyRtwBitMe+!Fz&f7loc06iti{jxw${+<#+AdUyf*l)d$*YpM8;dB9` z!CUtV$YYv|BGo_1&L zV2L|5nuX*6>e#8R>Bl;CrC6!&7sq(75+R0Ov3*!<>D^74erW@GgEjrao{!+MWSX-Hq2!(L^f z!M2Tz=a?i5<>u63iOKUib4qC&LdhW_0Q0hao!ztTPuT%=5#M=uV@0u@!GLMRg64Jk z9Z7(=kDd-=832-NR}xIsd4SgR!Vv(d`nvm6af&SJjUWJ6Js$TU*P0o`*PJViIw_LPuQbG ztQAx3yYgP;T-DQmiAuUBBln3m-x#$MR#r{avDsnckL*Kg7CICfcZw6UQEF3(q~XYsoI()gJ2hG7IeMKB>E7SeIb+dN}G*n@5AQhM%&JwkfxXw4K%D(=^e1)a_U5T^dn(xHqh~ zrq^?ZHX}1L)yoN@=9uPag4(|szsFB8CWRK?E{aZm?yz1Y z{U}(J{l@9$bSNFx))PFGC>H=Vz|XcM;=lUeB(geYFAWv%V*6Gm)%zB7*cAN5Qu}_z zXGA|#*4Ud#+2hI7`$FjVH^O-mb@~eH3mZmj4z#BDXL?t5l)tC9v@~h-GkciL)A5E~ z+5Wk>nom`I>v7R{EVCPq#vY1oOzTYxXA7j+rY$pXIvYDPoEM!xGHtp~O=(P#x?KX$ z3NBeYvtU{5XT_yirS-vCqyed6se}Wa2NoU3z0m3PY2oS2>1{KHOSmP~CDKy6V#^*0 z#qJ~YBjGf9P)l$CwQ8zxNbhw?eaY)d7as+m+krU?`m%SAC9);bgVSXlNJZC*$hX4S zsblirD?6XQUo6Oak=0-NiS*%f3%udn{WV*yEQMyb*Km&6kJ)AH@R^p8oT99vR||;~ zkki4ZT~Du7@3nuDt(M!ZO={|^KRH;h!c3R4YJc% z+I**wh^rDUnNlY^udssG?f22h?2vvdm?M2cVO6_D4Yjv>SN!F6!2$6I%H0*zWXm(b zm_h4+7?u)IE<<+ZoYaAXI`_1`9WQsFpP?^nbTda?*LPfd3%1S{-CvmPpU!;JG)&1($u7W%5Yx)lKWbO( zudw%4S5FohWsH;FDkNWdyF9A061dPO9T1J`C@9C2p+#j-kYe@FleEIh#m>Dee33!w?fr7J;_b{7a;k8O%v^S@eQ>ne&#dd+Lj>(`5c0uE z$`oOlJ>z0jM*m?ub)AM0$ZDVWuv9A-e+Dnj$c6}i zNAa=dL?ozQ* ziA%^)Qc@6+ub%g6OCBnETqN24Hp2NAV=D0e#K6Yz+Oc-*de7{RmDu*$GDgV)jdQ=` z0jyD_QK_np0iV0OUfR}oj>Fg!3U_2skgsnP!3!0PyW6I%4TqTNDgWA!*^Z ze6&JIR4y6-j7&nQIJ`fB4)P@U5Xo>b=S3|TMD&7#UG#0WZK()?FA*6=BRGWFIpV|o z@rGVt6JwB3D2z)$BG7T5P*MOn5Ecpt|IG{IjXWT`sV_3qtU#)VHgXme`0ZG zaIi0(PK7}rAt51JA-Y-=nhykOXlMx0)`95gXmUL?0~usGE>x2osPdb^f)I$O5vg<{ zg$&wa#CcMJ=x{JM)BkLNME#eR9QaR}xCMiR;;0a)miE?`emmOQ{{OBd(!bt;bPVCY z`Tn28fsPC+0fHd}Qi5oBZsWXFwn9;12pR!Lr_dZJlz`t=MEg?clt5n!6~z66*s2<6 zzby_=BySlH{Ef1;h1rk;={Pc;U}FIXb9uCgL@$^XLI-N8ci7O1HTxrWOAsU~H?jqRMhqr+S