Author: post
Date: 2010-11-25 20:57:21 +0100 (Thu, 25 Nov 2010)
New Revision: 3633
Modified:
trunk/plugins/load-dcraw/dcraw_api.cc
Log:
Encapsulate dcraw in a catch-all to avoid crashes on unloadable images.
Modified: trunk/plugins/load-dcraw/dcraw_api.cc
===================================================================
--- trunk/plugins/load-dcraw/dcraw_api.cc 2010-11-25 19:52:42 UTC (rev
3632)
+++ trunk/plugins/load-dcraw/dcraw_api.cc 2010-11-25 19:57:21 UTC (rev
3633)
@@ -66,6 +66,8 @@
delete d;
return DCRAW_OPEN_ERROR;
}
+ try
+ {
d->identify();
/* We first check if dcraw recognizes the file, this is equivalent
* to 'dcraw -i' succeeding */
@@ -130,6 +132,11 @@
h->raw.image = NULL;
h->thumbType = unknown_thumb_type;
h->message = d->messageBuffer;
+ } catch (...)
+ {
+ delete d;
+ return DCRAW_OPEN_ERROR;
+ }
return d->lastStatus;
}
@@ -194,34 +201,44 @@
fseek(d->ifp, 0, SEEK_END);
d->ifpSize = ftell(d->ifp);
fseek(d->ifp, d->data_offset, SEEK_SET);
- (d->*d->load_raw)();
- if (!--d->data_error) d->lastStatus = DCRAW_ERROR;
- if (d->zero_is_bad) d->remove_zeroes();
- d->bad_pixels(NULL);
- if (d->is_foveon) {
- d->foveon_interpolate();
- h->raw.width = h->width = d->width;
- h->raw.height = h->height = d->height;
- }
- fclose(d->ifp);
- h->ifp = NULL;
+ try
+ {
+ (d->*d->load_raw)();
+ if (!--d->data_error) d->lastStatus = DCRAW_ERROR;
+ if (d->zero_is_bad) d->remove_zeroes();
+ d->bad_pixels(NULL);
+ if (d->is_foveon) {
+ d->foveon_interpolate();
+ h->raw.width = h->width = d->width;
+ h->raw.height = h->height = d->height;
+ }
// TODO: Go over the following settings to see if they change during
// load_raw. If they change, document where. If not, move to dcraw_open().
- h->rgbMax = d->maximum;
- h->black = d->black;
- d->dcraw_message(DCRAW_VERBOSE,_("Black: %d, Maximum: %d\n"),
+ h->rgbMax = d->maximum;
+ h->black = d->black;
+ d->dcraw_message(DCRAW_VERBOSE,_("Black: %d, Maximum:
%d\n"),
d->black, d->maximum);
- dmin = DBL_MAX;
- for (i=0; i<h->colors; i++) if (dmin > d->pre_mul[i]) dmin = d->pre_mul[i];
- for (i=0; i<h->colors; i++) h->pre_mul[i] = d->pre_mul[i]/dmin;
- if (h->colors==3) h->pre_mul[3] = 0;
- memcpy(h->rgb_cam, d->rgb_cam, sizeof d->rgb_cam);
+ dmin = DBL_MAX;
+ for (i=0; i<h->colors; i++) if (dmin > d->pre_mul[i])
dmin = d->pre_mul[i];
+ for (i=0; i<h->colors; i++) h->pre_mul[i] =
d->pre_mul[i]/dmin;
+ if (h->colors==3) h->pre_mul[3] = 0;
+ memcpy(h->rgb_cam, d->rgb_cam, sizeof d->rgb_cam);
- double rgb_cam_transpose[4][3];
- for (i=0; i<4; i++) for (j=0; j<3; j++)
- rgb_cam_transpose[i][j] = d->rgb_cam[j][i];
- d->pseudoinverse (rgb_cam_transpose, h->cam_rgb, d->colors);
-
+ double rgb_cam_transpose[4][3];
+ for (i=0; i<4; i++) for (j=0; j<3; j++)
+ rgb_cam_transpose[i][j] = d->rgb_cam[j][i];
+ d->pseudoinverse (rgb_cam_transpose, h->cam_rgb,
d->colors);
+ } catch (...)
+ {
+ d->dcraw_message(DCRAW_ERROR,_("Dcraw could not load
image.\n"));
+ h->message = d->messageBuffer;
+ fclose(d->ifp);
+ h->ifp = NULL;
+ delete d;
+ return DCRAW_ERROR;
+ }
+ fclose(d->ifp);
+ h->ifp = NULL;
h->message = d->messageBuffer;
return d->lastStatus;
}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit