Be robust to failed allocations of job structures
authorEven Rouault <even.rouault@spatialys.com>
Thu, 26 May 2016 21:51:32 +0000 (23:51 +0200)
committerEven Rouault <even.rouault@spatialys.com>
Thu, 26 May 2016 21:51:32 +0000 (23:51 +0200)
src/lib/openjp2/dwt.c
src/lib/openjp2/t1.c

index e21cc16fcfa74c7ba7d8437fa8c1e8e0d53b9daf..18f8d9c34d390854103d839e7ee82caa6b195a42 100644 (file)
@@ -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;
index adf64bb4e2c7846739ee87a3168321891efb600d..b1c6128d091b6e31436ca43e9a69d92f089a709f 100644 (file)
@@ -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;