Ticket #2196: netcdf.patch

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

netcdfdataset.cpp and netcdfdataset.h patch

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

    old new  
    10701070/************************************************************************/ 
    10711071/*                        ReadAttributes()                              */ 
    10721072/************************************************************************/ 
     1073CPLErr netCDFDataset::SafeStrcat(char** ppszDest, char* pszSrc, size_t* nDestSize) 
     1074{ 
     1075    /* Reallocate the data string until the content fits */ 
     1076    while(*nDestSize < (strlen(*ppszDest) + strlen(pszSrc))) { 
     1077        (*nDestSize) *= 2; 
     1078        *ppszDest = (char*) CPLRealloc((void*) *ppszDest, *nDestSize); 
     1079    } 
     1080    strcat(*ppszDest, pszSrc); 
     1081     
     1082    return CE_None; 
     1083} 
    10731084 
    10741085CPLErr netCDFDataset::ReadAttributes( int cdfid, int var) 
    10751086 
    10761087{ 
    10771088    char    szAttrName[ NC_MAX_NAME ]; 
    10781089    char    szVarName [ NC_MAX_NAME ]; 
    1079     char    szMetaName[ NC_MAX_NAME ]; 
    1080     char    szMetaTemp[ MAX_STR_LEN ]; 
     1090    char    szMetaName[ NC_MAX_NAME * 2 ]; 
     1091    char    *pszMetaTemp = NULL; 
     1092    size_t  nMetaTempSize; 
    10811093    nc_type nAttrType; 
    1082     size_t  nAttrLen,m; 
     1094    size_t  nAttrLen, m; 
    10831095    int     nbAttr; 
    1084     char    szTemp[ NC_MAX_NAME ]; 
     1096    char    szTemp[ MAX_STR_LEN ]; 
    10851097 
    10861098    nc_inq_varnatts( cdfid, var, &nbAttr ); 
    10871099    if( var == NC_GLOBAL ) { 
     
    10911103        nc_inq_varname(  cdfid, var, szVarName ); 
    10921104    } 
    10931105 
    1094     for( int l=0; l < nbAttr; l++)
     1106    for( int l=0; l < nbAttr; l++)
    10951107         
    10961108        nc_inq_attname( cdfid, var, l, szAttrName); 
    10971109        sprintf( szMetaName, "%s#%s", szVarName, szAttrName  ); 
    1098         *szMetaTemp='\0'; 
    10991110        nc_inq_att( cdfid, var, szAttrName, &nAttrType, &nAttrLen ); 
    11001111         
     1112        /* Allocate guaranteed minimum size */ 
     1113        nMetaTempSize = nAttrLen + 1; 
     1114        pszMetaTemp = (char *) CPLCalloc( nMetaTempSize, sizeof( char )); 
     1115        *pszMetaTemp = '\0'; 
    11011116         
    11021117        switch (nAttrType) { 
    11031118        case NC_CHAR: 
    1104             char *pszTemp; 
    1105             pszTemp = (char *) CPLCalloc( nAttrLen+1, sizeof( char ) ); 
    1106             nc_get_att_text( cdfid, var, szAttrName,pszTemp ); 
    1107             pszTemp[nAttrLen]='\0'; 
    1108             strcpy(szMetaTemp,pszTemp); 
    1109             CPLFree(pszTemp); 
     1119                nc_get_att_text( cdfid, var, szAttrName, pszMetaTemp ); 
     1120                pszMetaTemp[nAttrLen]='\0'; 
    11101121            break; 
    11111122        case NC_SHORT: 
    11121123            short *psTemp; 
    1113              
    11141124            psTemp = (short *) CPLCalloc( nAttrLen, sizeof( short ) ); 
    11151125            nc_get_att_short( cdfid, var, szAttrName, psTemp ); 
    11161126            for(m=0; m < nAttrLen-1; m++) { 
    1117                sprintf( szTemp, "%d, ",psTemp[m] ); 
    1118                strcat(szMetaTemp,szTemp); 
     1127                    sprintf( szTemp, "%hd, ", psTemp[m] ); 
     1128                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11191129            } 
    1120             sprintf( szTemp, "%d",psTemp[m] ); 
     1130                sprintf( szTemp, "%hd", psTemp[m] ); 
     1131                SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11211132            CPLFree(psTemp); 
    1122             strcat(szMetaTemp,szTemp); 
    1123              
    11241133            break; 
    11251134        case NC_INT: 
    11261135            int *pnTemp; 
    1127              
    11281136            pnTemp = (int *) CPLCalloc( nAttrLen, sizeof( int ) ); 
    11291137            nc_get_att_int( cdfid, var, szAttrName, pnTemp ); 
    11301138            for(m=0; m < nAttrLen-1; m++) { 
    1131                sprintf( szTemp, "%d",pnTemp[m] ); 
    1132                strcat(szMetaTemp,szTemp); 
     1139                    sprintf( szTemp, "%d, ", pnTemp[m] ); 
     1140                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11331141            } 
    1134             sprintf( szTemp, "%d",pnTemp[m] ); 
     1142                    sprintf( szTemp, "%d", pnTemp[m] ); 
     1143                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11351144            CPLFree(pnTemp); 
    1136             strcat(szMetaTemp,szTemp); 
    11371145            break; 
    11381146        case NC_FLOAT: 
    11391147            float *pfTemp; 
    11401148            pfTemp = (float *) CPLCalloc( nAttrLen, sizeof( float ) ); 
    11411149            nc_get_att_float( cdfid, var, szAttrName, pfTemp ); 
    11421150            for(m=0; m < nAttrLen-1; m++) { 
    1143                sprintf( szTemp, "%e",pfTemp[m] ); 
    1144                strcat(szMetaTemp,szTemp); 
     1151                    sprintf( szTemp, "%e, ", pfTemp[m] ); 
     1152                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11451153            } 
    1146             sprintf( szTemp, "%e",pfTemp[m] ); 
     1154                    sprintf( szTemp, "%e", pfTemp[m] ); 
     1155                    SafeStrcat(&pszMetaTemp,szTemp, &nMetaTempSize); 
    11471156            CPLFree(pfTemp); 
    1148             strcat(szMetaTemp,szTemp); 
    1149              
    11501157            break; 
    11511158        case NC_DOUBLE: 
    11521159            double *pdfTemp; 
    11531160            pdfTemp = (double *) CPLCalloc(nAttrLen, sizeof(double)); 
    11541161            nc_get_att_double( cdfid, var, szAttrName, pdfTemp ); 
    11551162            for(m=0; m < nAttrLen-1; m++) { 
    1156                sprintf( szTemp, "%g",pdfTemp[m] ); 
    1157                strcat(szMetaTemp,szTemp); 
     1163                    sprintf( szTemp, "%g, ", pdfTemp[m] ); 
     1164                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11581165            } 
    1159             sprintf( szTemp, "%g",pdfTemp[m] ); 
     1166                    sprintf( szTemp, "%g", pdfTemp[m] ); 
     1167                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 
    11601168            CPLFree(pdfTemp); 
    1161             strcat(szMetaTemp,szTemp); 
    1162              
    11631169            break; 
    11641170        default: 
    11651171            break; 
     
    11671173 
    11681174        papszMetadata = CSLSetNameValue(papszMetadata,  
    11691175                                        szMetaName,  
    1170                                        szMetaTemp); 
    1171          
     1176                                        pszMetaTemp); 
     1177        CPLFree(pszMetaTemp); 
    11721178    } 
    11731179         
    11741180 
     
    11761182 
    11771183} 
    11781184 
     1185 
    11791186/************************************************************************/ 
    11801187/*                netCDFDataset::CreateSubDatasetList()                 */ 
    11811188/************************************************************************/ 
  • gdal-1.5.0/frmts/netcdf/netcdfdataset.h

    old new  
    159159     
    160160    static GDALDataset *Open( GDALOpenInfo * ); 
    161161 
     162    CPLErr      SafeStrcat(char**, char*, size_t*); 
    162163    CPLErr      ReadAttributes( int, int ); 
    163164 
    164165    CPLErr      GetGeoTransform( double * );