[netcdfgroup] NetCDF-3 file format changes

Mario Emmenlauer mario at emmenlauer.de
Tue Feb 26 16:09:05 MST 2008


Hi,

Roy Mendelssohn wrote:
> See http://www.unidata.ucar.edu/software/netcdf/docs/faq.html#Large%20File%20Support0. 
>  It has been possible since netcdf3.6

with severe bugs, as posted by me to this mailing list on 09/12/2007
(i.e. [netcdfgroup] possible bug in 3.6.2 with variables > 4GB).
For variable types NC_BYTE, NC_CHAR and NC_SHORT it crashes badly.

I have actually never received an answer to my bug report, don't know
why nobody cared :-/

BTW: below is an attached copy of the old mail

Cheers,

    Mario

----
I hope this bug hasn't been filed before, I couldn't find it
on the list via a quick check.

This concerns writing large (>4GB) variables in netcdf with
large-file-support. In netcdf-3.6.2/libsrc/var.c around line
400 it reads:

if( varp->xsz <= X_UINT_MAX / product )
   /* if integer multiply will not overflow */
{
   varp->len = product * varp->xsz;
} else {
   /* OK for last var to be "too big", indicated by this special len */
   varp->len = X_UINT_MAX;
}
switch(varp->type) {
   case NC_BYTE :
   case NC_CHAR :
   case NC_SHORT :
     if( varp->len%4 != 0 )
     {
       varp->len += 4 - varp->len%4; /* round up */
       /* *dsp += 4 - *dsp%4; */
     }
   break;
   default:
   /* already aligned */
     break;
}

In the case of NC_BYTE, NC_CHAR and NC_SHORT, varp->len will end
up being X_UINT_MAX+1 instead of X_UINT_MAX. This in turn causes
an assertion when calling ncx_put_size_t later:
ncx.c:1812: ncx_put_size_t: Assertion `*ulp <= 4294967295U' failed.

I could not think about a useful fix despite qualifying the
rounding with the product-overflow (just moved the else-part
further down):

if( varp->xsz <= X_UINT_MAX / product )
   /* if integer multiply will not overflow */
{
   varp->len = product * varp->xsz;
   switch(varp->type) {
     case NC_BYTE :
     case NC_CHAR :
     case NC_SHORT :
       if( varp->len%4 != 0 )
       {
         varp->len += 4 - varp->len%4; /* round up */
         /* *dsp += 4 - *dsp%4; */
       }
     break;
     default:
     /* already aligned */
       break;
   }
} else {
   /* OK for last var to be "too big", indicated by this special len */
   varp->len = X_UINT_MAX;
}

I hope this bug report is useful. If you can send me a better
patch against netcdf-3.6.2 I would highly appreciate it.

Cheers,

   Mario Emmenlauer
----


> On Feb 26, 2008, at 1:11 PM, Joe Sirott wrote:
> 
>> Hi,
>>
>> In the "classic" netCDF file format (netCDF-3), a variable without a 
>> record dimension cannot be larger than 2GB. This limitation has been 
>> giving me a lot of headaches lately. I know that netCDF-4 is supposed to 
>> solve this problem, but there are a number of reasons why netCDF-4 is 
>> not a good option for me (no Java write support, for one).
>>
>> I could be missing something, but it seems like a very small change to 
>> the netCDF-3 file format would solve this problem. The only requirement 
>> would  be changing the variable size info in the netCDF header from a 32 
>> bit to a 64 bit int (and, of course, updating the version info in the 
>> header).
>>
>> I'm guessing that I'm not the only netCDF user who has run into this 
>> problem and who is also reluctant to move to netCDF-4. Any possibility 
>> that Unidata could make these changes?
>>
>> Cheers,
>>
>> Joe S.
>>
>>
>> _______________________________________________
>> netcdfgroup mailing list
>> netcdfgroup at unidata.ucar.edu <mailto:netcdfgroup at unidata.ucar.edu>
>> For list information or to unsubscribe,  visit: 
>> http://www.unidata.ucar.edu/mailing_lists/ 
> 
> **********************
> "The contents of this message do not reflect any position of the U.S. 
> Government or NOAA."
> **********************
> Roy Mendelssohn
> Supervisory Operations Research Analyst
> NOAA/NMFS
> Environmental Research Division
> Southwest Fisheries Science Center
> 1352 Lighthouse Avenue
> Pacific Grove, CA 93950-2097
> 
> e-mail: Roy.Mendelssohn at noaa.gov <mailto:Roy.Mendelssohn at noaa.gov> (Note 
> new e-mail address)
> voice: (831)-648-9029
> fax: (831)-648-8440
> www: http://www.pfeg.noaa.gov/
> 
> "Old age and treachery will overcome youth and skill."
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> netcdfgroup mailing list
> netcdfgroup at unidata.ucar.edu
> For list information or to unsubscribe,  visit: http://www.unidata.ucar.edu/mailing_lists/ 



More information about the netcdfgroup mailing list