summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2016-05-26 23:51:32 +0200
committerEven Rouault <even.rouault@spatialys.com>2016-05-26 23:51:32 +0200
commit7d3c7a345f05adbc9ca26d8ca7f6c7fffa5096be (patch)
tree9c4d3dcf1b24de664c1bf87d391e38e43c5e798b /src
parent69497d35c0e35a1f9b789d016e9eb4946b8f0fab (diff)
Be robust to failed allocations of job structures
Diffstat (limited to 'src')
-rw-r--r--src/lib/openjp2/dwt.c20
-rw-r--r--src/lib/openjp2/t1.c5
2 files changed, 25 insertions, 0 deletions
diff --git a/src/lib/openjp2/dwt.c b/src/lib/openjp2/dwt.c
index e21cc16f..18f8d9c3 100644
--- a/src/lib/openjp2/dwt.c
+++ b/src/lib/openjp2/dwt.c
@@ -679,6 +679,16 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* t
opj_dwd_decode_h_job_t* job;
job = (opj_dwd_decode_h_job_t*) opj_malloc(sizeof(opj_dwd_decode_h_job_t));
+ if( !job )
+ {
+ /* It would be nice to fallback to single thread case, but */
+ /* unfortunately some jobs may be launched and have modified */
+ /* tiledp, so it is not practical to recover from that error */
+ /* FIXME event manager error callback */
+ opj_thread_pool_wait_completion(tp, 0);
+ opj_aligned_free(h.mem);
+ return OPJ_FALSE;
+ }
job->h = h;
job->dwt_1D = dwt_1D;
job->rw = rw;
@@ -726,6 +736,16 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* t
opj_dwd_decode_v_job_t* job;
job = (opj_dwd_decode_v_job_t*) opj_malloc(sizeof(opj_dwd_decode_v_job_t));
+ if( !job )
+ {
+ /* It would be nice to fallback to single thread case, but */
+ /* unfortunately some jobs may be launched and have modified */
+ /* tiledp, so it is not practical to recover from that error */
+ /* FIXME event manager error callback */
+ opj_thread_pool_wait_completion(tp, 0);
+ opj_aligned_free(v.mem);
+ return OPJ_FALSE;
+ }
job->v = v;
job->dwt_1D = dwt_1D;
job->rh = rh;
diff --git a/src/lib/openjp2/t1.c b/src/lib/openjp2/t1.c
index adf64bb4..b1c6128d 100644
--- a/src/lib/openjp2/t1.c
+++ b/src/lib/openjp2/t1.c
@@ -1689,6 +1689,11 @@ void opj_t1_decode_cblks( opj_thread_pool_t* tp,
opj_t1_cblk_decode_processing_job_t* job;
job = (opj_t1_cblk_decode_processing_job_t*) opj_calloc(1, sizeof(opj_t1_cblk_decode_processing_job_t));
+ if( !job )
+ {
+ *pret = OPJ_FALSE;
+ return;
+ }
job->resno = resno;
job->cblk = cblk;
job->band = band;