Skip to content

Commit 34b6764

Browse files
authored
m.nviz.image: Fix Resource Leak issue (#5079)
1 parent 9b8a52a commit 34b6764

File tree

3 files changed

+76
-46
lines changed

3 files changed

+76
-46
lines changed

misc/m.nviz.image/surface.c

+39-32
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
*/
2828
int load_rasters(const struct GParams *params, nv_data *data)
2929
{
30-
const char *mapset;
30+
const char *mapset = NULL;
31+
char *mname = NULL;
3132
int i;
3233
int nelevs, nelev_map, nelev_const, ncolor_map, ncolor_const, nmask_map;
3334
int ntransp_map, ntransp_const, nshine_map, nshine_const;
@@ -50,11 +51,10 @@ int load_rasters(const struct GParams *params, nv_data *data)
5051
G_fatal_error(_("Raster map <%s> not found"),
5152
params->elev_map->answers[i]);
5253
}
53-
54-
id = Nviz_new_map_obj(
55-
MAP_OBJ_SURF,
56-
G_fully_qualified_name(params->elev_map->answers[i], mapset),
57-
0.0, data);
54+
mname =
55+
G_fully_qualified_name(params->elev_map->answers[i], mapset);
56+
id = Nviz_new_map_obj(MAP_OBJ_SURF, mname, 0.0, data);
57+
G_free(mname);
5858
}
5959
else {
6060
if (i - nelev_map < nelev_const &&
@@ -107,10 +107,11 @@ int load_rasters(const struct GParams *params, nv_data *data)
107107
G_fatal_error(_("Raster map <%s> not found"),
108108
params->color_map->answers[i]);
109109
}
110-
Nviz_set_attr(
111-
id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
112-
G_fully_qualified_name(params->color_map->answers[i], mapset),
113-
-1.0, data);
110+
mname =
111+
G_fully_qualified_name(params->color_map->answers[i], mapset);
112+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT, mname, -1.0,
113+
data);
114+
G_free(mname);
114115
}
115116
/* check for color value */
116117
else if (i - ncolor_map < ncolor_const &&
@@ -122,14 +123,14 @@ int load_rasters(const struct GParams *params, nv_data *data)
122123
}
123124
else { /* use by default elevation map for coloring */
124125
if (nelev_map > 0) {
125-
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
126-
G_fully_qualified_name(
127-
params->elev_map->answers[i], mapset),
128-
-1.0, data);
126+
mname = G_fully_qualified_name(params->elev_map->answers[i],
127+
mapset);
128+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT, mname, -1.0,
129+
data);
129130
G_verbose_message(
130131
_("Color attribute not defined, using default <%s>"),
131-
G_fully_qualified_name(params->elev_map->answers[i],
132-
mapset));
132+
mname);
133+
G_free(mname);
133134
}
134135
else {
135136
G_fatal_error(_("Missing color attribute for surface %d"),
@@ -138,18 +139,20 @@ int load_rasters(const struct GParams *params, nv_data *data)
138139
}
139140
/* mask */
140141
if (i < nmask_map && strcmp(params->mask_map->answers[i], "")) {
141-
Nviz_set_attr(
142-
id, MAP_OBJ_SURF, ATT_MASK, MAP_ATT,
143-
G_fully_qualified_name(params->mask_map->answers[i], mapset),
144-
-1.0, data);
142+
mname =
143+
G_fully_qualified_name(params->mask_map->answers[i], mapset);
144+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_MASK, MAP_ATT, mname, -1.0,
145+
data);
146+
G_free(mname);
145147
}
146148

147149
/* transparency */
148150
if (i < ntransp_map && strcmp(params->transp_map->answers[i], "")) {
149-
Nviz_set_attr(
150-
id, MAP_OBJ_SURF, ATT_TRANSP, MAP_ATT,
151-
G_fully_qualified_name(params->transp_map->answers[i], mapset),
152-
-1.0, data);
151+
mname =
152+
G_fully_qualified_name(params->transp_map->answers[i], mapset);
153+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_TRANSP, MAP_ATT, mname, -1.0,
154+
data);
155+
G_free(mname);
153156
}
154157
else if (i - ntransp_map < ntransp_const &&
155158
strcmp(params->transp_const->answers[i - ntransp_map], "")) {
@@ -160,10 +163,11 @@ int load_rasters(const struct GParams *params, nv_data *data)
160163

161164
/* shininess */
162165
if (i < nshine_map && strcmp(params->shine_map->answers[i], "")) {
163-
Nviz_set_attr(
164-
id, MAP_OBJ_SURF, ATT_SHINE, MAP_ATT,
165-
G_fully_qualified_name(params->shine_map->answers[i], mapset),
166-
-1.0, data);
166+
mname =
167+
G_fully_qualified_name(params->shine_map->answers[i], mapset);
168+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_SHINE, MAP_ATT, mname, -1.0,
169+
data);
170+
G_free(mname);
167171
}
168172
else if (i - nshine_map < nshine_const &&
169173
strcmp(params->shine_const->answers[i - nshine_map], "")) {
@@ -174,10 +178,11 @@ int load_rasters(const struct GParams *params, nv_data *data)
174178

175179
/* emission */
176180
if (i < nemit_map && strcmp(params->emit_map->answers[i], "")) {
177-
Nviz_set_attr(
178-
id, MAP_OBJ_SURF, ATT_EMIT, MAP_ATT,
179-
G_fully_qualified_name(params->emit_map->answers[i], mapset),
180-
-1.0, data);
181+
mname =
182+
G_fully_qualified_name(params->emit_map->answers[i], mapset);
183+
Nviz_set_attr(id, MAP_OBJ_SURF, ATT_EMIT, MAP_ATT, mname, -1.0,
184+
data);
185+
G_free(mname);
181186
}
182187
else if (i - nemit_map < nemit_const &&
183188
strcmp(params->emit_const->answers[i - nemit_map], "")) {
@@ -191,6 +196,7 @@ int load_rasters(const struct GParams *params, nv_data *data)
191196
set_default_wirecolors(data, i);
192197
*/
193198
}
199+
G_free(surf_list);
194200

195201
return nsurfs;
196202
}
@@ -273,6 +279,7 @@ void surface_set_draw_mode(const struct GParams *params)
273279
/* wire color */
274280
GS_set_wire_color(id, Nviz_color_from_str(wire_color));
275281
}
282+
G_free(surf_list);
276283

277284
return;
278285
}

misc/m.nviz.image/vector.c

+31-9
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ int load_vectors(const struct Option *elev_map, const struct Option *elev_const,
7272

7373
surf_list = GS_get_surf_list(&nsurf);
7474
GS_set_att_const(surf_list[0], ATT_TRANSP, 255);
75+
G_free(surf_list);
7576
}
7677

7778
nvects = 0;
@@ -81,9 +82,9 @@ int load_vectors(const struct Option *elev_map, const struct Option *elev_const,
8182
if (mapset == NULL) {
8283
G_fatal_error(_("Vector map <%s> not found"), vect->answers[i]);
8384
}
84-
id = Nviz_new_map_obj(map_obj_type,
85-
G_fully_qualified_name(vect->answers[i], mapset),
86-
0.0, data);
85+
char *mname = G_fully_qualified_name(vect->answers[i], mapset);
86+
id = Nviz_new_map_obj(map_obj_type, mname, 0.0, data);
87+
G_free(mname);
8788

8889
/* set position */
8990
x = atof(position->answers[i * 3 + 0]);
@@ -111,7 +112,7 @@ int load_vectors(const struct Option *elev_map, const struct Option *elev_const,
111112
*/
112113
int vlines_set_attrb(const struct GParams *params)
113114
{
114-
int i, layer, color, width, flat, height;
115+
int i, layer = -1, color, width, flat, height;
115116
int *vect_list, nvects;
116117
int have_colors;
117118

@@ -138,23 +139,28 @@ int vlines_set_attrb(const struct GParams *params)
138139
flat = 0;
139140

140141
/* style (mode -- use memory by default) */
141-
if (GV_set_style(vect_list[i], TRUE, color, width, flat) < 0)
142+
if (GV_set_style(vect_list[i], TRUE, color, width, flat) < 0) {
143+
G_free(vect_list);
142144
return 0;
145+
}
143146

144147
/* check for vector color table */
145148
have_colors = Vect_read_colors(params->vlines->answers[i], "", &colors);
146149

147150
if (have_colors || color_column || width_column)
148151
if (GV_set_style_thematic(vect_list[i], layer, color_column,
149152
width_column,
150-
have_colors ? &colors : NULL) < 0)
153+
have_colors ? &colors : NULL) < 0) {
154+
G_free(vect_list);
151155
return 0;
156+
}
152157

153158
/* height */
154159
height = atoi(params->vline_height->answers[i]);
155160
if (height > 0)
156161
GV_set_trans(vect_list[i], 0.0, 0.0, height);
157162
}
163+
G_free(vect_list);
158164

159165
return 1;
160166
}
@@ -169,7 +175,7 @@ int vlines_set_attrb(const struct GParams *params)
169175
*/
170176
int vpoints_set_attrb(const struct GParams *params)
171177
{
172-
int i, layer, have_colors, with_z;
178+
int i, have_colors;
173179
int *site_list, nsites;
174180
int marker, color, width;
175181
float size;
@@ -181,6 +187,7 @@ int vpoints_set_attrb(const struct GParams *params)
181187
site_list = GP_get_site_list(&nsites);
182188

183189
for (i = 0; i < nsites; i++) {
190+
int layer = -1, with_z = 0;
184191
check_map(params, i, FALSE, &layer, &with_z);
185192

186193
color = Nviz_color_from_str(params->vpoint_color->answers[i]);
@@ -208,8 +215,10 @@ int vpoints_set_attrb(const struct GParams *params)
208215
GP_set_zmode(site_list[i], TRUE);
209216
}
210217

211-
if (GP_set_style(site_list[i], color, width, size, marker) < 0)
218+
if (GP_set_style(site_list[i], color, width, size, marker) < 0) {
219+
G_free(site_list);
212220
return 0;
221+
}
213222

214223
/* check for vector color table */
215224
have_colors =
@@ -219,10 +228,13 @@ int vpoints_set_attrb(const struct GParams *params)
219228
marker_column) {
220229
if (GP_set_style_thematic(site_list[i], layer, color_column,
221230
width_column, size_column, marker_column,
222-
have_colors ? &colors : NULL) < 0)
231+
have_colors ? &colors : NULL) < 0) {
232+
G_free(site_list);
223233
return 0;
234+
}
224235
}
225236
}
237+
G_free(site_list);
226238

227239
return 1;
228240
}
@@ -251,6 +263,7 @@ int check_map(const struct GParams *params, int index, int vlines, int *field,
251263

252264
Fi = NULL;
253265
driver = NULL;
266+
column = NULL;
254267

255268
if (vlines) {
256269
map = params->vlines->answers[index];
@@ -310,6 +323,8 @@ int check_map(const struct GParams *params, int index, int vlines, int *field,
310323

311324
if (db_column_Ctype(driver, Fi->table, color) != DB_C_TYPE_STRING)
312325
G_fatal_error(_("Data type of color column must be character"));
326+
db_free_column(column);
327+
column = NULL;
313328
}
314329
if (size) {
315330
db_get_column(driver, Fi->table, size, &column);
@@ -320,6 +335,8 @@ int check_map(const struct GParams *params, int index, int vlines, int *field,
320335
type = db_column_Ctype(driver, Fi->table, size);
321336
if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
322337
G_fatal_error(_("Data type of size column must be numeric"));
338+
db_free_column(column);
339+
column = NULL;
323340
}
324341
if (width) {
325342
db_get_column(driver, Fi->table, width, &column);
@@ -330,6 +347,8 @@ int check_map(const struct GParams *params, int index, int vlines, int *field,
330347
type = db_column_Ctype(driver, Fi->table, width);
331348
if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
332349
G_fatal_error(_("Data type of width column must be numeric"));
350+
db_free_column(column);
351+
column = NULL;
333352
}
334353
if (marker) {
335354
db_get_column(driver, Fi->table, marker, &column);
@@ -341,9 +360,12 @@ int check_map(const struct GParams *params, int index, int vlines, int *field,
341360
if (db_column_Ctype(driver, Fi->table, marker) != DB_C_TYPE_STRING)
342361
G_fatal_error(
343362
_("Data type of marker column must be character"));
363+
db_free_column(column);
364+
column = NULL;
344365
}
345366

346367
db_close_database_shutdown_driver(driver);
368+
Vect_destroy_field_info(Fi);
347369
}
348370

349371
Vect_close(&Map);

misc/m.nviz.image/volume.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ int load_rasters3d(const struct GParams *params, nv_data *data)
4242
G_fatal_error(_("3d raster map <%s> not found"),
4343
params->volume->answers[i]);
4444
}
45-
46-
id = Nviz_new_map_obj(
47-
MAP_OBJ_VOL,
48-
G_fully_qualified_name(params->volume->answers[i], mapset), 0.0,
49-
data);
45+
char *mname =
46+
G_fully_qualified_name(params->volume->answers[i], mapset);
47+
id = Nviz_new_map_obj(MAP_OBJ_VOL, mname, 0.0, data);
48+
G_free(mname);
5049

5150
/* set position */
5251
if (opt_get_num_answers(params->volume_pos) != 3 * nvol) {
@@ -243,6 +242,7 @@ int add_isosurfs(const struct GParams *params, nv_data *data UNUSED)
243242

244243
GVL_isosurf_set_drawmode(id, draw_mode);
245244
}
245+
G_free(vol_list);
246246

247247
return 1;
248248
}
@@ -331,6 +331,7 @@ int add_slices(const struct GParams *params, nv_data *data UNUSED)
331331

332332
GVL_slice_set_drawmode(id, draw_mode);
333333
}
334+
G_free(vol_list);
334335

335336
return 1;
336337
}

0 commit comments

Comments
 (0)