Index: trunk/psModules/src/camera/pmFPARead.c
===================================================================
--- trunk/psModules/src/camera/pmFPARead.c	(revision 25738)
+++ trunk/psModules/src/camera/pmFPARead.c	(revision 25754)
@@ -387,4 +387,5 @@
                 psFree(regionString);
                 psFree(readout);
+		psFree(iter);
                 return false;
             }
Index: trunk/psModules/src/camera/pmHDUGenerate.c
===================================================================
--- trunk/psModules/src/camera/pmHDUGenerate.c	(revision 25738)
+++ trunk/psModules/src/camera/pmHDUGenerate.c	(revision 25754)
@@ -611,4 +611,5 @@
             if (cells->n == 0) {
                 // Nothing to do
+		psFree (cells);
                 return true;
             }
@@ -660,4 +661,5 @@
             if (cells->n == 0) {
                 // Nothing to do
+		psFree (cells);
                 return true;
             }
@@ -707,8 +709,11 @@
             if (cells->n == 0) {
                 // Nothing to do
+		psFree (cells);
                 return true;
             }
-
-            return generateHDU(hdu, cells);
+	    
+	    bool status = generateHDU(hdu, cells);
+	    psFree (cells);
+            return status;
         }
     default:
Index: trunk/psModules/src/camera/pmReadoutFake.c
===================================================================
--- trunk/psModules/src/camera/pmReadoutFake.c	(revision 25738)
+++ trunk/psModules/src/camera/pmReadoutFake.c	(revision 25754)
@@ -97,4 +97,17 @@
                 continue;
             }
+	    // check that all params are valid:
+	    bool validParams = true;
+	    for (int n = 0; validParams && (n < normModel->params->n); n++) {
+		if (n == PM_PAR_SKY) continue;
+		if (n == PM_PAR_I0) continue;
+		if (n == PM_PAR_XPOS) continue;
+		if (n == PM_PAR_YPOS) continue;
+		if (!isfinite(normModel->params->data.F32[n])) validParams = false;
+	    }
+	    if (!validParams) {
+                psFree(normModel);
+		continue;
+	    }		
             if (circularise && !circulariseModel(normModel)) {
                 psError(PS_ERR_UNKNOWN, false, "Unable to circularise PSF model.");
@@ -112,4 +125,17 @@
             continue;
         }
+	// check that all params are valid:
+	bool validParams = true;
+	for (int n = 0; validParams && (n < fakeModel->params->n); n++) {
+	    if (n == PM_PAR_SKY) continue;
+	    if (n == PM_PAR_I0) continue;
+	    if (n == PM_PAR_XPOS) continue;
+	    if (n == PM_PAR_YPOS) continue;
+	    if (!isfinite(fakeModel->params->data.F32[n])) validParams = false;
+	}
+	if (!validParams) {
+	    psFree(fakeModel);
+	    continue;
+	}		
         if (circularise && !circulariseModel(fakeModel)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to circularise PSF model.");
