Bug in ncdump

Hello,

Here is a bug found in ncdump utility delivered with netCDF V3.6.0.

The bug appears when attributes have a zero length. In this case, it tries
to show them as 0 length string but the way it is implemented is buggy.
The value shown depends on the non empty preceding attribute. If it is
a string, the first letter of this string is repeated as the value
of all empty  following attributes (due to a reuse of allocated
data not initialized).

Below is an exemple (the last 3 attributes have 0 values):

     :Data_provider = "Data provider" ;
     :Experiment_name = "D" ;
     :Project_name = "D" ;
     :Experiment_description = "D" ;

Notice that it also depends on the OS and compiler (or libc). On
Linux/gcc it appears, on Solaris/Workshop C it does not.

There is another problem when printing control characters (bug or not ?)
as attributes: except for a few of them (\r\f...) the other are printer 'as is'
and make the output file mainly unreadable (by eyes, not by ncgen).

You can find joined a patch which can be used to correct these
problems (I did also make it for CVS version 1.9 and 1.10).

Cheers,
Ph. Poilbarbe.

CLS - Space Oceanography Group
mailto:Philippe.Poilbarbe@xxxxxx
http://www.cls.fr

--- ncdump.c.orig       2004-11-16 22:38:16.000000000 +0100
+++ ncdump.c    2005-01-13 09:41:35.200874000 +0100
@@ -2,6 +2,7 @@
  *   Copyright 1993, University Corporation for Atmospheric Research
  *   See netcdf/README file for copying and redistribution conditions.
  *   $Header: /upc/share/CVS/netcdf-3/ncdump/ncdump.c,v 1.12 2004/11/16 
21:38:16 russ Exp $
+ *     2004/01/29: Ph. Poilbarbe: Corrected for 0 length attributes and 
control characters
  *********************************************************************/
 
 #include <stdio.h>
@@ -197,7 +198,10 @@
            Printf ("\\\"");
            break;
        default:
-           Printf ("%c",uc);
+           if (iscntrl(uc))
+               Printf("\\%03o",uc);
+           else
+               Printf ("%c",uc);
            break;
        }
     Printf ("\"");
@@ -306,11 +310,10 @@
 
     if (att.len == 0) {        /* show 0-length attributes as empty strings */
        att.type = NC_CHAR;
-       att.len = 1;
     }
     switch (att.type) {
     case NC_CHAR:
-       att.string = (char *) malloc(att.len);
+       att.string = (char *) malloc(att.len+1);
        if (!att.string) {
            error("Out of memory!");
            NC_CHECK( nc_close(ncid) );
  • 2005 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: