--- a/src/camera.c
+++ b/src/camera.c
@@ -32,6 +32,8 @@
   gettimeofday(&t1,NULL);
   */
   err=dc1394_camera_enumerate(dc1394,&camera_list);
+  if(err != DC1394_SUCCESS)
+    return err;
   /*
   gettimeofday(&t2,NULL);
 
@@ -42,10 +44,15 @@
   */
   // create a list of cameras with coriander's camera type camera_t
   for (i=0;i<camera_list->num;i++) {
+    dc1394camera_t *camera=dc1394_camera_new(dc1394,camera_list->ids[i].guid);
+
+    if(!camera)
+      continue;
+
     camera_ptr=NewCamera();
     
     // copy the info in the dc structure into the coriander struct.
-    camera_ptr->camera_info=dc1394_camera_new(dc1394,camera_list->ids[i].guid);
+    camera_ptr->camera_info=camera;
     /*
     gettimeofday(&t2,NULL);
     fprintf(stderr,"%s %s :   %ld ms\n", 
@@ -63,7 +70,7 @@
   // free camera list:
   dc1394_camera_free_list(camera_list);
 
-  return err;
+  return 0;
 }
 
 camera_t*
--- a/src/tools.c
+++ b/src/tools.c
@@ -573,7 +573,7 @@
 bus_reset_handler(raw1394handle_t handle, unsigned int generation)
 {
 
-  int i;
+  int i, err;
   camera_t *camera_ptr;
   camera_t* new_camera;
   dc1394camera_list_t *new_camera_list;
@@ -590,11 +590,12 @@
   // Now we have to deal with this bus reset...
 
   // get camera guids:
-  dc1394_camera_enumerate(dc1394,&new_camera_list);
+  err = dc1394_camera_enumerate(dc1394,&new_camera_list);
 
   // ADD NEW CAMERAS AND UPDATE PREVIOUS ONES ---------------------------------
 
   // try to match the GUID with previous cameras
+  if(err == DC1394_SUCCESS)
   for (i=0;i<new_camera_list->num;i++) {
     // was the current GUID already there?
     camera_ptr=cameras;
@@ -606,8 +607,12 @@
     }
 
     if (camera_ptr==NULL) { // the camera is new, add it
+      dc1394camera_t *new_handle = dc1394_camera_new(dc1394, new_camera_list->ids[i].guid);
+      if(!new_handle)
+        continue;
+
       new_camera=NewCamera();
-      new_camera->camera_info=dc1394_camera_new(dc1394,new_camera_list->ids[i].guid);
+      new_camera->camera_info=new_handle;
       GetCameraData(new_camera);
 
       AppendCamera(new_camera);
@@ -622,11 +627,15 @@
   // look if there is a camera that disappeared from the camera_t struct
   camera_ptr=cameras;
   while (camera_ptr!=NULL) {
+    int found = 0;
+    if(err == DC1394_SUCCESS)
     for (i=0;i<new_camera_list->num;i++) {
-      if (camera_ptr->camera_info->guid==new_camera_list->ids[i].guid)
+      if (camera_ptr->camera_info->guid==new_camera_list->ids[i].guid) {
+        found = 1;
 	break;
+      }
     }
-    if (camera_ptr->camera_info->guid!=new_camera_list->ids[i].guid) { // the camera "camera_ptr" was unplugged
+    if (!found) { // the camera "camera_ptr" was unplugged
       if (camera->camera_info->guid!=camera_ptr->camera_info->guid) { // it was the current camera
 	if ((camera->next==NULL)&&(cameras==camera)) { // it was also the only camera. Close GUI and revert to camera wait prompt
 	  waiting_camera_window=create_waiting_camera_window();
@@ -687,7 +696,7 @@
   */
 
 
-  if (new_camera_list->num>0) {
+  if (err == DC1394_SUCCESS && new_camera_list->num>0) {
     //eprint("build/refresh GUI\n");
     if (waiting_camera_window!=NULL) {
       gtk_widget_destroy(GTK_WIDGET(waiting_camera_window));
@@ -717,7 +726,8 @@
   // set ISO channels
   // SetIsoChannels();
 
-  dc1394_camera_free_list(new_camera_list);
+  if(err == DC1394_SUCCESS)
+    dc1394_camera_free_list(new_camera_list);
 
   return(1);
 }
