1#include <nc_tests.h>
2#include "err_macros.h"
3#include <stdio.h>
4#include <stdlib.h>
5#include <netcdf.h>
6
7#define FILENAME "tst_fillbug.nc"
8
9static int count_udtypes(int ncid);
10
11int
12main(int argc, char **argv)
13{/* create file that caused seg fault in ncdump */
14
15    int  ncid;  /* netCDF id */
16
17    /* dimension ids */
18    int Time_dim;
19    int X_dim;
20    int Y_dim;
21
22    /* dimension lengths */
23    size_t Time_len = NC_UNLIMITED;
24    size_t X_len = 4;
25    size_t Y_len = 3;
26
27    /* variable ids */
28    int Time_id;
29    int P_id;
30
31    /* rank (number of dimensions) for each variable */
32#   define RANK_Time 1
33#   define RANK_P 3
34
35    /* variable shapes */
36    int Time_dims[RANK_Time];
37    int P_dims[RANK_P];
38
39   printf("\n*** Testing preparation of fillbug test.\n");
40   printf("*** creating fillbug test file %s...", FILENAME);
41
42    /* enter define mode */
43    if (nc_create(FILENAMENC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
44
45    /* define dimensions */
46    if (nc_def_dim(ncid, "Time", Time_len, &Time_dim)) ERR;
47    if (nc_def_dim(ncid, "X", X_len, &X_dim)) ERR;
48    if (nc_def_dim(ncid, "Y", Y_len, &Y_dim)) ERR;
49
50    /* define variables */
51
52    Time_dims[0] = Time_dim;
53    if (nc_def_var(ncid, "Time", NC_DOUBLERANK_TimeTime_dims, &Time_id)) ERR;
54
55    P_dims[0] = Time_dim;
56    P_dims[1] = Y_dim;
57    P_dims[2] = X_dim;
58    if (nc_def_var(ncid, "P", NC_FLOATRANK_PP_dims, &P_id)) ERR;
59
60    /* leave define mode */
61    if (nc_enddef (ncid)) ERR;
62
63    {/* assign variable data */
64    static double Time_data[1]={3.14159};
65    static size_t Time_startset[1] = {0};
66    static size_t Time_countset[1] = {1};
67    if (nc_put_vara(ncidTime_idTime_startsetTime_countsetTime_data)) ERR;
68    }
69
70    if (nc_close(ncid)) ERR;
71
72    /* Try to duplicate segfault ncdump gets by making the same calls
73     * to the netCDF-4 library, in the same order.  This doesn't
74     * result in the same segfault, so either we have missed a call
75     * made by ncdump, or an earlier ncdump bug masks the real problem
76     * until a call is made into the netCDF-4 library ...  */
77    if (nc_open(FILENAMENC_NOWRITE, &ncid)) ERR;
78
79    {
80 /* We declare local arrays with small constant sizes to avoid
81  * all the mallocs and frees used in ncdump.  For the example
82  * above, the fixed-size arrays are ample. */
83 int formatndimsnvarsngattsxdimidndims_grpdimids_grp[3],
84     unlimids[1], d_grpnunlimnvars_grpvarids_grp[3], v_grp,
85     varidvarndimsvardims[3], varnattsvartypedimids[3], is_recvar,
86     vdims[3], idntypesnumgrps;
87 size_t dimsizelen;
88 char dimname[20], varname[20];
89 if ( nc_inq_format(ncid, &format)) ERR;
90 ntypes = count_udtypes(ncid);
91 if ( nc_inq_typeids(ncid, &ntypesNULL) ) ERR;
92 if ( nc_inq_format(ncid, &format)) ERR;
93 if ( nc_inq_grps(ncid, &numgrpsNULL) ) ERR;
94 if ( nc_inq_typeids(ncid, &ntypesNULL) ) ERR;
95 if ( nc_inq(ncid, &ndims, &nvars, &ngatts, &xdimid) ) ERR;
96 if ( nc_inq_ndims(ncid, &ndims_grp) ) ERR;
97 if ( nc_inq_dimids(ncid, 0, dimids_grp, 0) ) ERR;
98 if ( nc_inq_unlimdims(ncid, &nunlimNULL) ) ERR;
99 if ( nc_inq_unlimdims(ncid, &nunlimunlimids) ) ERR;
100 for (d_grp = 0; d_grp < ndims_grpd_grp++) {
101     int dimid = dimids_grp[d_grp];
102     if ( nc_inq_dim(nciddimiddimname, &dimsize) ) ERR;
103 }
104 if ( nc_inq_format(ncid, &format) ) ERR;
105 if ( nc_inq_varids(ncid, &nvars_grpvarids_grp) ) ERR;
106 for (v_grp = 0; v_grp < nvars_grpv_grp++) {
107     varid = varids_grp[v_grp];
108     if ( nc_inq_varndims(ncidvarid, &varndims) ) ERR;
109     if ( nc_inq_var(ncidvaridvarname, &vartype, 0, vardims,
110     &varnatts) ) ERR;
111     for (id = 0; id < varndimsid++) {
112 if ( nc_inq_dimname(ncidvardims[id], dimname) ) ERR;
113     }
114 }
115 for (v_grp = 0; v_grp < nvars_grpv_grp++) {
116     varid = varids_grp[v_grp];
117     if( nc_inq_varndims(ncidvarid, &varndims) ) ERR;
118     if( nc_inq_var(ncidvaridvarname, &vartype, 0, vardims,
119    &varnatts) ) ERR;
120     {
121 is_recvar = 0;
122 if ( nc_inq_varndims(ncidvarid, &ndims) ) ERR;
123 if (ndims > 0) {
124     int nunlimdims;
125     int recdimids[3];
126     int dimrecdim;
127     if ( nc_inq_vardimid(ncidvariddimids) ) ERR;
128     if ( nc_inq_unlimdims(ncid, &nunlimdimsNULL) ) ERR;
129     if ( nc_inq_unlimdims(ncidNULLrecdimids) ) ERR;
130     for (dim = 0; dim < ndims && is_recvar == 0; dim++) {
131 for(recdim = 0; recdim < nunlimdimsrecdim++) {
132     if(dimids[dim] == recdimids[recdim]) {
133 is_recvar = 1;
134 break;
135     }
136 }
137     }
138 }
139     }
140     for (id = 0; id < varndimsid++) {
141 if( nc_inq_dimlen(ncidvardims[id], &len) ) ERR;
142 vdims[id] = len;
143     }
144     if (varid == 0) {
145 /* read Time variable */
146 static double Time_data;
147 static size_t cor[RANK_Time] = {0};
148 static size_t edg[RANK_Time] = {1};
149 if (nc_get_vara(ncidvaridcoredg, &Time_data)) ERR;
150     } else {
151 /* read data slices from P variable, should get fill values */
152 static float P_data[4];
153 static size_t cor[RANK_P] = {0, 0, 0};
154 static size_t edg[RANK_P] = {1, 1, 4};
155
156 /* first slice retrieved OK */
157 if (nc_get_vara(ncidvaridcoredgP_data)) ERR;
158
159 /* In ncdump, reading second slice gets seg fault in
160  * nc4_open_var_grp(), but this attempt to do all the
161  * same netCDF calls as ncdump can't duplicate the
162  * error, which would seem to implicate ncdump rather
163  * than HDF5 or netCDF-4 library ... */
164 cor[1] = 1;
165 if (nc_get_vara(ncidvaridcoredgP_data)) ERR;
166     }
167 }
168    }
169    if (nc_close(ncid)) ERR;
170
171   SUMMARIZE_ERR;
172   FINAL_RESULTS;
173}
174
175/* return number of user-defined types in a group and all its subgroups */
176static int
177count_udtypes(int ncid) {
178    int ntypes = 0;
179    int numgrps;
180    int *ncids;
181    int i;
182    int format;
183
184    if( nc_inq_format(ncid, &format) ) ERR;
185
186    if (format == NC_FORMAT_NETCDF4) {
187 /* Get number of types in this group */
188 if( nc_inq_typeids(ncid, &ntypesNULL) ) ERR;
189 if( nc_inq_grps(ncid, &numgrpsNULL) ) ERR;
190 ncids = (int *) malloc(sizeof(int) * numgrps);
191 if( nc_inq_grps(ncidNULLncids) ) ERR;
192 /* Add number of types in each subgroup, if any */
193 for (i=0; i < numgrpsi++) {
194     ntypes += count_udtypes(ncids[i]);
195 }
196    }
197    return ntypes;
198}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed