Changeset 11303

Show
Ignore:
Timestamp:
04/20/07 10:27:57 (2 years ago)
Author:
dron
Message:

Added number of buffer size checks to prevent overruns.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/frmts/hfa/hfa_p.h

    r10645 r11303  
    306306                     const char *pszPrefix = NULL ); 
    307307     
    308     int         GetInstBytes( GByte * pabyData ); 
     308    int         GetInstBytes( GByte *, int ); 
    309309    int         GetInstCount( GByte * pabyData ); 
    310310}; 
     
    336336    void        Dump( FILE * ); 
    337337 
    338     int         GetInstBytes( GByte * pabyData ); 
     338    int         GetInstBytes( GByte *, int ); 
    339339    int         GetInstCount( const char *pszField,  
    340340                          GByte *pabyData, GUInt32 nDataOffset, int nDataSize); 
  • trunk/gdal/frmts/hfa/hfafield.cpp

    r10645 r11303  
    647647            { 
    648648                for( iIndexCounter = 0; 
    649                      iIndexCounter < nIndexValue
     649                     iIndexCounter < nIndexValue && nExtraOffset < nDataSize
    650650                     iIndexCounter++ ) 
    651651                { 
    652652                    nExtraOffset += 
    653                         poItemObjectType->GetInstBytes(pabyData+nExtraOffset); 
     653                        poItemObjectType->GetInstBytes(pabyData + nExtraOffset, 
     654                                                       nDataSize - nExtraOffset); 
    654655                } 
    655656            } 
    656657 
    657             if( pszField != NULL && strlen(pszField) > 0 ) 
     658            if( pszField != NULL && strlen(pszField) > 0 
     659                && nExtraOffset < nDataSize ) 
    658660            { 
    659661                return( poItemObjectType-> 
     
    916918                { 
    917919                    nExtraOffset += 
    918                         poItemObjectType->GetInstBytes(pabyData+nExtraOffset); 
     920                        poItemObjectType->GetInstBytes(pabyData + nExtraOffset, 
     921                                                       nDataSize - nExtraOffset); 
    919922                } 
    920923            } 
     
    985988/************************************************************************/ 
    986989 
    987 int HFAField::GetInstBytes( GByte * pabyData
     990int HFAField::GetInstBytes( GByte *pabyData, int nDataSize
    988991 
    989992{ 
     
    10341037            int nThisBytes; 
    10351038 
    1036             nThisBytes = poItemObjectType->GetInstBytes( pabyData ); 
     1039            nThisBytes = 
     1040                poItemObjectType->GetInstBytes( pabyData, 
     1041                                                nDataSize - nInstBytes ); 
    10371042            nInstBytes += nThisBytes; 
    10381043            pabyData += nThisBytes; 
  • trunk/gdal/frmts/hfa/hfatype.cpp

    r10645 r11303  
    232232/* -------------------------------------------------------------------- */ 
    233233    nByteOffset = 0; 
    234     for( iField = 0; iField < nFields; iField++ ) 
     234    for( iField = 0; iField < nFields && nByteOffset < nDataSize; iField++ ) 
    235235    { 
    236236        if( EQUALN(pszFieldPath,papoFields[iField]->pszFieldName,nNameLen) 
     
    240240        } 
    241241 
    242         nByteOffset += papoFields[iField]->GetInstBytes(pabyData+nByteOffset); 
    243     } 
    244  
    245     if( iField == nFields ) 
     242        nByteOffset += 
     243            papoFields[iField]->GetInstBytes( pabyData+nByteOffset, 
     244                                              nDataSize - nByteOffset ); 
     245    } 
     246 
     247    if( iField == nFields || nByteOffset >= nDataSize ) 
    246248        return CE_Failure; 
    247249 
     
    303305/* -------------------------------------------------------------------- */ 
    304306    nByteOffset = 0; 
    305     for( iField = 0; iField < nFields; iField++ ) 
     307    for( iField = 0; iField < nFields && nByteOffset < nDataSize; iField++ ) 
    306308    { 
    307309        if( EQUALN(pszFieldPath,papoFields[iField]->pszFieldName,nNameLen) 
     
    311313        } 
    312314 
    313         nByteOffset += papoFields[iField]->GetInstBytes(pabyData+nByteOffset); 
    314     } 
    315  
    316     if( iField == nFields ) 
     315        nByteOffset += 
     316            papoFields[iField]->GetInstBytes( pabyData + nByteOffset, 
     317                                              nDataSize - nByteOffset ); 
     318    } 
     319 
     320    if( iField == nFields || nByteOffset >= nDataSize ) 
    317321        return -1; 
    318322 
     
    385389/* -------------------------------------------------------------------- */ 
    386390    nByteOffset = 0; 
    387     for( iField = 0; iField < nFields; iField++ ) 
     391    for( iField = 0; iField < nFields && nByteOffset < nDataSize; iField++ ) 
    388392    { 
    389393        if( EQUALN(pszFieldPath,papoFields[iField]->pszFieldName,nNameLen) 
     
    393397        } 
    394398 
    395         nByteOffset += papoFields[iField]->GetInstBytes(pabyData+nByteOffset); 
    396     } 
    397  
    398     if( iField == nFields ) 
     399        nByteOffset += 
     400            papoFields[iField]->GetInstBytes( pabyData + nByteOffset, 
     401                                              nDataSize - nByteOffset ); 
     402    } 
     403 
     404    if( iField == nFields || nByteOffset >= nDataSize ) 
    399405        return FALSE; 
    400406 
     
    416422 
    417423void HFAType::DumpInstValue( FILE * fpOut, 
    418                            GByte *pabyData, GUInt32 nDataOffset, int nDataSize
    419                            const char * pszPrefix ) 
     424                             GByte *pabyData, GUInt32 nDataOffset
     425                             int nDataSize, const char * pszPrefix ) 
    420426 
    421427{ 
    422428    int         iField; 
    423429     
    424     for( iField = 0; iField < nFields; iField++ ) 
     430    for ( iField = 0; iField < nFields && nDataSize > 0; iField++ ) 
    425431    { 
    426432        HFAField        *poField = papoFields[iField]; 
     
    430436                                nDataSize, pszPrefix ); 
    431437 
    432         nInstBytes = poField->GetInstBytes( pabyData ); 
     438        nInstBytes = poField->GetInstBytes( pabyData, nDataSize ); 
    433439 
    434440        pabyData += nInstBytes; 
     
    444450/************************************************************************/ 
    445451 
    446 int HFAType::GetInstBytes( GByte * pabyData
     452int HFAType::GetInstBytes( GByte *pabyData, int nDataSize
    447453 
    448454{ 
     
    454460        int     iField; 
    455461     
    456         for( iField = 0; iField < nFields; iField++ ) 
     462        for( iField = 0; iField < nFields && nTotal < nDataSize; iField++ ) 
    457463        { 
    458464            HFAField    *poField = papoFields[iField]; 
    459             int         nInstBytes; 
    460  
    461             nInstBytes = poField->GetInstBytes( pabyData ); 
     465 
     466            int nInstBytes = poField->GetInstBytes( pabyData, 
     467                                                    nDataSize - nTotal ); 
    462468 
    463469            pabyData += nInstBytes;