Skip to content

Commit 306786d

Browse files
dt_image_t not available fixes (proposal shutdown part 4)
If we get `dt_image_t *img = dt_image_cache_get()` from the image cache, img can be NULL for various reasons. In all those cases we must not de-reference img in any way and must use a meaningful value - like when getting the imgid - and avoid further processing on that data. We had that being checked in most cases, a few ones have been overseen yet.
1 parent f4c464f commit 306786d

File tree

5 files changed

+67
-26
lines changed

5 files changed

+67
-26
lines changed

src/common/datetime.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ GTimeSpan dt_datetime_now_to_gtimespan(void)
233233
void dt_datetime_exif_to_img(dt_image_t *img,
234234
const char *exif)
235235
{
236-
if(!exif) return;
236+
if(!exif || !img) return;
237237
GDateTime *gdt = dt_datetime_exif_to_gdatetime(exif, darktable.utc_tz);
238238
if(gdt)
239239
{
@@ -247,7 +247,7 @@ gboolean dt_datetime_img_to_exif(char *exif,
247247
const size_t exif_size,
248248
const dt_image_t *img)
249249
{
250-
return dt_datetime_gtimespan_to_exif(exif, exif_size, img->exif_datetime_taken);
250+
return img ? dt_datetime_gtimespan_to_exif(exif, exif_size, img->exif_datetime_taken) : FALSE;
251251
}
252252

253253
GDateTime *dt_datetime_exif_to_gdatetime(const char *exif,

src/common/exif.cc

+22-2
Original file line numberDiff line numberDiff line change
@@ -2177,6 +2177,11 @@ static bool _exif_decode_exif_data(dt_image_t *img, Exiv2::ExifData &exifData)
21772177

21782178
void dt_exif_apply_default_metadata(dt_image_t *img)
21792179
{
2180+
if(!img)
2181+
{
2182+
dt_print(DT_DEBUG_ALWAYS, "[dt_exif_apply_default_metadata] failed as no img was provided");
2183+
return;
2184+
}
21802185
if(dt_conf_get_bool("ui_last/import_apply_metadata")
21812186
&& !(img->job_flags & DT_IMAGE_JOB_NO_METADATA))
21822187
{
@@ -2240,6 +2245,11 @@ gboolean dt_exif_read_from_blob(dt_image_t *img,
22402245
uint8_t *blob,
22412246
const int size)
22422247
{
2248+
if(!img)
2249+
{
2250+
dt_print(DT_DEBUG_ALWAYS, "[exiv2 dt_exif_read_from_blob] failed as no img was provided");
2251+
return TRUE;
2252+
}
22432253
try
22442254
{
22452255
Exiv2::ExifData exifData;
@@ -2321,6 +2331,11 @@ gboolean dt_exif_get_thumbnail(const char *path,
23212331
gboolean dt_exif_read(dt_image_t *img,
23222332
const char *path)
23232333
{
2334+
if(!img)
2335+
{
2336+
dt_print(DT_DEBUG_ALWAYS, "[dt_exif_read] failed as no img was provided");
2337+
return TRUE;
2338+
}
23242339
// At least set 'datetime taken' to something useful in case there is
23252340
// no Exif data in this file (pfm, png, ...)
23262341
struct stat statbuf;
@@ -2778,7 +2793,7 @@ int dt_exif_read_blob(uint8_t **buf,
27782793
// GPS data
27792794
_remove_exif_geotag(exifData);
27802795
const dt_image_t *cimg = dt_image_cache_get(darktable.image_cache, imgid, 'r');
2781-
if(!std::isnan(cimg->geoloc.longitude) && !std::isnan(cimg->geoloc.latitude))
2796+
if(cimg && !std::isnan(cimg->geoloc.longitude) && !std::isnan(cimg->geoloc.latitude))
27822797
{
27832798
exifData["Exif.GPSInfo.GPSVersionID"] = "02 02 00 00";
27842799
exifData["Exif.GPSInfo.GPSLongitudeRef"] = (cimg->geoloc.longitude < 0) ? "W" : "E";
@@ -2799,7 +2814,7 @@ int dt_exif_read_blob(uint8_t **buf,
27992814
g_free(long_str);
28002815
g_free(lat_str);
28012816
}
2802-
if(!std::isnan(cimg->geoloc.elevation))
2817+
if(cimg && !std::isnan(cimg->geoloc.elevation))
28032818
{
28042819
exifData["Exif.GPSInfo.GPSVersionID"] = "02 02 00 00";
28052820
exifData["Exif.GPSInfo.GPSAltitudeRef"] = (cimg->geoloc.elevation < 0) ? "1" : "0";
@@ -3801,6 +3816,11 @@ gboolean dt_exif_xmp_read(dt_image_t *img,
38013816
const char *filename,
38023817
const int history_only)
38033818
{
3819+
if(!img)
3820+
{
3821+
dt_print(DT_DEBUG_ALWAYS, "[dt_exif_xmp_read] failed as no img was provided for '%s'", filename);
3822+
return TRUE;
3823+
}
38043824
// Exclude pfm to avoid stupid errors on the console
38053825
const char *c = filename + strlen(filename) - 4;
38063826
if(c >= filename && !strcmp(c, ".pfm")) return TRUE;

src/common/grouping.c

+26-14
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void dt_grouping_add_to_group(const dt_imgid_t group_id,
3939
dt_grouping_remove_from_group(image_id);
4040

4141
dt_image_t *img = dt_image_cache_get(darktable.image_cache, image_id, 'w');
42+
if(!img) return;
4243
img->group_id = group_id;
4344
dt_image_cache_write_release_info(darktable.image_cache, img,
4445
DT_IMAGE_CACHE_SAFE, "dt_grouping_add_to_group");
@@ -65,7 +66,7 @@ dt_imgid_t dt_grouping_remove_from_group(const dt_imgid_t image_id)
6566
GList *imgs = NULL;
6667

6768
const dt_image_t *img = dt_image_cache_get(darktable.image_cache, image_id, 'r');
68-
const int img_group_id = img->group_id;
69+
const dt_imgid_t img_group_id = img ? img->group_id : NO_IMGID;
6970
dt_image_cache_read_release(darktable.image_cache, img);
7071
if(img_group_id == image_id)
7172
{
@@ -84,10 +85,13 @@ dt_imgid_t dt_grouping_remove_from_group(const dt_imgid_t image_id)
8485
if(!dt_is_valid_imgid(new_group_id))
8586
new_group_id = other_id;
8687
dt_image_t *other_img = dt_image_cache_get(darktable.image_cache, other_id, 'w');
87-
other_img->group_id = new_group_id;
88-
dt_image_cache_write_release_info(darktable.image_cache, other_img,
88+
if(other_img)
89+
{
90+
other_img->group_id = new_group_id;
91+
dt_image_cache_write_release_info(darktable.image_cache, other_img,
8992
DT_IMAGE_CACHE_SAFE, "dt_grouping_add_to_group");
90-
imgs = g_list_prepend(imgs, GINT_TO_POINTER(other_id));
93+
imgs = g_list_prepend(imgs, GINT_TO_POINTER(other_id));
94+
}
9195
}
9296
sqlite3_finalize(stmt);
9397
if(dt_is_valid_imgid(new_group_id))
@@ -122,13 +126,15 @@ dt_imgid_t dt_grouping_remove_from_group(const dt_imgid_t image_id)
122126
{
123127
// change the group_id for this image.
124128
dt_image_t *wimg = dt_image_cache_get(darktable.image_cache, image_id, 'w');
125-
new_group_id = wimg->group_id;
126-
wimg->group_id = image_id;
127-
dt_image_cache_write_release_info(darktable.image_cache, wimg,
129+
if(wimg)
130+
{
131+
new_group_id = wimg->group_id;
132+
wimg->group_id = image_id;
133+
dt_image_cache_write_release_info(darktable.image_cache, wimg,
128134
DT_IMAGE_CACHE_SAFE, "dt_grouping_add_to_group");
129-
imgs = g_list_prepend(imgs, GINT_TO_POINTER(image_id));
130-
// refresh also the group leader which may be alone now
131-
imgs = g_list_prepend(imgs, GINT_TO_POINTER(img_group_id));
135+
imgs = g_list_prepend(imgs, GINT_TO_POINTER(image_id));
136+
// refresh also the group leader which may be alone now
137+
imgs = g_list_prepend(imgs, GINT_TO_POINTER(img_group_id));
132138
#ifdef USE_LUA
133139
dt_lua_async_call_alien(dt_lua_event_trigger_wrapper,
134140
0, NULL, NULL,
@@ -138,6 +144,7 @@ dt_imgid_t dt_grouping_remove_from_group(const dt_imgid_t image_id)
138144
LUA_ASYNC_TYPENAME, "dt_lua_image_t", GINT_TO_POINTER(img_group_id),
139145
LUA_ASYNC_DONE);
140146
#endif
147+
}
141148
}
142149
DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_IMAGE_INFO_CHANGED, imgs);
143150

@@ -150,8 +157,10 @@ dt_imgid_t dt_grouping_change_representative(const dt_imgid_t image_id)
150157
sqlite3_stmt *stmt;
151158

152159
dt_image_t *img = dt_image_cache_get(darktable.image_cache, image_id, 'r');
153-
const dt_imgid_t group_id = img->group_id;
160+
const dt_imgid_t group_id = img ? img->group_id : NO_IMGID;
154161
dt_image_cache_read_release(darktable.image_cache, img);
162+
if(!dt_is_valid_imgid(group_id))
163+
return group_id;
155164

156165
GList *imgs = NULL;
157166
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id FROM main.images WHERE group_id = ?1", -1,
@@ -161,11 +170,14 @@ dt_imgid_t dt_grouping_change_representative(const dt_imgid_t image_id)
161170
{
162171
const dt_imgid_t other_id = sqlite3_column_int(stmt, 0);
163172
dt_image_t *other_img = dt_image_cache_get(darktable.image_cache, other_id, 'w');
164-
other_img->group_id = image_id;
165-
dt_image_cache_write_release_info(darktable.image_cache, other_img,
173+
if(other_img)
174+
{
175+
other_img->group_id = image_id;
176+
dt_image_cache_write_release_info(darktable.image_cache, other_img,
166177
DT_IMAGE_CACHE_SAFE,
167178
"dt_grouping_change_representative");
168-
imgs = g_list_prepend(imgs, GINT_TO_POINTER(other_id));
179+
imgs = g_list_prepend(imgs, GINT_TO_POINTER(other_id));
180+
}
169181
}
170182
sqlite3_finalize(stmt);
171183
DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_IMAGE_INFO_CHANGED, imgs);

src/common/image.c

+10-8
Original file line numberDiff line numberDiff line change
@@ -1100,11 +1100,11 @@ void dt_image_set_raw_aspect_ratio(const dt_imgid_t imgid)
11001100
image->aspect_ratio = (float )image->p_width / (float )(MAX(1, image->p_height));
11011101
else
11021102
image->aspect_ratio = (float )image->p_height / (float )(MAX(1, image->p_width));
1103-
}
1104-
/* store */
1105-
dt_image_cache_write_release_info(darktable.image_cache, image,
1103+
/* store */
1104+
dt_image_cache_write_release_info(darktable.image_cache, image,
11061105
DT_IMAGE_CACHE_SAFE,
11071106
"dt_image_set_raw_aspect_ratio");
1107+
}
11081108
}
11091109

11101110
void dt_image_set_aspect_ratio_to(const dt_imgid_t imgid,
@@ -1163,17 +1163,19 @@ void dt_image_reset_aspect_ratio(const dt_imgid_t imgid, const gboolean raise)
11631163
dt_image_t *image = dt_image_cache_get(darktable.image_cache, imgid, 'w');
11641164

11651165
/* set image aspect ratio */
1166-
if(image) image->aspect_ratio = 0.f;
1167-
1168-
/* store in db, but don't synch XMP */
1169-
dt_image_cache_write_release_info(darktable.image_cache, image,
1166+
if(image)
1167+
{
1168+
image->aspect_ratio = 0.f;
1169+
/* store in db, but don't synch XMP */
1170+
dt_image_cache_write_release_info(darktable.image_cache, image,
11701171
DT_IMAGE_CACHE_RELAXED,
11711172
"dt_image_reset_aspect_ratio");
11721173

1173-
if(image && raise && darktable.collection->params.sorts[DT_COLLECTION_SORT_ASPECT_RATIO])
1174+
if(raise && darktable.collection->params.sorts[DT_COLLECTION_SORT_ASPECT_RATIO])
11741175
dt_collection_update_query(darktable.collection, DT_COLLECTION_CHANGE_RELOAD,
11751176
DT_COLLECTION_PROP_ASPECT_RATIO,
11761177
g_list_prepend(NULL, GINT_TO_POINTER(imgid)));
1178+
}
11771179
}
11781180

11791181
float dt_image_set_aspect_ratio(const dt_imgid_t imgid, const gboolean raise)

src/imageio/imageio_rawspeed.cc

+7
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ dt_imageio_retval_t dt_imageio_open_rawspeed(dt_image_t *img,
168168
if(_ignore_image(filename))
169169
return DT_IMAGEIO_UNSUPPORTED_FORMAT;
170170

171+
if(!img)
172+
{
173+
dt_print(DT_DEBUG_ALWAYS, "[dt_imageio_open_rawspeed] failed to get dt_image_t for '%s' at %p",
174+
filename, mbuf);
175+
return DT_IMAGEIO_LOAD_FAILED;
176+
}
177+
171178
if(!img->exif_inited)
172179
(void)dt_exif_read(img, filename);
173180

0 commit comments

Comments
 (0)