diff --git a/src/fileformats.c b/src/fileformats.c index b868fc4f..808ecd44 100644 --- a/src/fileformats.c +++ b/src/fileformats.c @@ -4473,28 +4473,19 @@ void Load_GIF(T_IO_Context * context) else if (!memcmp(aeb,"GFX2PATH\x00\x00\x00",0x0B)) { // Original file path - if (context->Original_file_name && context->Original_file_directory) + Read_byte(GIF_file,&size_to_read); + if (!File_error && size_to_read > 0) { - Read_byte(GIF_file,&size_to_read); - if (!File_error && size_to_read) + free(context->Original_file_directory); + context->Original_file_directory = malloc(size_to_read); + Read_bytes(GIF_file, context->Original_file_directory, size_to_read); + Read_byte(GIF_file, &size_to_read); + if (!File_error && size_to_read > 0) { - Read_bytes(GIF_file,context->Original_file_directory, size_to_read); - Read_byte(GIF_file,&size_to_read); - if (!File_error && size_to_read) - { - Read_bytes(GIF_file,context->Original_file_name, size_to_read); - Read_byte(GIF_file,&size_to_read); // Normally 0 - } - } - } - else - { - // Nothing to do, just skip sub-block - Read_byte(GIF_file,&size_to_read); - while (size_to_read!=0 && !File_error) - { - fseek(GIF_file,size_to_read,SEEK_CUR); - Read_byte(GIF_file,&size_to_read); + free(context->Original_file_name); + context->Original_file_name = malloc(size_to_read); + Read_bytes(GIF_file, context->Original_file_name, size_to_read); + Read_byte(GIF_file, &size_to_read); // Normally 0 } } } diff --git a/src/loadsave.c b/src/loadsave.c index 40cc2679..d52ebf5d 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -827,11 +827,13 @@ void Load_image(T_IO_Context *context) free(Main.backups->Pages->File_directory); free(Main.backups->Pages->Filename_unicode); Main.backups->Pages->Filename_unicode = NULL; - if (context->Original_file_name && context->Original_file_name[0] - && context->Original_file_directory && context->Original_file_directory[0]) + if (context->Original_file_name != NULL + && context->Original_file_directory != NULL) { - Main.backups->Pages->Filename = strdup(context->Original_file_name); /// @todo steal buffer ! - Main.backups->Pages->File_directory = strdup(context->Original_file_directory); + Main.backups->Pages->Filename = context->Original_file_name; // steal buffer ! + context->Original_file_name = NULL; + Main.backups->Pages->File_directory = context->Original_file_directory; // steal heap buffer + context->Original_file_directory = NULL; } else { @@ -1736,6 +1738,8 @@ void Destroy_context(T_IO_Context *context) free(context->File_name); free(context->File_name_unicode); free(context->File_directory); + free(context->Original_file_directory); + free(context->Original_file_name); memset(context, 0, sizeof(T_IO_Context)); } @@ -2006,13 +2010,9 @@ byte Process_backups(T_String_list **list) { // Load this file T_IO_Context context; - char file_name[MAX_PATH_CHARACTERS]=""; - char file_directory[MAX_PATH_CHARACTERS]=""; Init_context_backup_image(&context, files_vector[i], Config_directory); // Provide buffers to read original location - context.Original_file_name = file_name; - context.Original_file_directory = file_directory; Load_image(&context); Main.image_is_modified=1; Destroy_context(&context); @@ -2126,8 +2126,8 @@ void Rotate_safety_backups(void) Init_context_backup_image(&context, file_name, Config_directory); context.Format=FORMAT_GIF; // Provide original file data, to store as a GIF Application Extension - context.Original_file_name = Main.backups->Pages->Filename; - context.Original_file_directory = Main.backups->Pages->File_directory; + context.Original_file_name = strdup(Main.backups->Pages->Filename); + context.Original_file_directory = strdup(Main.backups->Pages->File_directory); Save_image(&context); Destroy_context(&context); diff --git a/src/miscfileformats.c b/src/miscfileformats.c index 4b25aba4..6f10f2e5 100644 --- a/src/miscfileformats.c +++ b/src/miscfileformats.c @@ -36,6 +36,7 @@ #if _MSC_VER < 1900 #define snprintf _snprintf #endif +#define strdup _strdup #endif #include