[file-roller/gnome-2-30] [rar] fixed seg fault when there is an extra info line in the output
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [file-roller/gnome-2-30] [rar] fixed seg fault when there is an extra info line in the output
- Date: Fri, 25 Jun 2010 10:47:32 +0000 (UTC)
commit bac5d03a29a411c79e0d838d48c404900d30066d
Author: Paolo Bacchilega <paobac src gnome org>
Date: Fri Jun 25 12:45:32 2010 +0200
[rar] fixed seg fault when there is an extra info line in the output
src/fr-command-rar.c | 94 ++++++++++++++++++++++++++++----------------------
1 files changed, 53 insertions(+), 41 deletions(-)
---
diff --git a/src/fr-command-rar.c b/src/fr-command-rar.c
index 482ab57..2c42ba4 100644
--- a/src/fr-command-rar.c
+++ b/src/fr-command-rar.c
@@ -117,6 +117,59 @@ process_line (char *line,
return;
}
+ if (! rar_comm->odd_line) {
+ FileData *fdata;
+
+ fdata = rar_comm->fdata;
+
+ /* read file info. */
+
+ fields = split_line (line, 6);
+ if (g_strv_length (fields) < 6) {
+ /* wrong line format, treat this line as a filename line */
+ g_strfreev (fields);
+ file_data_free (rar_comm->fdata);
+ rar_comm->fdata = NULL;
+ rar_comm->odd_line = TRUE;
+ }
+ else {
+ if ((strcmp (fields[2], "<->") == 0)
+ || (strcmp (fields[2], "<--") == 0))
+ {
+ /* ignore files that span more volumes */
+
+ file_data_free (rar_comm->fdata);
+ rar_comm->fdata = NULL;
+ }
+ else {
+ fdata->size = g_ascii_strtoull (fields[0], NULL, 10);
+ fdata->modified = mktime_from_string (fields[3], fields[4]);
+
+ if ((fields[5][1] == 'D') || (fields[5][0] == 'd')) {
+ char *tmp;
+
+ tmp = fdata->full_path;
+ fdata->full_path = g_strconcat (fdata->full_path, "/", NULL);
+
+ fdata->original_path = g_strdup (fdata->original_path);
+ fdata->free_original_path = TRUE;
+
+ g_free (tmp);
+
+ fdata->name = dir_name_from_path (fdata->full_path);
+ fdata->dir = TRUE;
+ }
+ else
+ fdata->name = g_strdup (file_name_from_path (fdata->full_path));
+
+ fr_command_add_file (comm, fdata);
+ rar_comm->fdata = NULL;
+ }
+
+ g_strfreev (fields);
+ }
+ }
+
if (rar_comm->odd_line) {
FileData *fdata;
@@ -141,48 +194,7 @@ process_line (char *line,
fdata->path = remove_level_from_path (fdata->full_path);
}
else {
- FileData *fdata;
-
- fdata = rar_comm->fdata;
-
- /* read file info. */
-
- fields = split_line (line, 6);
-
- if ((strcmp (fields[2], "<->") == 0)
- || (strcmp (fields[2], "<--") == 0))
- {
- /* ignore files that span more volumes */
-
- file_data_free (rar_comm->fdata);
- rar_comm->fdata = NULL;
- }
- else {
- fdata->size = g_ascii_strtoull (fields[0], NULL, 10);
- fdata->modified = mktime_from_string (fields[3], fields[4]);
-
- if ((fields[5][1] == 'D') || (fields[5][0] == 'd')) {
- char *tmp;
-
- tmp = fdata->full_path;
- fdata->full_path = g_strconcat (fdata->full_path, "/", NULL);
-
- fdata->original_path = g_strdup (fdata->original_path);
- fdata->free_original_path = TRUE;
-
- g_free (tmp);
-
- fdata->name = dir_name_from_path (fdata->full_path);
- fdata->dir = TRUE;
- }
- else
- fdata->name = g_strdup (file_name_from_path (fdata->full_path));
-
- fr_command_add_file (comm, fdata);
- rar_comm->fdata = NULL;
- }
- g_strfreev (fields);
}
rar_comm->odd_line = ! rar_comm->odd_line;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]