Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3358)

Unified Diff: core/src/fxcodec/codec/fx_codec_jpx_opj.cpp

Issue 1521473003: Merge to XFA: Fix integer and bounds issues in sycc4{22,44}_to_rgb. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
index 3f71035eb32d3d5b50d532fae5708245e0ba5b25..cf017ca17afbf06d07634617bc98badcced46ec3 100644
--- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -165,22 +165,26 @@ static void sycc_to_rgb(int offset,
*out_b = b;
}
static void sycc444_to_rgb(opj_image_t* img) {
+ int prec = img->comps[0].prec;
+ int offset = 1 << (prec - 1);
+ int upb = (1 << prec) - 1;
+ OPJ_UINT32 maxw =
+ std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w);
+ OPJ_UINT32 maxh =
+ std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h);
+ FX_SAFE_SIZE_T max_size = maxw;
+ max_size *= maxh;
+ if (!max_size.IsValid())
+ return;
+
+ const int* y = img->comps[0].data;
+ const int* cb = img->comps[1].data;
+ const int* cr = img->comps[2].data;
int *d0, *d1, *d2, *r, *g, *b;
- const int *y, *cb, *cr;
- int maxw, maxh, max, i, offset, upb;
- i = (int)img->comps[0].prec;
- offset = 1 << (i - 1);
- upb = (1 << i) - 1;
- maxw = (int)img->comps[0].w;
- maxh = (int)img->comps[0].h;
- max = maxw * maxh;
- y = img->comps[0].data;
- cb = img->comps[1].data;
- cr = img->comps[2].data;
- d0 = r = FX_Alloc(int, (size_t)max);
- d1 = g = FX_Alloc(int, (size_t)max);
- d2 = b = FX_Alloc(int, (size_t)max);
- for (i = 0; i < max; ++i) {
+ d0 = r = FX_Alloc(int, max_size.ValueOrDie());
+ d1 = g = FX_Alloc(int, max_size.ValueOrDie());
+ d2 = b = FX_Alloc(int, max_size.ValueOrDie());
+ for (size_t i = 0; i < max_size.ValueOrDie(); ++i) {
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y;
++cb;
@@ -197,24 +201,28 @@ static void sycc444_to_rgb(opj_image_t* img) {
img->comps[2].data = d2;
}
static void sycc422_to_rgb(opj_image_t* img) {
+ int prec = img->comps[0].prec;
+ int offset = 1 << (prec - 1);
+ int upb = (1 << prec) - 1;
+ OPJ_UINT32 maxw =
+ std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w);
+ OPJ_UINT32 maxh =
+ std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h);
+ FX_SAFE_SIZE_T max_size = maxw;
+ max_size *= maxh;
+ if (!max_size.IsValid())
+ return;
+
+ const int* y = img->comps[0].data;
+ const int* cb = img->comps[1].data;
+ const int* cr = img->comps[2].data;
int *d0, *d1, *d2, *r, *g, *b;
- const int *y, *cb, *cr;
- int maxw, maxh, max, offset, upb;
- int i, j;
- i = (int)img->comps[0].prec;
- offset = 1 << (i - 1);
- upb = (1 << i) - 1;
- maxw = (int)img->comps[0].w;
- maxh = (int)img->comps[0].h;
- max = maxw * maxh;
- y = img->comps[0].data;
- cb = img->comps[1].data;
- cr = img->comps[2].data;
- d0 = r = FX_Alloc(int, (size_t)max);
- d1 = g = FX_Alloc(int, (size_t)max);
- d2 = b = FX_Alloc(int, (size_t)max);
- for (i = 0; i < maxh; ++i) {
- for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2) {
+ d0 = r = FX_Alloc(int, max_size.ValueOrDie());
+ d1 = g = FX_Alloc(int, max_size.ValueOrDie());
+ d2 = b = FX_Alloc(int, max_size.ValueOrDie());
+ for (uint32_t i = 0; i < maxh; ++i) {
+ OPJ_UINT32 j;
+ for (j = 0; j < (maxw & ~static_cast<OPJ_UINT32>(1)); j += 2) {
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y;
++r;
@@ -248,10 +256,6 @@ static void sycc422_to_rgb(opj_image_t* img) {
img->comps[1].h = maxh;
img->comps[2].w = maxw;
img->comps[2].h = maxh;
- img->comps[1].w = (OPJ_UINT32)maxw;
- img->comps[1].h = (OPJ_UINT32)maxh;
- img->comps[2].w = (OPJ_UINT32)maxw;
- img->comps[2].h = (OPJ_UINT32)maxh;
img->comps[1].dx = img->comps[0].dx;
img->comps[2].dx = img->comps[0].dx;
img->comps[1].dy = img->comps[0].dy;
« no previous file with comments | « core/src/fpdfapi/fpdf_render/fpdf_render_loadimage_embeddertest.cpp ('k') | testing/resources/bug_557223.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698