Skip to content

Commit 517c0ed

Browse files
authored
Merge pull request #17580 from ralfbrown/lib_alloc_checks
[maint] check memory allocs in utility modules
2 parents 7334056 + 103a719 commit 517c0ed

File tree

9 files changed

+181
-106
lines changed

9 files changed

+181
-106
lines changed

src/libs/geotagging.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,11 @@ static void _show_gpx_tracks(dt_lib_module_t *self)
676676
GList *trkseg = dt_gpx_get_trkseg(d->map.gpx);
677677
d->map.nb_tracks = g_list_length(trkseg);
678678
d->map.tracks = g_malloc0(sizeof(dt_lib_tracks_data_t) * d->map.nb_tracks);
679+
if(!d->map.tracks)
680+
{
681+
d->map.nb_tracks = 0;
682+
dt_print(DT_DEBUG_ALWAYS, "[geotagging] unable to allocate storage for tracks\n");
683+
}
679684

680685
_remove_images_from_map(self);
681686
for(GList *i = d->imgs; i; i = g_list_next(i))
@@ -1098,9 +1103,12 @@ static GList *_lib_geotagging_get_timezones(void)
10981103
size_t last_char = strlen(name) - 1;
10991104
if(name[last_char] == '\n') name[last_char] = '\0';
11001105
tz_tuple_t *tz_tuple = (tz_tuple_t *)malloc(sizeof(tz_tuple_t));
1101-
tz_tuple->display = name;
1102-
tz_tuple->name = name;
1103-
timezones = g_list_prepend(timezones, tz_tuple);
1106+
if(tz_tuple)
1107+
{
1108+
tz_tuple->display = name;
1109+
tz_tuple->name = name;
1110+
timezones = g_list_prepend(timezones, tz_tuple);
1111+
}
11041112
}
11051113

11061114
fclose(fp);
@@ -1109,9 +1117,12 @@ static GList *_lib_geotagging_get_timezones(void)
11091117
timezones = g_list_sort(timezones, _sort_timezones);
11101118

11111119
tz_tuple_t *utc = (tz_tuple_t *)malloc(sizeof(tz_tuple_t));
1112-
utc->display = g_strdup("UTC");
1113-
utc->name = utc->display;
1114-
timezones = g_list_prepend(timezones, utc);
1120+
if(utc)
1121+
{
1122+
utc->display = g_strdup("UTC");
1123+
utc->name = utc->display;
1124+
timezones = g_list_prepend(timezones, utc);
1125+
}
11151126

11161127
#undef MAX_LINE_LENGTH
11171128

@@ -1177,11 +1188,12 @@ static GList *_lib_geotagging_get_timezones(void)
11771188
&buffer_size) == ERROR_SUCCESS)
11781189
{
11791190
tz_tuple_t *tz = (tz_tuple_t *)malloc(sizeof(tz_tuple_t));
1180-
1181-
tz->name = subkeyname_utf8;
1182-
tz->display = g_utf16_to_utf8(display_name, -1, NULL, NULL, NULL);
1183-
timezones = g_list_prepend(timezones, tz);
1184-
1191+
if(tz)
1192+
{
1193+
tz->name = subkeyname_utf8;
1194+
tz->display = g_utf16_to_utf8(display_name, -1, NULL, NULL, NULL);
1195+
timezones = g_list_prepend(timezones, tz);
1196+
}
11851197
subkeyname_utf8 = NULL; // to not free it later
11861198
}
11871199
free(display_name);

src/libs/location.c

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ void gui_init(dt_lib_module_t *self)
136136
{
137137
self->data = calloc(1, sizeof(dt_lib_location_t));
138138
dt_lib_location_t *lib = self->data;
139+
if(!lib)
140+
return;
139141

140142
self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
141143

@@ -209,13 +211,15 @@ static GtkWidget *_lib_location_place_widget_new(dt_lib_location_t *lib,
209211

210212
/* connect button press signal for result item */
211213
_callback_param_t *param = (_callback_param_t *)malloc(sizeof(_callback_param_t));
212-
lib->callback_params = g_list_append(lib->callback_params, param);
213-
param->lib = lib;
214-
param->result = place;
215-
g_signal_connect(G_OBJECT(eb), "button-press-event",
216-
G_CALLBACK(_lib_location_result_item_activated),
217-
(gpointer)param);
218-
214+
if(param)
215+
{
216+
lib->callback_params = g_list_append(lib->callback_params, param);
217+
param->lib = lib;
218+
param->result = place;
219+
g_signal_connect(G_OBJECT(eb), "button-press-event",
220+
G_CALLBACK(_lib_location_result_item_activated),
221+
(gpointer)param);
222+
}
219223
return eb;
220224
}
221225

@@ -227,13 +231,15 @@ static size_t _lib_location_curl_write_data(void *buffer,
227231
dt_lib_location_t *lib = (dt_lib_location_t *)userp;
228232

229233
char *newdata = g_malloc0(lib->response_size + nmemb + 1);
230-
if(lib->response != NULL)
231-
memcpy(newdata, lib->response, lib->response_size);
232-
memcpy(newdata + lib->response_size, buffer, nmemb);
233-
g_free(lib->response);
234-
lib->response = newdata;
235-
lib->response_size += nmemb;
236-
234+
if(newdata)
235+
{
236+
if(lib->response != NULL)
237+
memcpy(newdata, lib->response, lib->response_size);
238+
memcpy(newdata + lib->response_size, buffer, nmemb);
239+
g_free(lib->response);
240+
lib->response = newdata;
241+
lib->response_size += nmemb;
242+
}
237243
return nmemb;
238244
}
239245

@@ -560,9 +566,12 @@ static void _lib_location_parser_start_element(GMarkupParseContext *cxt,
560566
{
561567
place->marker_type = MAP_DISPLAY_POINT;
562568
dt_geo_map_display_point_t *p = malloc(sizeof(dt_geo_map_display_point_t));
563-
p->lon = lon;
564-
p->lat = lat;
565-
place->marker_points = g_list_append(place->marker_points, p);
569+
if(p)
570+
{
571+
p->lon = lon;
572+
p->lat = lat;
573+
place->marker_points = g_list_append(place->marker_points, p);
574+
}
566575
}
567576
}
568577
else if(g_str_has_prefix(*avalue, "LINESTRING")
@@ -630,9 +639,12 @@ static void _lib_location_parser_start_element(GMarkupParseContext *cxt,
630639
break;
631640
}
632641
dt_geo_map_display_point_t *p = malloc(sizeof(dt_geo_map_display_point_t));
633-
p->lon = lon;
634-
p->lat = lat;
635-
place->marker_points = g_list_prepend(place->marker_points, p);
642+
if(p)
643+
{
644+
p->lon = lon;
645+
p->lat = lat;
646+
place->marker_points = g_list_prepend(place->marker_points, p);
647+
}
636648
startptr = endptr+1;
637649
i++;
638650
}
@@ -718,6 +730,12 @@ void *get_params(dt_lib_module_t *self,
718730
const size_t size_total = size_fixed + size_name + size_points;
719731

720732
void *params = malloc(size_total);
733+
if(!params)
734+
{
735+
*size = 0;
736+
return NULL;
737+
}
738+
721739
struct params_fixed_t *params_fixed = (struct params_fixed_t *)params;
722740
params_fixed->relevance = location->relevance;
723741
params_fixed->type = location->type;
@@ -765,8 +783,12 @@ int set_params(dt_lib_module_t *self,
765783

766784
if(size_points % 2 * sizeof(float) != 0) return 1;
767785

768-
_lib_location_result_t *location =
769-
(_lib_location_result_t *)malloc(sizeof(_lib_location_result_t));
786+
_lib_location_result_t *location = malloc(sizeof(_lib_location_result_t));
787+
if(!location)
788+
{
789+
dt_print(DT_DEBUG_ALWAYS, "[location] out of memory\n");
790+
return 1;
791+
}
770792

771793
location->relevance = params_fixed->relevance;
772794
location->type = params_fixed->type;
@@ -786,9 +808,12 @@ int set_params(dt_lib_module_t *self,
786808
{
787809
dt_geo_map_display_point_t *p =
788810
(dt_geo_map_display_point_t *)malloc(sizeof(dt_geo_map_display_point_t));
789-
p->lat = points[0];
790-
p->lon = points[1];
791-
location->marker_points = g_list_prepend(location->marker_points, p);
811+
if(p)
812+
{
813+
p->lat = points[0];
814+
p->lon = points[1];
815+
location->marker_points = g_list_prepend(location->marker_points, p);
816+
}
792817
}
793818
location->marker_points = g_list_reverse(location->marker_points);
794819

src/libs/masks.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -380,12 +380,15 @@ static void _tree_group(GtkButton *button, dt_lib_module_t *self)
380380
{
381381
dt_masks_point_group_t *fpt =
382382
(dt_masks_point_group_t *)malloc(sizeof(dt_masks_point_group_t));
383-
fpt->formid = id;
384-
fpt->parentid = grp->formid;
385-
fpt->opacity = 1.0f;
386-
fpt->state = DT_MASKS_STATE_USE;
387-
if(pos > 0) fpt->state |= DT_MASKS_STATE_UNION;
388-
grp->points = g_list_append(grp->points, fpt);
383+
if(fpt)
384+
{
385+
fpt->formid = id;
386+
fpt->parentid = grp->formid;
387+
fpt->opacity = 1.0f;
388+
fpt->state = DT_MASKS_STATE_USE;
389+
if(pos > 0) fpt->state |= DT_MASKS_STATE_UNION;
390+
grp->points = g_list_append(grp->points, fpt);
391+
}
389392
pos++;
390393
}
391394
}
@@ -819,11 +822,14 @@ static void _tree_selection_change(GtkTreeSelection *selection, dt_lib_masks_t *
819822
{
820823
dt_masks_point_group_t *fpt =
821824
(dt_masks_point_group_t *)malloc(sizeof(dt_masks_point_group_t));
822-
fpt->formid = id;
823-
fpt->parentid = grid;
824-
fpt->state = DT_MASKS_STATE_USE;
825-
fpt->opacity = 1.0f;
826-
grp->points = g_list_append(grp->points, fpt);
825+
if(fpt)
826+
{
827+
fpt->formid = id;
828+
fpt->parentid = grid;
829+
fpt->state = DT_MASKS_STATE_USE;
830+
fpt->opacity = 1.0f;
831+
grp->points = g_list_append(grp->points, fpt);
832+
}
827833
// we eventually set the "show masks" icon of iops
828834
if(nb == 1 && (form->type & DT_MASKS_GROUP))
829835
{

src/libs/metadata.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -789,10 +789,13 @@ static void add_rights_preset(dt_lib_module_t *self, char *name, char *string)
789789
const unsigned int params_size = strlen(string) + metadata_nb;
790790

791791
char *params = calloc(sizeof(char), params_size);
792-
memcpy(params + 4, string, params_size - metadata_nb);
793-
dt_lib_presets_add(name, self->plugin_name, self->version(),
794-
params, params_size, TRUE, 0);
795-
free(params);
792+
if(params)
793+
{
794+
memcpy(params + 4, string, params_size - metadata_nb);
795+
dt_lib_presets_add(name, self->plugin_name, self->version(),
796+
params, params_size, TRUE, 0);
797+
free(params);
798+
}
796799
}
797800

798801
void init_presets(dt_lib_module_t *self)
@@ -908,6 +911,8 @@ void *get_params(dt_lib_module_t *self, int *size)
908911
}
909912

910913
char *params = (char *)malloc(*size);
914+
if(!params)
915+
return NULL;
911916

912917
int pos = 0;
913918

src/libs/metadata_view.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,14 @@ static void _lib_metadata_init_queue(dt_lib_module_t *self)
232232
for(int i = md_size - 1; i >= 0; i--)
233233
{
234234
dt_lib_metadata_info_t *m = g_malloc0(sizeof(dt_lib_metadata_info_t));
235-
m->name = (char *)_get_label(i);
236-
m->value = g_strdup(NODATA_STRING);
237-
m->index = m->order = i;
238-
m->visible = _is_metadata_ui(i);
239-
d->metadata = g_list_prepend(d->metadata, m);
235+
if(m)
236+
{
237+
m->name = (char *)_get_label(i);
238+
m->value = g_strdup(NODATA_STRING);
239+
m->index = m->order = i;
240+
m->visible = _is_metadata_ui(i);
241+
d->metadata = g_list_prepend(d->metadata, m);
242+
}
240243
}
241244
}
242245

src/libs/modulegroups.c

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,6 +1402,8 @@ static void _preset_from_string(dt_lib_module_t *self, gchar *txt, gboolean edit
14021402
{
14031403
dt_lib_modulegroups_basic_item_t *item
14041404
= (dt_lib_modulegroups_basic_item_t *)g_malloc0(sizeof(dt_lib_modulegroups_basic_item_t));
1405+
if(!item)
1406+
continue;
14051407
item->id = g_strdup(gr2[j]);
14061408
_basics_init_item(item);
14071409

@@ -1425,16 +1427,18 @@ static void _preset_from_string(dt_lib_module_t *self, gchar *txt, gboolean edit
14251427
const int nb = g_strv_length(gr2);
14261428
if(nb > 2)
14271429
{
1428-
dt_lib_modulegroups_group_t *group
1429-
= (dt_lib_modulegroups_group_t *)g_malloc0(sizeof(dt_lib_modulegroups_group_t));
1430-
group->name = g_strdup(gr2[0]);
1431-
group->icon = g_strdup(gr2[1]);
1432-
// gr2[2] is reserved for eventual future use
1433-
for(int j = 3; j < nb; j++)
1430+
dt_lib_modulegroups_group_t *group = g_malloc0(sizeof(dt_lib_modulegroups_group_t));
1431+
if(group)
14341432
{
1435-
group->modules = g_list_append(group->modules, g_strdup(gr2[j]));
1433+
group->name = g_strdup(gr2[0]);
1434+
group->icon = g_strdup(gr2[1]);
1435+
// gr2[2] is reserved for eventual future use
1436+
for(int j = 3; j < nb; j++)
1437+
{
1438+
group->modules = g_list_append(group->modules, g_strdup(gr2[j]));
1439+
}
1440+
res = g_list_prepend(res, group);
14361441
}
1437-
res = g_list_prepend(res, group);
14381442
}
14391443
g_strfreev(gr2);
14401444
}
@@ -2204,12 +2208,13 @@ static int _lib_modulegroups_basics_module_toggle_action(dt_lib_module_t *self,
22042208

22052209
if(!found_item)
22062210
{
2207-
dt_lib_modulegroups_basic_item_t *item
2208-
= (dt_lib_modulegroups_basic_item_t *)g_malloc0(sizeof(dt_lib_modulegroups_basic_item_t));
2209-
item->id = action_id;
2210-
_basics_init_item(item);
2211-
2212-
d->basics = g_list_append(d->basics, item);
2211+
dt_lib_modulegroups_basic_item_t *item = g_malloc0(sizeof(dt_lib_modulegroups_basic_item_t));
2212+
if(item)
2213+
{
2214+
item->id = action_id;
2215+
_basics_init_item(item);
2216+
d->basics = g_list_append(d->basics, item);
2217+
}
22132218
}
22142219
else
22152220
{
@@ -2264,12 +2269,13 @@ static void _manage_editor_basics_add(GtkWidget *widget,
22642269
g_free(action_id);
22652270
else
22662271
{
2267-
dt_lib_modulegroups_basic_item_t *item
2268-
= (dt_lib_modulegroups_basic_item_t *)g_malloc0(sizeof(dt_lib_modulegroups_basic_item_t));
2269-
item->id = action_id;
2270-
_basics_init_item(item);
2271-
2272-
d->edit_basics = g_list_append(d->edit_basics, item);
2272+
dt_lib_modulegroups_basic_item_t *item = g_malloc0(sizeof(dt_lib_modulegroups_basic_item_t));
2273+
if(item)
2274+
{
2275+
item->id = action_id;
2276+
_basics_init_item(item);
2277+
d->edit_basics = g_list_append(d->edit_basics, item);
2278+
}
22732279
_manage_editor_basics_update_list(self);
22742280
}
22752281
}
@@ -3468,16 +3474,18 @@ static void _manage_editor_group_add(GtkWidget *widget,
34683474
dt_lib_module_t *self)
34693475
{
34703476
dt_lib_modulegroups_t *d = (dt_lib_modulegroups_t *)self->data;
3471-
dt_lib_modulegroups_group_t *gr =
3472-
(dt_lib_modulegroups_group_t *)g_malloc0(sizeof(dt_lib_modulegroups_group_t));
3473-
gr->name = g_strdup(_("new"));
3474-
gr->icon = g_strdup("basic");
3475-
d->edit_groups = g_list_append(d->edit_groups, gr);
3476-
3477-
// we update the group list
3478-
GtkWidget *vb2 = _manage_editor_group_init_modules_box(self, gr);
3479-
gtk_box_pack_start(GTK_BOX(d->preset_groups_box), vb2, FALSE, TRUE, 0);
3480-
gtk_widget_show_all(vb2);
3477+
dt_lib_modulegroups_group_t *gr = g_malloc0(sizeof(dt_lib_modulegroups_group_t));
3478+
if(gr)
3479+
{
3480+
gr->name = g_strdup(_("new"));
3481+
gr->icon = g_strdup("basic");
3482+
d->edit_groups = g_list_append(d->edit_groups, gr);
3483+
3484+
// we update the group list
3485+
GtkWidget *vb2 = _manage_editor_group_init_modules_box(self, gr);
3486+
gtk_box_pack_start(GTK_BOX(d->preset_groups_box), vb2, FALSE, TRUE, 0);
3487+
gtk_widget_show_all(vb2);
3488+
}
34813489

34823490
// and we update arrows
34833491
_manage_editor_group_update_arrows(d->preset_groups_box);

src/libs/print_settings.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,11 @@ static int write_image(dt_imageio_module_data_t *data,
308308

309309
d->params->buf =
310310
(uint16_t *)malloc((size_t)3 * (d->bpp == 8?1:2) * d->head.width * d->head.height);
311+
if(!d->params->buf)
312+
{
313+
dt_print(DT_DEBUG_ALWAYS, "[print] unable to allocate memory for image %s\n", filename);
314+
return 1;
315+
}
311316

312317
if(d->bpp == 8)
313318
{

0 commit comments

Comments
 (0)