diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2022-07-31 03:54:20 +0200 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2022-07-31 03:54:53 +0200 | 
| commit | ea75579b33498cde54c34485aee28a69956ccaaf (patch) | |
| tree | e32ae8f624a770c6a7f5fccdbf2e33269b313467 | |
| parent | 8437164dec2816d7a08faf14c29dd5cbe8b51d02 (diff) | |
| download | fiv-ea75579b33498cde54c34485aee28a69956ccaaf.tar.gz fiv-ea75579b33498cde54c34485aee28a69956ccaaf.tar.xz fiv-ea75579b33498cde54c34485aee28a69956ccaaf.zip  | |
Fix a crash with empty exiftool stderr output
| -rw-r--r-- | fiv-view.c | 29 | 
1 files changed, 17 insertions, 12 deletions
@@ -1224,6 +1224,16 @@ get_target_path(GFile *file, GCancellable *cancellable)  	return path;  } +static gchar * +bytes_to_utf8(GBytes *bytes) +{ +	gsize length = 0; +	gconstpointer data = g_bytes_get_data(bytes, &length); +	gchar *utf8 = data ? g_utf8_make_valid(data, length) : g_strdup(""); +	g_bytes_unref(bytes); +	return utf8; +} +  static void  info(FivView *self)  { @@ -1238,14 +1248,14 @@ info(FivView *self)  	gchar *path = g_file_get_path(file);  	GError *error = NULL; -	GBytes *inbytes = NULL, *outbytes = NULL, *errbytes = NULL; +	GBytes *bytes_in = NULL, *bytes_out = NULL, *bytes_err = NULL;  	gchar *file_data = NULL;  	gsize file_len = 0;  	if (!path && !(path = get_target_path(file, NULL)) &&  		g_file_load_contents(file, NULL, &file_data, &file_len, NULL, &error)) {  		flags |= G_SUBPROCESS_FLAGS_STDIN_PIPE;  		path = g_strdup("-"); -		inbytes = g_bytes_new_take(file_data, file_len); +		bytes_in = g_bytes_new_take(file_data, file_len);  	}  	g_object_unref(file); @@ -1257,22 +1267,17 @@ info(FivView *self)  		"-quiet", "--", path, NULL);  	g_free(path);  	if (error || !g_subprocess_communicate( -		subprocess, inbytes, NULL, &outbytes, &errbytes, &error)) +		subprocess, bytes_in, NULL, &bytes_out, &bytes_err, &error))  		goto out; +	gchar *out = bytes_to_utf8(bytes_out); +	gchar *err = bytes_to_utf8(bytes_err);  	GtkWidget *dialog = gtk_widget_new(GTK_TYPE_DIALOG,  		"use-header-bar", TRUE,  		"title", "Information",  		"transient-for", window,  		"destroy-with-parent", TRUE, NULL); -	gchar *out = g_utf8_make_valid( -		g_bytes_get_data(outbytes, NULL), g_bytes_get_size(outbytes)); -	gchar *err = g_utf8_make_valid( -		g_bytes_get_data(errbytes, NULL), g_bytes_get_size(errbytes)); -	g_bytes_unref(outbytes); -	g_bytes_unref(errbytes); -  	GtkWidget *content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));  	if (*err) {  		GtkWidget *info = gtk_info_bar_new(); @@ -1309,8 +1314,8 @@ info(FivView *self)  out:  	if (error)  		show_error_dialog(window, error); -	if (inbytes) -		g_bytes_unref(inbytes); +	if (bytes_in) +		g_bytes_unref(bytes_in);  }  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
