Ticket #2196: netcdf.1.4.4.patch

File netcdf.1.4.4.patch, 5.8 kB (added by mariocruz, 5 months ago)

netcdfdataset.cpp and netcdfdataset.h patch (1.4 branch)

  • gdal-1.4.4/frmts/netcdf/netcdfdataset.cpp

    old new  
    12361236/************************************************************************/ 
    12371237/*                        ReadAttributes()                              */ 
    12381238/************************************************************************/ 
     1239CPLErr netCDFDataset::SafeStrcat(char** ppszDest, char* pszSrc, size_t* nDestSize) 
     1240{ 
     1241    /* Reallocate the data string until the content fits */ 
     1242    while(*nDestSize < (strlen(*ppszDest) + strlen(pszSrc) + 1)) { 
     1243        (*nDestSize) *= 2; 
     1244        *ppszDest = (char*) CPLRealloc((void*) *ppszDest, *nDestSize); 
     1245    } 
     1246    strcat(*ppszDest, pszSrc); 
     1247     
     1248    return CE_None; 
     1249} 
    12391250 
    12401251CPLErr netCDFDataset::ReadAttributes( int cdfid, int var) 
    12411252 
    12421253{ 
    12431254    char    szAttrName[ NC_MAX_NAME ]; 
    12441255    char    szVarName [ NC_MAX_NAME ]; 
    1245     char    szMetaName[ NC_MAX_NAME ]; 
    1246     char    szMetaTemp[ MAX_STR_LEN ]; 
     1256    char    szMetaName[ NC_MAX_NAME * 2 ]; 
     1257    char    *pszMetaTemp = NULL; 
     1258    size_t  nMetaTempSize; 
    12471259    nc_type nAttrType; 
    1248     size_t  nAttrLen,m; 
     1260    size_t  nAttrLen, m; 
    12491261    int     nbAttr; 
    1250     char    szTemp[ NC_MAX_NAME ]; 
     1262    char    szTemp[ MAX_STR_LEN ]; 
    12511263 
    12521264    nc_inq_varnatts( cdfid, var, &nbAttr ); 
    12531265    if( var == NC_GLOBAL ) { 
     
    12571269        nc_inq_varname(  cdfid, var, szVarName ); 
    12581270    } 
    12591271 
    1260     for( int l=0; l < nbAttr; l++)
     1272    for( int l=0; l < nbAttr; l++)
    12611273         
    12621274        nc_inq_attname( cdfid, var, l, szAttrName); 
    12631275        sprintf( szMetaName, "%s#%s", szVarName, szAttrName  ); 
    1264         *szMetaTemp='\0'; 
    12651276        nc_inq_att( cdfid, var, szAttrName, &nAttrType, &nAttrLen ); 
    12661277         
     1278        /* Allocate guaranteed minimum size */ 
     1279        nMetaTempSize = nAttrLen + 1; 
     1280        pszMetaTemp = (char *) CPLCalloc( nMetaTempSize, sizeof( char )); 
     1281        *pszMetaTemp = '\0'; 
    12671282         
    12681283        switch (nAttrType) { 
    12691284        case NC_CHAR: 
    1270             char *pszTemp; 
    1271             pszTemp = (char *) CPLCalloc( nAttrLen+1, sizeof( char ) ); 
    1272             nc_get_att_text( cdfid, var, szAttrName,pszTemp ); 
    1273             pszTemp[nAttrLen]='\0'; 
    1274             strcpy(szMetaTemp,pszTemp); 
    1275             CPLFree(pszTemp); 
     1285                nc_get_att_text( cdfid, var, szAttrName, pszMetaTemp ); 
     1286                pszMetaTemp[nAttrLen]='\0'; 
    12761287            break; 
    12771288        case NC_SHORT: 
    12781289            short *psTemp; 
    1279              
    12801290            psTemp = (short *) CPLCalloc( nAttrLen, sizeof( short ) ); 
    12811291            nc_get_att_short( cdfid, var, szAttrName, psTemp ); 
    12821292            for(m=0; m < nAttrLen-1; m++) { 
    1283                sprintf( szTemp, "%d, ",psTemp[m] ); 
    1284                strcat(szMetaTemp,szTemp); 
     1293                    sprintf( szTemp, "%hd, ", psTemp[m] ); 
     1294                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    12851295            } 
    1286             sprintf( szTemp, "%d",psTemp[m] ); 
     1296                sprintf( szTemp, "%hd", psTemp[m] ); 
     1297                SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    12871298            CPLFree(psTemp); 
    1288             strcat(szMetaTemp,szTemp); 
    1289              
    12901299            break; 
    12911300        case NC_INT: 
    12921301            int *pnTemp; 
    1293              
    12941302            pnTemp = (int *) CPLCalloc( nAttrLen, sizeof( int ) ); 
    12951303            nc_get_att_int( cdfid, var, szAttrName, pnTemp ); 
    12961304            for(m=0; m < nAttrLen-1; m++) { 
    1297                sprintf( szTemp, "%d",pnTemp[m] ); 
    1298                strcat(szMetaTemp,szTemp); 
     1305                    sprintf( szTemp, "%d, ", pnTemp[m] ); 
     1306                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    12991307            } 
    1300             sprintf( szTemp, "%d",pnTemp[m] ); 
     1308                    sprintf( szTemp, "%d", pnTemp[m] ); 
     1309                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    13011310            CPLFree(pnTemp); 
    1302             strcat(szMetaTemp,szTemp); 
    13031311            break; 
    13041312        case NC_FLOAT: 
    13051313            float *pfTemp; 
    13061314            pfTemp = (float *) CPLCalloc( nAttrLen, sizeof( float ) ); 
    13071315            nc_get_att_float( cdfid, var, szAttrName, pfTemp ); 
    13081316            for(m=0; m < nAttrLen-1; m++) { 
    1309                sprintf( szTemp, "%e",pfTemp[m] ); 
    1310                strcat(szMetaTemp,szTemp); 
     1317                    sprintf( szTemp, "%e, ", pfTemp[m] ); 
     1318                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    13111319            } 
    1312             sprintf( szTemp, "%e",pfTemp[m] ); 
     1320                    sprintf( szTemp, "%e", pfTemp[m] ); 
     1321                    SafeStrcat(&pszMetaTemp,szTemp, &nMetaTempSize); 
    13131322            CPLFree(pfTemp); 
    1314             strcat(szMetaTemp,szTemp); 
    1315              
    13161323            break; 
    13171324        case NC_DOUBLE: 
    13181325            double *pdfTemp; 
    13191326            pdfTemp = (double *) CPLCalloc(nAttrLen, sizeof(double)); 
    13201327            nc_get_att_double( cdfid, var, szAttrName, pdfTemp ); 
    13211328            for(m=0; m < nAttrLen-1; m++) { 
    1322                sprintf( szTemp, "%g",pdfTemp[m] ); 
    1323                strcat(szMetaTemp,szTemp); 
     1329                    sprintf( szTemp, "%g, ", pdfTemp[m] ); 
     1330                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    13241331            } 
    1325             sprintf( szTemp, "%g",pdfTemp[m] ); 
     1332                    sprintf( szTemp, "%g", pdfTemp[m] ); 
     1333                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    13261334            CPLFree(pdfTemp); 
    1327             strcat(szMetaTemp,szTemp); 
    1328              
    13291335            break; 
    13301336        default: 
    13311337            break; 
     
    13331339 
    13341340        papszMetadata = CSLSetNameValue(papszMetadata,  
    13351341                                        szMetaName,  
    1336                                        szMetaTemp); 
    1337          
     1342                                        pszMetaTemp); 
     1343        CPLFree(pszMetaTemp); 
    13381344    } 
    13391345         
    1340  
    13411346    return CE_None; 
    13421347 
    13431348} 
    13441349 
     1350 
    13451351/************************************************************************/ 
    13461352/*                netCDFDataset::CreateSubDatasetList()                 */ 
    13471353/************************************************************************/ 
  • gdal-1.4.4/frmts/netcdf/netcdfdataset.h

    old new  
    155155     
    156156    static GDALDataset *Open( GDALOpenInfo * ); 
    157157 
     158    CPLErr      SafeStrcat(char**, char*, size_t*); 
    158159    CPLErr      ReadAttributes( int, int ); 
    159160 
    160161    CPLErr      GetGeoTransform( double * );