Skip to main content
April 17, 2008
Question

Another CFImage bug

  • April 17, 2008
  • 10 replies
  • 7019 views
Second cfImage bug I've found in a week. Tried reporting it to Adobe, but their bug report form throws a 404 (nice).

Basically, certain JPGs will cause CF (or more specifically, Java) to throw this error after reading them to memory, then writing it to disk:
Missing Huffman code table entry
javax.imageio.IIOException: Missing Huffman code table entry at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:996) at coldfusion.image.ImageWriter.writeJPeg(ImageWriter.java:60) at coldfusion.image.ImageWriter.writeImage(ImageWriter.java:119) at coldfusion.image.Image.write(Image.java:578) at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593) at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500)

Run the attached code with the image found here:
http://img141.imageshack.us/img141/9549/testimagefk9.jpg

If you put the URL into the cfimage source (instead of downloading the image and reading it locally) you get a different error:
coldfusion.image.Image$ReadImageMetadataException: Exception occured in JPG processing.
segment size would extend beyond file stream length
at coldfusion.image.Image.initializeMetadata(Image.java:2403)
at coldfusion.image.Image.getExifMetadata(Image.java:2415)
at coldfusion.image.Image.write(Image.java:577)
at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593)
at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500)

Verified on Win2K, Win2K3, and WinXP. CF version 8.0.1.
This topic has been closed for replies.

10 replies

May 19, 2008
RE: Metadata components != number of destination bands

That looks like a new bug to me.

Just to keep this organized, start a new thread for this bug, post that dump and give a link to the image causing the error (see my first post in this thread for an example). Reply to this post with the new post URL and we'll all try to replicate your error.

I haven't seen that error yet, so you may have discovered something new.
Inspiring
May 19, 2008

Hello, I work with Piper. We've wrapped the CFIMAGE Write tags in catch / try blocks as suggested. I'm attaching the resulting HTML (from cfdump var="#cfcatch#") . Any thoughts? Is there anyway to paste RAW html in the forums? If not, can you point me in the direction of what to look for in this CFDUMP output? I'll paste some of what seems to be the more pertinent information below.

Thanks in advance for any and all help!
Rob

Message: Metadata components != number of destination bands
StackTrace: javax.imageio.IIOException: Metadata components != number of destination bands at com.sun.imageio.plugins.jpeg.JPEGImageWriter.checkSOFBands(JPEGImageWriter.java:1208) at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:656) at coldfusion.image.ImageWriter.writeJPeg(ImageWriter.java:70) at coldfusion.image.ImageWriter.writeImage(ImageWriter.java:102) at coldfusion.image.Image.write(Image.java:615) at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593) at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cfupload2ecfm1559718899._factor11(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:248) at cfupload2ecfm1559718899._factor12(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:1) at cfupload2ecfm1559718899.runPage(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:1) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279) at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at coldfusion.filter.PathFilter.invoke(PathFilter.java:86) at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126) at coldfusion.CfmServlet.service(CfmServlet.java:175) at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)


TagContext array
1 struct
COLUMN 0
ID CFIMAGE
LINE 248
RAW_TRACE at cfupload2ecfm1559718899._factor11(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:248)
TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
TYPE CFML

2 struct
COLUMN 0
ID CF_UPLOAD
LINE 1
RAW_TRACE at cfupload2ecfm1559718899._factor12(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:1)
TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
TYPE CFML

3 struct
COLUMN 0
ID CF_UPLOAD
LINE 1
RAW_TRACE at cfupload2ecfm1559718899.runPage(D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm:1)
TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
TYPE CFML
Participating Frequently
May 15, 2008
Hey Guys,
We tried the latest/greatest CFImage hotfix (updated) yesterday but we started finding the same errors again in the application.log:

An exception occured while trying to write the image. Ensure that the destination directory exists and that Coldfusion has permission to write to the given path or file. cause : coldfusion.image.ImageWriter$ImageWritingException: An exception occured while trying to write the image.

We're still successfully using the java code workaround, but it is noticeably slower than the CFImage writing function, so we had to increase timeouts on the upload pages to deal with that.

Is anyone else still experiencing this issue?

Best,
- Piper

(This is a cross-post from: http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?catid=3&threadid=1356442&STARTPAGE=1&FTVAR_FORUMVIEWTMP=Linear)
May 15, 2008
Piper,

The patch has been working for us. Maybe you are seeing a new bug. Wrap your cfimage code try/catch (see my previous post), and trap the actual error. What you are seeing in the logs is a generic error and won't tell you what the true problem is.
May 7, 2008
Updated hot fix was published today. Visit http://www.adobe.com/go/kb402604 for list of all CF8/8.01 hot fixes. Again, the CFImage hot fix was updated today (5/7/08).
May 8, 2008
This patch fixed the problem. Thanks for the quick response.
Participating Frequently
May 5, 2008
We upgraded to 8.01 today (Windows 2003 server) and immediately started seeing problems with the CFIMAGE routines. The hotfix hasn't worked for us, though it seems to have made the frequency slightly less.

Our application log shows a few of these every few minutes:

An exception occured while trying to write the image. Ensure that the destination directory exists and that Coldfusion has permission to write to the given path or file. cause : coldfusion.image.ImageWriter$ImageWritingException: An exception occured while trying to write the image.

Is work on this hotfix ongoing? Can we expect to see an update sometime soon?

Or.... my favorite and more typical situation, am I the only one still having this issue? :-)

Many thanks,
- Piper
May 5, 2008
Piper,

The info in the logs isn't enough to determine which CFImage bug you are experiencing. Your best bet would be to wrap your CFImage logic in cftry/cfcatch and email yourself a dump of the cfcatch structure. Quick and dirty example below.

So far, the workaround is to call the underlying Java methods to manipulate and write images. See above for cfSearching's example.
Inspiring
May 6, 2008
Update: According to Kiran Sakhare a hotfix for the locking and Huffman table issues will be released soon. I do not know if it will also fix the "Quantization table 0x02 was not defined" error.

In the mean time, the full method I am using as a work-around is:
http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=1&catid=7&threadid=1358449
Known Participant
April 28, 2008
AH HA!

It caught me! With crazy file pathing...

The expandpath was adding the current directory to my full qualified path, thus resulting in "bad mojo".

Chalk this up to me forgetting about the ExpandPath in your example.
Inspiring
April 28, 2008
DefconRhall wrote:
The expandpath was adding the current directory to my full qualified path, thus resulting in "bad mojo".

Yes, that would do it ;-) Glad it is working now.
Known Participant
April 28, 2008
Yep, if I drop that line it works fine.

Both ImageIO and bi are defined

Maybe the host's servers are messed up and need a reboot?
Inspiring
April 28, 2008
Both ImageIO and bi are defined
What about "outFile"? Also what results do you get if you run this code before the ImageIO.write?

<cfdump var="#bi.getClass().getName()#" label="Variable bi class name"><br>
<cfdump var="#outFile.getClass().getName()#" label="Variable outFile class name"><br>
<cfdump var="#bi.getWidth()#x#bi.getHeight()#" label="BufferedImage width x height"><br>
<cfdump var="#outFile.getAbsolutePath()#" label="OutFile Path">

Without seeing the full error, my guess would be the same as yours: one of the two variables is not defined for some reason. Can you post the full error message and stack trace?
Known Participant
April 28, 2008
What is odd is it seems to work perfectly fine when I resize the image to like 100x100, however the next line afterwards I resize to like 640x480 and it bombs...

I'll try re-reading the image file before doing the second resize and post the result.

Also by image object I take it you mean the return variable from the cfimage tag.
Known Participant
April 28, 2008
Well... that just made me look like an idiot, it failed this time on the first try...

I'll try the image object thing it seems I don't have a choice.
Inspiring
April 19, 2008
> Did you encounter this problem with 8.0.0? What JVM version are you using? I
> tested the code using both the url and a local file and both work without error
> under:
>
> O/S: XP SP2
> CF: 8,0,0,176276
> JVM: 1.6.0_01

Works fine for me too (same config as per yours above).

--
Adam
Inspiring
April 19, 2008
Did you encounter this problem with 8.0.0? What JVM version are you using? I tested the code using both the url and a local file and both work without error under:

O/S: XP SP2
CF: 8,0,0,176276
JVM: 1.6.0_01

Tried reporting it to Adobe, but their bug report form throws a 404 (nice).
On submit? The form displays correctly for me.
http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
Inspiring
April 20, 2008
After applying updater 1, I received the two errors you posted above.

O/S: XP SP2
CF: 8,0,1,195765
JVM: 1.6.0_04

Reverting to JVM 1.6.0_01-b06 had no effect on the error. I rolled back to CF 8.0.0 and the errors went away. That does seem to support the theory it is not or not solely a jvm problem. Out of curiosity, is there anything special about these images or do they all have something in common?

Using ImageIO to write the images, instead of cfimage, seems to work with 8.0.1.

<cfscript>
newImageName = createUUID() & ".jpg";
outFile = createObject("java", "java.io.File").init( ExpandPath(newImageName) );
bi = ImageGetBufferedImage(myImage);
ImageIO = createObject("java", "javax.imageio.ImageIO");
ImageIO.write( bi, "jpeg", outFile );
</cfscript>

April 22, 2008
Nothing special about the image that I know of. It was uploaded by one of our users. We get about one image a day that causes this error.

I tried upgrading to JVM 1.6.0_06 but still have the problem.

Interesting that imageIO works when you invoke it directly. The error being generated comes from that class when using the cfimage tag:
javax.imageio.IIOException: Missing Huffman code table entry at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:996) at coldfusion.image.ImageWriter.writeJPeg(ImageWriter.java:60) at coldfusion.image.ImageWriter.writeImage(ImageWriter.java:119) at coldfusion.image.Image.write(Image.java:578) at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593)

It seems to point to a bug in the implementation of CFImage.