Blob Blame History Raw
Index: /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_middatafile.cpp
===================================================================
--- /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_middatafile.cpp	(revision 20796)
+++ /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_middatafile.cpp	(revision 20818)
@@ -212,4 +212,8 @@
         else
         {
+            // skip leading spaces
+            while(pszLine && (*pszLine == ' ' || *pszLine == '\t') )
+                pszLine++;
+
             strncpy(m_szLastRead,pszLine,MIDMAXCHAR);
         }
Index: /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp
===================================================================
--- /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp	(revision 20797)
+++ /trunk/gdal/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp	(revision 20818)
@@ -471,5 +471,5 @@
 int MIFFile::ParseMIFHeader()
 {  
-    GBool  bColumns = FALSE, bDataFound = FALSE;
+    GBool  bColumns = FALSE, bAllColumnsRead =  FALSE;
     int    nColumns = 0;
     GBool  bCoordSys = FALSE;
@@ -498,15 +498,7 @@
      * Parse header until we find the "Data" line
      *----------------------------------------------------------------*/
-    while (((pszLine = m_poMIFFile->GetLine()) != NULL))
-    {
-        while(pszLine && (*pszLine == ' ' || *pszLine == '\t') )
-            pszLine++;  // skip leading spaces
-
-        if( EQUALN(pszLine,"Data",4) && !bColumns )
-        {
-            bDataFound = TRUE;
-            break;
-        }
-
+    while (((pszLine = m_poMIFFile->GetLine()) != NULL) &&
+           ((bAllColumnsRead == FALSE) || !EQUALN(pszLine,"Data",4)))
+    {       
         if (bColumns == TRUE && nColumns >0)
         {
@@ -514,6 +506,9 @@
             {
                 nColumns--;
-                if (nColumns == 0)
+                if (nColumns == 0) 
+                {
+                  bAllColumnsRead = TRUE;
                   bColumns = FALSE;
+                }
             }
             else
@@ -618,4 +613,10 @@
                 nColumns = atoi(papszToken[1]);
                 m_nAttribut = nColumns;
+                if (nColumns == 0)
+                {
+                    // Permit to 0 columns
+                    bAllColumnsRead = TRUE;
+                    bColumns = FALSE;
+                }            
             }
             else
@@ -638,5 +639,14 @@
     }
     
-    if ( !bDataFound )
+    if (!bAllColumnsRead) 
+    {
+        CPLError(CE_Failure, CPLE_NotSupported,
+                 "COLUMNS keyword not found or invalid number of columns read in %s.  File may be corrupt.",
+                 m_pszFname);
+        return -1;
+    }
+
+    if ((pszLine = m_poMIFFile->GetLastLine()) == NULL || 
+        EQUALN(m_poMIFFile->GetLastLine(),"DATA",4) == FALSE)
     {
         CPLError(CE_Failure, CPLE_NotSupported,