From 91cd6db5a9aa843fe4decaa86ae138e80178cdfe Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:01:08 +0200 Subject: [PATCH 1/9] LDEV-6243 fix member function race in getMembers() --- .../extension/image/util/CommonUtil.java | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/util/CommonUtil.java b/source/java/src/org/lucee/extension/image/util/CommonUtil.java index 0710b33..5cb7715 100644 --- a/source/java/src/org/lucee/extension/image/util/CommonUtil.java +++ b/source/java/src/org/lucee/extension/image/util/CommonUtil.java @@ -36,7 +36,8 @@ public class CommonUtil { public static final short UNDEFINED_NODE = -1; private static final String _8220 = String.valueOf((char) 8220); - private static Map members; + private static volatile Map members; + private static final Object membersLock = new Object(); private static BIF GetApplicationSettings; public static String unwrap(String str) { @@ -156,31 +157,34 @@ else if (res.isDirectory()) { public static Map getMembers(PageContext pc) throws PageException { if (members == null) { - Cast cast = CFMLEngineFactory.getInstance().getCastUtil(); - members = new HashMap(); - ConfigWeb config = pc.getConfig(); - Object[] flds = getFLDs(config, 1); - Map funcs; - Iterator it; - Object func; - String[] names; - boolean chaining; - BIF bif; - Coll coll; - for (int i = 0; i < flds.length; i++) { - funcs = getFunctions(flds[i]); - it = funcs.values().iterator(); - while (it.hasNext()) { - func = it.next(); - if (getMemberType(func) == Image.TYPE_IMAGE) { - names = getMemberNames(func); - if (names != null && names.length > 0) { - coll = new Coll(getBIF(func), getMemberChaining(func)); - for (String name: names) { - members.put(cast.toKey(name), coll); + synchronized (membersLock) { + if (members == null) { + Cast cast = CFMLEngineFactory.getInstance().getCastUtil(); + Map local = new HashMap<>(); + ConfigWeb config = pc.getConfig(); + Object[] flds = getFLDs(config, 1); + Map funcs; + Iterator it; + Object func; + String[] names; + Coll coll; + for (int i = 0; i < flds.length; i++) { + funcs = getFunctions(flds[i]); + it = funcs.values().iterator(); + while (it.hasNext()) { + func = it.next(); + if (getMemberType(func) == Image.TYPE_IMAGE) { + names = getMemberNames(func); + if (names != null && names.length > 0) { + coll = new Coll(getBIF(func), getMemberChaining(func)); + for (String name: names) { + local.put(cast.toKey(name), coll); + } + } } } } + members = local; } } } From 8d0decf1aa4c3b7b4dbe5826f59904f080330579 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:01:43 +0200 Subject: [PATCH 2/9] LDEV-6244 replace GetApplicationSettings BIF with getCustom() in getCoders() --- .../extension/image/util/CommonUtil.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/util/CommonUtil.java b/source/java/src/org/lucee/extension/image/util/CommonUtil.java index 5cb7715..5d23af3 100644 --- a/source/java/src/org/lucee/extension/image/util/CommonUtil.java +++ b/source/java/src/org/lucee/extension/image/util/CommonUtil.java @@ -38,7 +38,6 @@ public class CommonUtil { private static volatile Map members; private static final Object membersLock = new Object(); - private static BIF GetApplicationSettings; public static String unwrap(String str) { if (str == null) return ""; @@ -272,22 +271,34 @@ public static void close(ImageInputStream iis) { } } + private static Method getCustomMethod; + public static Set getCoders(StringBuilder sb, PageContext pc) { Set result = null; try { CFMLEngine eng = CFMLEngineFactory.getInstance(); if (pc == null) pc = eng.getThreadPageContext(); if (pc == null) return null; - if (GetApplicationSettings == null) { - GetApplicationSettings = eng.getClassUtil().loadBIF(pc, "lucee.runtime.functions.system.GetApplicationSettings"); + + Object ac = pc.getApplicationContext(); + if (ac == null) return null; + + // read this.image from ApplicationContext via getCustom(Key) + Object o = null; + if (getCustomMethod == null || getCustomMethod.getDeclaringClass() != ac.getClass()) { + try { + getCustomMethod = ac.getClass().getMethod("getCustom", new Class[] { Collection.Key.class }); + } + catch (NoSuchMethodException e) { + return null; + } } - Struct sct = (Struct) GetApplicationSettings.invoke(pc, new Object[] { Boolean.TRUE }); - Object o = sct.get("image", null); + o = getCustomMethod.invoke(ac, new Object[] { eng.getCastUtil().toKey("image") }); + if (o instanceof Struct) { Struct image = (Struct) o; - // type o = image.get("coder", null); - if (o == null) image.get("coders", null); + if (o == null) o = image.get("coders", null); if (o != null && eng.getDecisionUtil().isCastableToArray(o)) { String[] coders = eng.getListUtil().toStringArray(eng.getCastUtil().toArray(o)); @@ -299,7 +310,6 @@ public static Set getCoders(StringBuilder sb, PageContext pc) { } } } - } catch (Exception e) { Coder.log(pc); From 1280606b0a1b656f0907a4d6ba6b52cc989fd459 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:04:16 +0200 Subject: [PATCH 3/9] LDEV-6245 remove redundant _coder static cache in getCoder() --- source/java/src/org/lucee/extension/image/ImageUtil.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/ImageUtil.java b/source/java/src/org/lucee/extension/image/ImageUtil.java index d3a976a..3f640ef 100644 --- a/source/java/src/org/lucee/extension/image/ImageUtil.java +++ b/source/java/src/org/lucee/extension/image/ImageUtil.java @@ -54,8 +54,6 @@ public class ImageUtil { - private static Coder _coder; - private static final boolean useSunCodec = getSunCodec(); private static Class JPEGCodec; private static Class JPEGEncodeParam; @@ -63,10 +61,7 @@ public class ImageUtil { private static int counter = 0; private static Coder getCoder() { - if (true || _coder == null) { - _coder = Coder.getInstance(CFMLEngineFactory.getInstance().getThreadPageContext()); - } - return _coder; + return Coder.getInstance(CFMLEngineFactory.getInstance().getThreadPageContext()); } public static String getOneWriterFormatName(String... preferences) throws IOException { From 65f60958e7bdeaf7d99ac662e2b5b026254645d9 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:05:25 +0200 Subject: [PATCH 4/9] LDEV-6245 fix missing return in AImageIOInterface.write() causing double write --- .../org/lucee/extension/image/coder/AImageIOInterface.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java index 5e241e1..37aa874 100644 --- a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java +++ b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java @@ -110,7 +110,10 @@ public BufferedImage read(byte[] bytes, String format) throws IOException { @Override public void write(Image img, Resource destination, String format, float quality, boolean noMeta) throws IOException { - if (destination instanceof File) writeImage(img, destination, format, quality, noMeta); + if (destination instanceof File) { + writeImage(img, destination, format, quality, noMeta); + return; + } OutputStream os = null; try { os = destination.getOutputStream(); From cc692b4a3b05438f3027d061cf9345f652ba6cf6 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:05:53 +0200 Subject: [PATCH 5/9] LDEV-6245 stop throwing exceptions for format matching in AImageIOInterface --- .../image/coder/AImageIOInterface.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java index 37aa874..520f8ac 100644 --- a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java +++ b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java @@ -184,28 +184,20 @@ public String getFormat(byte[] bytes, String defaultValue) { private String getFormatbyMimeType(String mimeType, String defaultValue) { if (!Util.isEmpty(mimeType)) { - try { - return getFormatbyMimeType(mimeType); - } - catch (Throwable t) { - if (t instanceof ThreadDeath) throw (ThreadDeath) t; - } - } - return defaultValue; - } - - private String getFormatbyMimeType(String mimeType) throws IOException { - if (!Util.isEmpty(mimeType)) { - for (Map.Entry e: codecs.entrySet()) { for (String mt: e.getValue().mimeTypes) { - if (mimeType.equalsIgnoreCase(mt)) { return e.getKey(); } } } } + return defaultValue; + } + + private String getFormatbyMimeType(String mimeType) throws IOException { + String result = getFormatbyMimeType(mimeType, null); + if (result != null) return result; throw new IOException("no matching format found for mimetype [" + mimeType + "]"); } From 8933526628a9ae3a0f1ebedeacd4c7f0d32ffb9e Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:06:38 +0200 Subject: [PATCH 6/9] LDEV-6245 stop throwing exceptions for format matching in ImageIOCoder --- .../extension/image/coder/ImageIOCoder.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java b/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java index 1cf5c83..7c6f750 100644 --- a/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java +++ b/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java @@ -152,24 +152,20 @@ public String getFormat(byte[] bytes, String defaultValue) { private String getFormatbyMimeType(String mimeType, String defaultValue) { if (!Util.isEmpty(mimeType)) { try { - return getFormatbyMimeType(mimeType); + Iterator it = ImageIO.getImageReadersByMIMEType(mimeType); + while (it != null && it.hasNext()) { + return it.next().getFormatName(); + } } - catch (Throwable t) { - if (t instanceof ThreadDeath) throw (ThreadDeath) t; + catch (IOException e) { } } return defaultValue; } private String getFormatbyMimeType(String mimeType) throws IOException { - if (!Util.isEmpty(mimeType)) { - Iterator it = ImageIO.getImageReadersByMIMEType(mimeType); - while (it != null && it.hasNext()) { - String fn = it.next().getFormatName(); - return fn; - } - - } + String result = getFormatbyMimeType(mimeType, null); + if (result != null) return result; throw new IOException("no matching format found for mimetype [" + mimeType + "]"); } From 384a48055bb13a554ad79b517f4d55ec293861b0 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:08:26 +0200 Subject: [PATCH 7/9] LDEV-6245 resolve MIME type once and pass to coders to avoid repeated Tika detection --- .../org/lucee/extension/image/ImageUtil.java | 39 ++++++++++++------- .../image/coder/AImageIOInterface.java | 16 ++++++++ .../extension/image/coder/ImageIOCoder.java | 16 ++++++++ .../extension/image/coder/MultiCoder.java | 14 ++++++- .../extension/image/format/FormatExtract.java | 9 +++++ 5 files changed, 79 insertions(+), 15 deletions(-) diff --git a/source/java/src/org/lucee/extension/image/ImageUtil.java b/source/java/src/org/lucee/extension/image/ImageUtil.java index 3f640ef..ac2a524 100644 --- a/source/java/src/org/lucee/extension/image/ImageUtil.java +++ b/source/java/src/org/lucee/extension/image/ImageUtil.java @@ -174,23 +174,34 @@ public static byte[] readBase64(String b64str, StringBuilder mimetype) throws IO return Base64.decodeBase64(b64str.getBytes()); } + /** + * Detect the image format for a resource. The detection order is: + * 1. Coder-specific magic byte detection (JDeli, TwelveMonkeys etc) — handles misnamed files + * 2. MIME type detection via Tika (content-based) — fallback for formats coders don't recognise + * 3. File extension — last resort, trusts the filename + * + * MIME type (Tika) is resolved once and passed to all coders to avoid repeated detection. + * This is critical for performance — Tika's magic byte scanning is expensive (~600k allocations + * per 5k image ops when called per-coder). + * + * Misnamed files (e.g. a JPEG saved as .png) are handled by steps 1 and 2 which inspect + * actual file content, not the extension. + */ public static String getFormat(Resource res) throws IOException { long len = res.length(); + // resolve MIME type once and pass to coders — avoids repeated Tika detection + String mt = len > 0 ? getMimeType(res, null) : null; Coder c = getCoder(); if (c instanceof FormatExtract) { - String format = ((FormatExtract) c).getFormat(res, null); + String format = ((FormatExtract) c).getFormat(res, mt, null); if (!Util.isEmpty(format, true)) { return format; } } - // there is no need to check the mime type if the file is empty - if (len > 0) { - String mt = getMimeType(res, null); - if (!Util.isEmpty(mt)) { - String format = getImageFormatFromMimeType(mt, null); - if (!Util.isEmpty(format)) { - return format; - } + if (!Util.isEmpty(mt)) { + String format = getImageFormatFromMimeType(mt, null); + if (!Util.isEmpty(format)) { + return format; } } return getFormatFromExtension(res, null); @@ -205,21 +216,23 @@ public static String getMimeType(byte[] binary, String defaultValue) { } public static String getFormat(byte[] binary) throws IOException { + String mt = CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(binary, ""); Coder c = getCoder(); if (c instanceof FormatExtract) { - String format = ((FormatExtract) c).getFormat(binary, null); + String format = ((FormatExtract) c).getFormat(binary, mt, null); if (!Util.isEmpty(format, true)) return format; } - return getFormatFromMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(binary, "")); + return getFormatFromMimeType(mt); } public static String getFormat(byte[] binary, String defaultValue) { + String mt = CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(binary, ""); Coder c = getCoder(); if (c instanceof FormatExtract) { - String format = ((FormatExtract) c).getFormat(binary, null); + String format = ((FormatExtract) c).getFormat(binary, mt, null); if (!Util.isEmpty(format, true)) return format; } - return getImageFormatFromMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(binary, ""), defaultValue); + return getImageFormatFromMimeType(mt, defaultValue); } public static String toFormat(String format) { diff --git a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java index 520f8ac..129eec6 100644 --- a/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java +++ b/source/java/src/org/lucee/extension/image/coder/AImageIOInterface.java @@ -172,6 +172,14 @@ public String getFormat(Resource res, String defaultValue) { } + @Override + public String getFormat(Resource res, String mimeType, String defaultValue) { + if (!Util.isEmpty(mimeType)) { + return getFormatbyMimeType(mimeType, defaultValue); + } + return getFormat(res, defaultValue); + } + @Override public String getFormat(byte[] bytes) throws IOException { return getFormatbyMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(bytes, null)); @@ -182,6 +190,14 @@ public String getFormat(byte[] bytes, String defaultValue) { return getFormatbyMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(bytes, null), defaultValue); } + @Override + public String getFormat(byte[] bytes, String mimeType, String defaultValue) { + if (!Util.isEmpty(mimeType)) { + return getFormatbyMimeType(mimeType, defaultValue); + } + return getFormat(bytes, defaultValue); + } + private String getFormatbyMimeType(String mimeType, String defaultValue) { if (!Util.isEmpty(mimeType)) { for (Map.Entry e: codecs.entrySet()) { diff --git a/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java b/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java index 7c6f750..1216abd 100644 --- a/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java +++ b/source/java/src/org/lucee/extension/image/coder/ImageIOCoder.java @@ -139,6 +139,14 @@ public String getFormat(Resource res, String defaultValue) { return defaultValue; } + @Override + public String getFormat(Resource res, String mimeType, String defaultValue) { + if (!Util.isEmpty(mimeType)) { + return getFormatbyMimeType(mimeType, defaultValue); + } + return getFormat(res, defaultValue); + } + @Override public String getFormat(byte[] bytes) throws IOException { return getFormatbyMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(bytes, null)); @@ -149,6 +157,14 @@ public String getFormat(byte[] bytes, String defaultValue) { return getFormatbyMimeType(CFMLEngineFactory.getInstance().getResourceUtil().getMimeType(bytes, null), defaultValue); } + @Override + public String getFormat(byte[] bytes, String mimeType, String defaultValue) { + if (!Util.isEmpty(mimeType)) { + return getFormatbyMimeType(mimeType, defaultValue); + } + return getFormat(bytes, defaultValue); + } + private String getFormatbyMimeType(String mimeType, String defaultValue) { if (!Util.isEmpty(mimeType)) { try { diff --git a/source/java/src/org/lucee/extension/image/coder/MultiCoder.java b/source/java/src/org/lucee/extension/image/coder/MultiCoder.java index a09bc90..2633291 100644 --- a/source/java/src/org/lucee/extension/image/coder/MultiCoder.java +++ b/source/java/src/org/lucee/extension/image/coder/MultiCoder.java @@ -276,9 +276,14 @@ public String getFormat(byte[] bytes) throws IOException { @Override public String getFormat(Resource res, String defaultValue) { + return getFormat(res, null, defaultValue); + } + + @Override + public String getFormat(Resource res, String mimeType, String defaultValue) { for (Coder coder: coders) { if (!(coder instanceof FormatExtract)) continue; - String format = ((FormatExtract) coder).getFormat(res, null); + String format = ((FormatExtract) coder).getFormat(res, mimeType, null); if (!Util.isEmpty(format)) { return format; } @@ -288,9 +293,14 @@ public String getFormat(Resource res, String defaultValue) { @Override public String getFormat(byte[] bytes, String defaultValue) { + return getFormat(bytes, null, defaultValue); + } + + @Override + public String getFormat(byte[] bytes, String mimeType, String defaultValue) { for (Coder coder: coders) { if (!(coder instanceof FormatExtract)) continue; - String format = ((FormatExtract) coder).getFormat(bytes, null); + String format = ((FormatExtract) coder).getFormat(bytes, mimeType, null); if (!Util.isEmpty(format)) return format; } return defaultValue; diff --git a/source/java/src/org/lucee/extension/image/format/FormatExtract.java b/source/java/src/org/lucee/extension/image/format/FormatExtract.java index 8bbf0c0..bffd309 100644 --- a/source/java/src/org/lucee/extension/image/format/FormatExtract.java +++ b/source/java/src/org/lucee/extension/image/format/FormatExtract.java @@ -12,4 +12,13 @@ public interface FormatExtract { public abstract String getFormat(byte[] bytes) throws IOException; public abstract String getFormat(byte[] bytes, String defaultValue); + + // overloads that accept a pre-resolved MIME type to avoid repeated Tika detection + default String getFormat(Resource res, String mimeType, String defaultValue) { + return getFormat(res, defaultValue); + } + + default String getFormat(byte[] bytes, String mimeType, String defaultValue) { + return getFormat(bytes, defaultValue); + } } From 520c81b15911eccf6fb892cc13da891a13cdba78 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 9 Apr 2026 12:08:36 +0200 Subject: [PATCH 8/9] LDEV-6245 add misnamed file tests including webp --- tests/ImageReadMisnamed.cfc | 84 +++++++++++++++++++++++++++++++++ tests/images/small-sample.webp | Bin 0 -> 57676 bytes 2 files changed, 84 insertions(+) create mode 100644 tests/ImageReadMisnamed.cfc create mode 100644 tests/images/small-sample.webp diff --git a/tests/ImageReadMisnamed.cfc b/tests/ImageReadMisnamed.cfc new file mode 100644 index 0000000..87392ca --- /dev/null +++ b/tests/ImageReadMisnamed.cfc @@ -0,0 +1,84 @@ +component extends="org.lucee.cfml.test.LuceeTestCase" labels="image" { + + variables.imgDir = getDirectoryFromPath( getCurrentTemplatePath() ) & "images/"; + variables.testDir = getTempDirectory( "misnamed" ); + + function beforeAll(){ + // cleanup from previous runs + if ( directoryExists( testDir ) ) directoryDelete( testDir, true ); + directoryCreate( testDir ); + + var jpgSrc = imgDir & "image.jpg"; + var pngSrc = imgDir & "lucee-logo.png"; + var webpSrc = imgDir & "small-sample.webp"; + + // JPEG saved with .png extension + fileCopy( jpgSrc, testDir & "actually-jpeg.png" ); + // PNG saved with .jpg extension + fileCopy( pngSrc, testDir & "actually-png.jpg" ); + // JPEG saved with no extension + fileCopy( jpgSrc, testDir & "no-extension" ); + // PNG saved with .bmp extension + fileCopy( pngSrc, testDir & "actually-png.bmp" ); + // WebP saved with .jpg extension + fileCopy( webpSrc, testDir & "actually-webp.jpg" ); + // WebP saved with .png extension + fileCopy( webpSrc, testDir & "actually-webp.png" ); + } + + function run( testResults, testBox ){ + describe( "imageRead with misnamed files", function(){ + + it( title="reads a JPEG file saved with .png extension", body=function(){ + var img = imageRead( testDir & "actually-jpeg.png" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + it( title="reads a PNG file saved with .jpg extension", body=function(){ + var img = imageRead( testDir & "actually-png.jpg" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + it( title="reads a JPEG file with no extension", body=function(){ + var img = imageRead( testDir & "no-extension" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + it( title="reads a PNG file saved with .bmp extension", body=function(){ + var img = imageRead( testDir & "actually-png.bmp" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + it( title="imageInfo works on misnamed JPEG (.png ext)", body=function(){ + var img = imageRead( testDir & "actually-jpeg.png" ); + var info = imageInfo( img ); + expect( info.width ).toBeGT( 0 ); + expect( info.height ).toBeGT( 0 ); + }); + + it( title="imageResize works on misnamed PNG (.jpg ext)", body=function(){ + var img = imageRead( testDir & "actually-png.jpg" ); + imageResize( img, 50, 50 ); + expect( imageGetWidth( img ) ).toBe( 50 ); + }); + + it( title="reads a WebP file saved with .jpg extension", body=function(){ + var img = imageRead( testDir & "actually-webp.jpg" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + it( title="reads a WebP file saved with .png extension", body=function(){ + var img = imageRead( testDir & "actually-webp.png" ); + expect( isImage( img ) ).toBeTrue(); + expect( imageGetWidth( img ) ).toBeGT( 0 ); + }); + + }); + } + +} diff --git a/tests/images/small-sample.webp b/tests/images/small-sample.webp new file mode 100644 index 0000000000000000000000000000000000000000..a750b74b0958b23920876f60c5650fe3a24a1536 GIT binary patch literal 57676 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 Date: Thu, 9 Apr 2026 12:13:06 +0200 Subject: [PATCH 9/9] set version 3.0.1.3-SNAPSHOT, add changelog --- CHANGELOG.md | 6 ++++++ pom.xml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25c478c..618063b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 3.0.1.3 + +- [LDEV-6243](https://luceeserver.atlassian.net/browse/LDEV-6243) fix member function race condition under concurrent requests +- [LDEV-6244](https://luceeserver.atlassian.net/browse/LDEV-6244) replace GetApplicationSettings BIF with getCustom() to avoid DummyWSHandler exception spam +- [LDEV-6245](https://luceeserver.atlassian.net/browse/LDEV-6245) performance: remove redundant coder cache, fix double write, reduce Tika MIME detection calls, eliminate exception-driven format matching + ## 3.0.1.2 (2026-03-26) - [LDEV-5129](https://luceeserver.atlassian.net/browse/LDEV-5129) remove unused bundled jars: commons-io (CVE-2024-47554), xmpcore, apiguardian, hamcrest, opentest4j diff --git a/pom.xml b/pom.xml index d9c4f58..dbeace8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.lucee image-extension - 3.0.1.2-SNAPSHOT + 3.0.1.3-SNAPSHOT pom Image Extension