changeset 2487:5ae8b796d15e

check for memory allocation of the volume image
author claude <claude>
date Wed, 03 Jun 2009 17:15:51 +0000
parents 2c3e2e826e66
children c9b676b802a8
files volume_io/Volumes/input_free.c volume_io/Volumes/input_mnc.c volume_io/Volumes/input_volume.c volume_io/Volumes/multidim_arrays.c volume_io/Volumes/volumes.c
diffstat 5 files changed, 58 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/volume_io/Volumes/input_free.c
+++ b/volume_io/Volumes/input_free.c
@@ -489,8 +489,10 @@
 
     if( (long) volume_input->slice_index < volume_input->sizes_in_file[0] )
     {
-        if( !volume_is_alloced( volume ) )
+        if( !volume_is_alloced( volume ) ) {
             alloc_volume_data( volume );
+            if( !volume_is_alloced( volume ) ) return( FALSE );
+        }
 
         status = input_slice( volume_input );
 
--- a/volume_io/Volumes/input_mnc.c
+++ b/volume_io/Volumes/input_mnc.c
@@ -1016,6 +1016,7 @@
                                           file->filename,
                                           &file->original_input_options );
         }
+        if( !volume_is_alloced( volume ) ) return( FALSE );
     }
 
     if( volume->is_cached_volume )
--- a/volume_io/Volumes/input_volume.c
+++ b/volume_io/Volumes/input_volume.c
@@ -248,6 +248,12 @@
         terminate_progress_report( &progress );
 
         delete_volume_input( &input_info );
+
+        if( !volume_is_alloced( *volume ) ) {
+          delete_volume( *volume );
+          *volume = NULL;
+          status = ERROR;
+        }
     }
 
     return( status );
--- a/volume_io/Volumes/multidim_arrays.c
+++ b/volume_io/Volumes/multidim_arrays.c
@@ -215,9 +215,46 @@
 ---------------------------------------------------------------------------- */
 
 VIOAPI  BOOLEAN  multidim_array_is_alloced(
-    multidim_array   *array )
-{
-    return( array->data != NULL );
+    multidim_array   *array ) {
+
+    BOOLEAN status = FALSE;
+    void    **p1, ***p2, ****p3, *****p4, ******p5;
+
+    if( array == NULL ) return( FALSE );
+
+    switch( array->n_dimensions ) {
+      case  1: p1 = (void **)&array->data;
+               status = ( *p1 != NULL );
+               break;
+      case  2: p2 = (void ***)&array->data;
+               if( *p2 == NULL ) break;
+               if( **p2 == NULL ) break;
+               status = TRUE;
+               break;
+      case  3: p3 = (void ****)&array->data;
+               if( *p3 == NULL ) break;
+               if( **p3 == NULL ) break;
+               if( ***p3 == NULL ) break;
+               status = TRUE;
+               break;
+      case  4: p4 = (void *****)&array->data;
+               if( *p4 == NULL ) break;
+               if( **p4 == NULL ) break;
+               if( ***p4 == NULL ) break;
+               if( ****p4 == NULL ) break;
+               status = TRUE;
+               break;
+      case  5: p5 = (void ******)&array->data;
+               if( *p5 == NULL ) break;
+               if( **p5 == NULL ) break;
+               if( ***p5 == NULL ) break;
+               if( ****p5 == NULL ) break;
+               if( *****p5 == NULL ) break;
+               status = TRUE;
+               break;
+    }
+
+    return( status );
 }
 
 /* ----------------------------- MNI Header -----------------------------------
--- a/volume_io/Volumes/volumes.c
+++ b/volume_io/Volumes/volumes.c
@@ -2392,6 +2392,11 @@
                                             voxel_min, voxel_max );
     alloc_volume_data( copy );
 
+    if( !volume_is_alloced( copy ) ) {
+      delete_volume( copy );
+      copy = NULL;
+    }
+
     return( copy );
 }
 
@@ -2424,6 +2429,9 @@
     }
 
     copy = copy_volume_definition( volume, MI_ORIGINAL_TYPE, FALSE, 0.0, 0.0 );
+    if( !copy ) {
+      return( NULL );
+    }
 
     /* --- find out how many voxels are in the volume */