[GRASS-dev] Fwd: New Defects reported by Coverity Scan for grass

Markus Neteler neteler at osgeo.org
Mon Feb 3 11:49:44 PST 2020


Hi devs,

I have re-run the coverity scan on master, results below.

There is also the option of Travis integration which might be a good idea.
Anyone to support this?

Markus


---------- Forwarded message ---------
From: <scan-admin at coverity.com>
Date: Mon, Feb 3, 2020 at 6:58 PM
Subject: New Defects reported by Coverity Scan for grass
To: <neteler at gmail.com>


Hi,

Please find the latest report on new defect(s) introduced to grass
found with Coverity Scan.

600 new defect(s) introduced to grass found with Coverity Scan.
1 defect(s), reported by Coverity Scan earlier, were marked fixed in
the recent build analyzed by Coverity Scan.

New defect(s) Reported-by: Coverity Scan
Showing 20 of 600 defect(s)


** CID 1415720:  Uninitialized variables  (UNINIT)
/raster/r.geomorphon/pattern.c: 128 in calc_pattern()


________________________________________________________________________________________________________
*** CID 1415720:  Uninitialized variables  (UNINIT)
/raster/r.geomorphon/pattern.c: 128 in calc_pattern()
122                 pattern->negatives += i;
123
124             if (fabs(zenith_angle) > zenith_threshold ||
125                 fabs(nadir_angle) > nadir_threshold) {
126                 if (fabs(nadir_angle) < fabs(zenith_angle)) {
127                     pattern->pattern[i] = 1;
>>>     CID 1415720:  Uninitialized variables  (UNINIT)
>>>     Using uninitialized value "zenith_height".
128                     pattern->elevation[i] = zenith_height;  /* ZMIANA! */
129                     pattern->distance[i] = zenith_distance;
130                     pattern->num_positives++;
131                 }
132                 if (fabs(nadir_angle) > fabs(zenith_angle)) {
133                     pattern->pattern[i] = -1;

** CID 1415719:  Resource leaks  (RESOURCE_LEAK)
/vector/v.info/level1.c: 29 in level_one_info()


________________________________________________________________________________________________________
*** CID 1415719:  Resource leaks  (RESOURCE_LEAK)
/vector/v.info/level1.c: 29 in level_one_info()
23         n_faces = n_kernels = 0;
24
25         Points = Vect_new_line_struct();
26         Cats = Vect_new_cats_struct();
27
28         Vect_rewind(Map);
>>>     CID 1415719:  Resource leaks  (RESOURCE_LEAK)
>>>     Failing to save or free storage allocated by "Vect_get_full_name(Map)" leaks it.
29         G_message(_("Topology not available for vector map <%s>. "
30                     "Registering primitives..."), Vect_get_full_name(Map));
31         while (TRUE) {
32      /* register line */
33      type = Vect_read_next_line(Map, Points, Cats);
34

** CID 1415718:  Resource leaks  (RESOURCE_LEAK)
/display/d.barscale/draw_scale.c: 637 in draw_scale()


________________________________________________________________________________________________________
*** CID 1415718:  Resource leaks  (RESOURCE_LEAK)
/display/d.barscale/draw_scale.c: 637 in draw_scale()
631             D_end();                /* no-op? */
632         }
633         D_stroke();
634
635
636         if (fontsize < 0)
>>>     CID 1415718:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "label" going out of scope leaks the storage it points to.
637             return 0;
638
639         /* draw the distance + units text */
640
641         D_get_text_box(label, &tt, &tb, &tl, &tr);
642

** CID 1415717:  Resource leaks  (RESOURCE_LEAK)
/vector/v.overlay/area_area.c: 493 in area_area()


________________________________________________________________________________________________________
*** CID 1415717:  Resource leaks  (RESOURCE_LEAK)
/vector/v.overlay/area_area.c: 493 in area_area()
487             }
488
489             if (centr[0] || centr[1])
490                 Vect_write_line(Out, GV_BOUNDARY, Points, Cats);
491         }
492
>>>     CID 1415717:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "APoints" going out of scope leaks the storage it points to.
493         return 0;

** CID 1415716:    (STRING_OVERFLOW)
/raster/r.geomorphon/main.c: 504 in main()
/raster/r.geomorphon/main.c: 307 in main()


________________________________________________________________________________________________________
*** CID 1415716:    (STRING_OVERFLOW)
/raster/r.geomorphon/main.c: 504 in main()
498             num_of_steps = 5;
499             multi_patterns = G_malloc(num_of_steps * sizeof(PATTERN));
500             /* prepare outputs */
501             for (i = 0; i < 5; ++i) {
502                 multiple_output[i].forms_buffer =
Rast_allocate_buf(CELL_TYPE);
503                 strcpy(multiple_output[i].name, prefix);
>>>     CID 1415716:    (STRING_OVERFLOW)
>>>     You might overrun the 100-character fixed-size string "multiple_output[i].name" by copying "postfixes[i]" without checking the length.
504                 strcat(multiple_output[i].name, postfixes[i]);
505                 multiple_output[i].fd =
506                     Rast_open_new(multiple_output[i].name, CELL_TYPE);
507             }
508
509             /* main loop */
/raster/r.geomorphon/main.c: 307 in main()
301
302         /* generate global ternary codes */
303         for (i = 0; i < 6561; ++i)
304             global_ternary_codes[i] = ternary_rotate(i);
305
306         /* open DEM */
>>>     CID 1415716:    (STRING_OVERFLOW)
>>>     You might overrun the 150-character fixed-size string "elevation.elevname" by copying "opt_input->answer" without checking the length.
307         strcpy(elevation.elevname, opt_input->answer);
308         open_map(&elevation);
309
310         if (!multires) {
311             PATTERN *pattern;
312             PATTERN patterns[4];

** CID 1415715:  Memory - illegal accesses  (UNINIT)
/raster/r.fill.stats/main.c: 1111 in main()


________________________________________________________________________________________________________
*** CID 1415715:  Memory - illegal accesses  (UNINIT)
/raster/r.fill.stats/main.c: 1111 in main()
1105             data_type_string_out = "double";
1106         }
1107
1108         /* initialize data type dependent cell handling functions */
1109         init_cell_funcs();
1110
>>>     CID 1415715:  Memory - illegal accesses  (UNINIT)
>>>     Using uninitialized value "data_type_string_in" when calling "G_message".
1111         G_message(_("Input data type is '%s' (%i bytes) and
output data type is '%s' (%i bytes)."),
1112                   data_type_string_in, CELL_IN_SIZE, data_type_string_out,
1113                   CELL_OUT_SIZE);
1114
1115         /* just print projected mem usage if user wants it so */
1116         G_message("Minimal estimated memory usage is %.3f MB.",

** CID 1415714:    (TAINTED_SCALAR)
/raster/r.clump/clump.c: 105 in do_renumber()
/raster/r.clump/clump.c: 157 in do_renumber()


________________________________________________________________________________________________________
*** CID 1415714:    (TAINTED_SCALAR)
/raster/r.clump/clump.c: 105 in do_renumber()
99              G_fatal_error(_("Unable to read from temp file"));
100
101                 temp_clump = cur_clump;
102
103                 do_write = 0;
104                 for (col = 0; col < ncols; col++) {
>>>     CID 1415714:    (TAINTED_SCALAR)
>>>     Using tainted variable "*temp_clump" as an index to pointer "index".
105                     new_clump = clumpid[index[*temp_clump]];
106                     if (*temp_clump != new_clump) {
107                         *temp_clump = new_clump;
108                         do_write = 1;
109                     }
110                     temp_clump++;
/raster/r.clump/clump.c: 157 in do_renumber()
151                 G_fatal_error(_("Unable to read from temp file"));
152
153             temp_clump = cur_clump;
154             temp_cell = out_cell;
155
156             for (col = 0; col < ncols; col++) {
>>>     CID 1415714:    (TAINTED_SCALAR)
>>>     Using tainted variable "*temp_clump" as an index to pointer "index".
157                 *temp_cell = clumpid[index[*temp_clump]];
158                 if (*temp_cell == 0) {
159                     Rast_set_c_null_value(temp_cell, 1);
160                 }
161                 temp_clump++;
162                 temp_cell++;

** CID 1415713:  Insecure data handling  (TAINTED_SCALAR)


________________________________________________________________________________________________________
*** CID 1415713:  Insecure data handling  (TAINTED_SCALAR)
/lib/vector/Vlib/read_nat.c: 226 in V2_read_next_line_nat()
220                 if (!Vect_box_overlap(&lbox, &mbox))
221                     continue;
222             }
223
224             if (line_c && Map->constraint.field_flag) {
225                 /* skip feature by field */
>>>     CID 1415713:  Insecure data handling  (TAINTED_SCALAR)
>>>     Passing tainted variable "line_c->n_cats" to a tainted sink.
226                 if (Vect_cat_get(line_c, Map->constraint.field, NULL) == 0)
227                     continue;
228             }
229
230             return ret;
231         }

** CID 1415712:  API usage errors  (PRINTF_ARGS)


________________________________________________________________________________________________________
*** CID 1415712:  API usage errors  (PRINTF_ARGS)
/lib/psdriver/erase.c: 6 in PS_Erase()
0     }
1     #include "psdriver.h"
2
3     void PS_Erase(void)
4     {
5         if (ps.encapsulated)
>>>     CID 1415712:  API usage errors  (PRINTF_ARGS)
>>>     Argument "ps.bot" to format specifier "%d" was expected to have type "int" but has type "double".
6       output("%d %d %d %d BOX\n", ps.left, ps.top, ps.right, ps.bot);
7         else
8       output("ERASE\n");

** CID 1415711:    (UNINIT)
/raster/r.geomorphon/pattern.c: 129 in calc_pattern()
/raster/r.geomorphon/pattern.c: 108 in calc_pattern()


________________________________________________________________________________________________________
*** CID 1415711:    (UNINIT)
/raster/r.geomorphon/pattern.c: 129 in calc_pattern()
123
124             if (fabs(zenith_angle) > zenith_threshold ||
125                 fabs(nadir_angle) > nadir_threshold) {
126                 if (fabs(nadir_angle) < fabs(zenith_angle)) {
127                     pattern->pattern[i] = 1;
128                     pattern->elevation[i] = zenith_height;  /* ZMIANA! */
>>>     CID 1415711:    (UNINIT)
>>>     Using uninitialized value "zenith_distance".
129                     pattern->distance[i] = zenith_distance;
130                     pattern->num_positives++;
131                 }
132                 if (fabs(nadir_angle) > fabs(zenith_angle)) {
133                     pattern->pattern[i] = -1;
134                     pattern->elevation[i] = nadir_height;   /* ZMIANA! */
/raster/r.geomorphon/pattern.c: 108 in calc_pattern()
102                }
103                } else {
104                patterns->distance[i]=search_distance;
105                }
106              */
107             /* this is used to lower flat threshold if distance
exceed flat_distance parameter */
>>>     CID 1415711:    (UNINIT)
>>>     Using uninitialized value "zenith_distance".
108             zenith_threshold = (flat_distance > 0 &&
109                                 flat_distance <
110                                 zenith_distance) ?
atan2(flat_threshold_height,
111                                                          zenith_distance) :
112                 flat_threshold;
113             nadir_threshold = (flat_distance > 0 &&

** CID 1415710:  Incorrect expression  (SIZEOF_MISMATCH)
/imagery/i.segment/write_output.c: 229 in write_bands_ms()


________________________________________________________________________________________________________
*** CID 1415710:  Incorrect expression  (SIZEOF_MISMATCH)
/imagery/i.segment/write_output.c: 229 in write_bands_ms()
223         struct Colors colors;
224         struct History hist;
225         struct ngbr_stats Rout;
226
227         out_fd = G_malloc(sizeof(int) * globals->nbands);
228         name = G_malloc(sizeof(char *) * globals->nbands);
>>>     CID 1415710:  Incorrect expression  (SIZEOF_MISMATCH)
>>>     Passing argument "8UL /* sizeof (DCELL) */ * globals->nbands" to function "G__malloc" and then casting the return value to "DCELL **" is suspicious.
229         outbuf = G_malloc(sizeof(DCELL) * globals->nbands);
230         for (n = 0; n < globals->nbands; n++) {
231             outbuf[n] = Rast_allocate_d_buf();
232             G_asprintf(&name[n], "%s%s",
globals->Ref.file[n].name, globals->bsuf);
233             out_fd[n] = Rast_open_new(name[n], DCELL_TYPE);
234         }

** CID 1415709:    (CHECKED_RETURN)
/raster/r.clump/clump.c: 113 in do_renumber()
/raster/r.clump/clump.c: 97 in do_renumber()


________________________________________________________________________________________________________
*** CID 1415709:    (CHECKED_RETURN)
/raster/r.clump/clump.c: 113 in do_renumber()
107                         *temp_clump = new_clump;
108                         do_write = 1;
109                     }
110                     temp_clump++;
111                 }
112                 if (do_write) {
>>>     CID 1415709:    (CHECKED_RETURN)
>>>     Calling "lseek(cfd, coffset, 0)" without checking return value. This library function may fail and return an error code.
113                     lseek(cfd, coffset, SEEK_SET);
114                     if (write(cfd, cur_clump, csize) != csize)
115                         G_fatal_error(_("Unable to write to temp file"));
116                 }
117             }
118             G_percent(1, 1, 1);
/raster/r.clump/clump.c: 97 in do_renumber()
91
92      for (row = 0; row < nrows; row++) {
93
94          G_percent(row, nrows, 2);
95
96          coffset = (off_t)row * csize;
>>>     CID 1415709:    (CHECKED_RETURN)
>>>     Calling "lseek(cfd, coffset, 0)" without checking return value. This library function may fail and return an error code.
97          lseek(cfd, coffset, SEEK_SET);
98          if (read(cfd, cur_clump, csize) != csize)
99              G_fatal_error(_("Unable to read from temp file"));
100
101                 temp_clump = cur_clump;
102

** CID 1415708:  Insecure data handling  (TAINTED_SCALAR)


________________________________________________________________________________________________________
*** CID 1415708:  Insecure data handling  (TAINTED_SCALAR)
/raster/r.statistics/o_adev.c: 51 in o_adev()
45          catb = basecat;
46          catc = covercat;
47          count = 0;
48      }
49
50      if (usecats)
>>>     CID 1415708:  Insecure data handling  (TAINTED_SCALAR)
>>>     Passing tainted variable "*((CELL *)&covercat)" to a tainted sink.
51          sscanf(Rast_get_c_cat((CELL *) &covercat, cats), "%lf", &x);
52      else
53          x = covercat;
54
55      for (i = 0; i < value; i++) {
56          if (count * sizeof(double) >= mem) {

** CID 1415707:    (TAINTED_SCALAR)
/lib/vector/diglib/plus.c: 235 in dig_load_plus()
/lib/vector/diglib/plus.c: 225 in dig_load_plus()
/lib/vector/diglib/plus.c: 255 in dig_load_plus()
/lib/vector/diglib/plus.c: 245 in dig_load_plus()


________________________________________________________________________________________________________
*** CID 1415707:    (TAINTED_SCALAR)
/lib/vector/diglib/plus.c: 235 in dig_load_plus()
229
230         /* Lines */
231         if (dig_fseek(plus, Plus->Line_offset, 0) == -1)
232             G_fatal_error(_("Unable read topology for lines"));
233
234         dig_alloc_lines(Plus, Plus->n_lines);
>>>     CID 1415707:    (TAINTED_SCALAR)
>>>     Using tainted variable "Plus->n_lines" as a loop boundary.
235         for (i = 1; i <= Plus->n_lines; i++) {
236             if (dig_Rd_P_line(Plus, i, plus) == -1)
237                 G_fatal_error(_("Unable to read topology for line %d"), i);
238         }
239
240         /* Areas */
/lib/vector/diglib/plus.c: 225 in dig_load_plus()
219
220         /* Nodes */
221         if (dig_fseek(plus, Plus->Node_offset, 0) == -1)
222             G_fatal_error(_("Unable read topology for nodes"));
223
224         dig_alloc_nodes(Plus, Plus->n_nodes);
>>>     CID 1415707:    (TAINTED_SCALAR)
>>>     Using tainted variable "Plus->n_nodes" as a loop boundary.
225         for (i = 1; i <= Plus->n_nodes; i++) {
226             if (dig_Rd_P_node(Plus, i, plus) == -1)
227                 G_fatal_error(_("Unable to read topology for node %d"), i);
228         }
229
230         /* Lines */
/lib/vector/diglib/plus.c: 255 in dig_load_plus()
249
250         /* Isles */
251         if (dig_fseek(plus, Plus->Isle_offset, 0) == -1)
252             G_fatal_error(_("Unable to read topology for isles"));
253
254         dig_alloc_isles(Plus, Plus->n_isles);
>>>     CID 1415707:    (TAINTED_SCALAR)
>>>     Using tainted variable "Plus->n_isles" as a loop boundary.
255         for (i = 1; i <= Plus->n_isles; i++) {
256             if (dig_Rd_P_isle(Plus, i, plus) == -1)
257                 G_fatal_error(_("Unable to read topology for isle %d"), i);
258         }
259
260         return (1);
/lib/vector/diglib/plus.c: 245 in dig_load_plus()
239
240         /* Areas */
241         if (dig_fseek(plus, Plus->Area_offset, 0) == -1)
242             G_fatal_error(_("Unable to read topo for areas"));
243
244         dig_alloc_areas(Plus, Plus->n_areas);
>>>     CID 1415707:    (TAINTED_SCALAR)
>>>     Using tainted variable "Plus->n_areas" as a loop boundary.
245         for (i = 1; i <= Plus->n_areas; i++) {
246             if (dig_Rd_P_area(Plus, i, plus) == -1)
247                 G_fatal_error(_("Unable read topology for area %d"), i);
248         }
249
250         /* Isles */

** CID 1415706:  Resource leaks  (RESOURCE_LEAK)
/lib/rst/interp_float/segmen2d_parallel.c: 418 in
IL_interp_segments_2d_parallel()


________________________________________________________________________________________________________
*** CID 1415706:  Resource leaks  (RESOURCE_LEAK)
/lib/rst/interp_float/segmen2d_parallel.c: 418 in
IL_interp_segments_2d_parallel()
412                        G_free_ivector(indx);
413                        G_free_vector(b);
414                      */
415                     G_free(data_local[tid]->points);
416                     G_free(data_local[tid]);
417                 }
>>>     CID 1415706:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "point" going out of scope leaks the storage it points to.
418             }
419         }                           /* All threads join master
thread and terminate */
420
421         for (i_cnt = 0; i_cnt < threads; i_cnt++) {
422             G_free(matrix[i_cnt]);
423             G_free(indx[i_cnt]);

** CID 1415705:  Resource leaks  (RESOURCE_LEAK)
/vector/v.external/list.c: 353 in list_layers_ogr()


________________________________________________________________________________________________________
*** CID 1415705:  Resource leaks  (RESOURCE_LEAK)
/vector/v.external/list.c: 353 in list_layers_ogr()
347                     ret = i;
348                 }
349         }
350
351         OGR_DS_Destroy(Ogr_ds);
352
>>>     CID 1415705:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "loc_proj_units" going out of scope leaks the storage it points to.
353         return ret;
354     }

** CID 1415704:  API usage errors  (PW.TOO_FEW_PRINTF_ARGS)
/vector/v.in.ascii/points.c: 151 in ()


________________________________________________________________________________________________________
*** CID 1415704:  API usage errors  (PW.TOO_FEW_PRINTF_ARGS)
/vector/v.in.ascii/points.c: 151 in ()
145                 catcol >= ntokens) {
146                 if (ignore_flag) {
147                     G_debug(3, "Skipping broken row %d: '%s'", row, buf);
148                     continue;
149                 }
150                 else {
>>>     CID 1415704:  API usage errors  (PW.TOO_FEW_PRINTF_ARGS)
>>>     the format string requires additional arguments
151                     G_warning(_("ntokens: %d, xcol: %d, ycol: %d,
zcol: %d"), xcol, ycol, zcol);
152                     G_fatal_error(_("Broken row %d: '%s'"), row, buf);
153                 }
154             }
155
156             len = strlen(buf) + 1;

** CID 1415703:  Resource leaks  (RESOURCE_LEAK)
/vector/v.label.sa/labels.c: 723 in label_line_candidates()


________________________________________________________________________________________________________
*** CID 1415703:  Resource leaks  (RESOURCE_LEAK)
/vector/v.label.sa/labels.c: 723 in label_line_candidates()
717             tmp_shape = label->shape;
718             label->shape = tmp;
719
720             label_point_candidates(label);
721             label->shape = tmp_shape;
722             Vect_destroy_line_struct(tmp);
>>>     CID 1415703:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "below_candidates" going out of scope leaks the storage it points to.
723             return;
724         }
725
726         candidates = G_calloc(n * 2, sizeof(label_candidate_t));
727         for (i = 0; i < n; i++) {
728             memcpy(&candidates[i * 2], &above_candidates[i],

** CID 1415702:    (DC.WEAK_CRYPTO)
/vector/v.label.sa/annealing.c: 82 in simulate_annealing()
/vector/v.label.sa/annealing.c: 72 in simulate_annealing()
/vector/v.label.sa/annealing.c: 107 in simulate_annealing()


________________________________________________________________________________________________________
*** CID 1415702:    (DC.WEAK_CRYPTO)
/vector/v.label.sa/annealing.c: 82 in simulate_annealing()
76          if (lp->n_candidates < 2)
77              continue;
78
79          cc = lp->current_candidate;
80          /*and a random new candidate place */
81          c = (int)((double)(lp->n_candidates) *
>>>     CID 1415702:    (DC.WEAK_CRYPTO)
>>>     "rand" should not be used for security-related applications, because linear congruential algorithms are too easy to break.
82                    (rand() / (RAND_MAX + 1.0)));
83          if (c == cc) {
84              if (c == 0)
85                  c++;
86              else
87                  c--;
/vector/v.label.sa/annealing.c: 72 in simulate_annealing()
66
67      for (i = 0; i < (n_labels * 30); i++) {
68          int l, c, cc, r;
69          label_t *lp;
70
71          /* pick a random label */
>>>     CID 1415702:    (DC.WEAK_CRYPTO)
>>>     "rand" should not be used for security-related applications, because linear congruential algorithms are too easy to break.
72          r = rand();
73          l = (int)((double)(n_labels) * (r / (RAND_MAX + 1.0)));
74          lp = &labels[l];
75          /* skip labels without sufficient number of candidates */
76          if (lp->n_candidates < 2)
77              continue;
/vector/v.label.sa/annealing.c: 107 in simulate_annealing()
101                 }
102                 /* else apply with probability p=e^(-dE/T) */
103                 else {
104                     double dp, dr;
105
106                     dp = pow(M_E, -dE / T);
>>>     CID 1415702:    (DC.WEAK_CRYPTO)
>>>     "rand" should not be used for security-related applications, because linear congruential algorithms are too easy to break.
107                     dr = (double)rand() / RAND_MAX;
108                     if (dr <= dp) {
109                         do_label_overlap(lp, cc, c);
110                         lp->current_score += lp->candidates[c].score;
111                         lp->current_candidate = c;
112                         successes++;

** CID 1415701:  Resource leaks  (RESOURCE_LEAK)
/vector/v.overlay/area_area.c: 493 in area_area()


________________________________________________________________________________________________________
*** CID 1415701:  Resource leaks  (RESOURCE_LEAK)
/vector/v.overlay/area_area.c: 493 in area_area()
487             }
488
489             if (centr[0] || centr[1])
490                 Vect_write_line(Out, GV_BOUNDARY, Points, Cats);
491         }
492
>>>     CID 1415701:  Resource leaks  (RESOURCE_LEAK)
>>>     Variable "Points" going out of scope leaks the storage it points to.
493         return 0;


________________________________________________________________________________________________________
To view the defects in Coverity Scan visit,
https://u2389337.ct.sendgrid.net/ls/click?upn=nJaKvJSIH-2FPAfmty-2BK5tYpPklAc1eEA-2F1zfUjH6teExWYffAcTwo3Zs4Osg-2B-2F92CCWuAyO4ddCCiK6Lyu3Zo2A-3D-3DM68e_1fJmB2fTvLSRHaGG3R4Zs7PAImoD8NTRTiIHP0uw7V4OY0ITb54-2FoE1ZzXl37C1QCKUPbsY34wCDK65aEx6vK3rwfOAPPiZ22QlP53dsUyuhk8T-2F-2B5-2FY6fc6E0Zo2gA1EEKnReg6AGCxVLgvwUzLMKyj-2B86WRglCwV3iupUDJ63lyUwXtEMk4ZtrkmS-2BBpiVnA-2FyNWIdmftZLIRf4xNI5VJcGzuY0X5rTm-2Fl67voPtI-3D

  To manage Coverity Scan email notifications for "neteler at gmail.com",
click https://u2389337.ct.sendgrid.net/ls/click?upn=nJaKvJSIH-2FPAfmty-2BK5tYpPklAc1eEA-2F1zfUjH6teEwKPNNrzEFiIgTetQBd7l2XshiJhkGRbbOKBdDwUVNeC5t3zZR9Cyp5DqHjaG-2B2Fd9-2B2JCJhGaf6K8XfKew1sOxms9SIUe7-2Bu1Q4p5KMnAibl5CD-2FGd8dRn7wJzLDcFswk-3DfOpQ_1fJmB2fTvLSRHaGG3R4Zs7PAImoD8NTRTiIHP0uw7V4OY0ITb54-2FoE1ZzXl37C1QetqwsKw5oa-2Bohu8YHnVupsXsOHyTm3xCAJN4wr0BebnWmOvOMCMuuPJzjeDcmxVbSLm-2BAVDnge6-2B7HLvui4acX96HYYG8kikpsex4yZ8vHzYmMm4TSxFfm-2B5IhDPh6QdhdxeCRWObiokr-2FKPshnPYZXXz2amJevsDn58R7Lx-2FK8-3D



-- 
Markus Neteler, PhD
https://www.mundialis.de - free data with free software
https://grass.osgeo.org
https://courses.neteler.org/blog


More information about the grass-dev mailing list