diff --git a/doc/Changelog.html b/doc/Changelog.html index 6dd00938..686dcf5e 100644 --- a/doc/Changelog.html +++ b/doc/Changelog.html @@ -24,6 +24,7 @@ a:visited { color: #0000EE; }
  • Updated MediaInfo to v0.7.60 (2012-09-07), compiled with ICL 12.1.7 and MSVC 10.0
  • Updated language files (big thank-you to all contributors !!!)
  • Fixed a bug with the "Store temporary files in your system's default TEMP director" checkbox +
  • Fixed a buffer overflow in FAAD2 decoder which could cause crashes with very long file names
  • Fixed a regression in Qt v4.8.3 that broke Drag&Drop support (details #1) (details #2)
  • Reworked the "About..." dialog – now using a custom dialog instead of message boxes
    diff --git a/etc/Patches/FAAD-v2.7-UTF8+Flush+FixBufferOverrun.V2.diff b/etc/Patches/FAAD-v2.7-UTF8+Flush+FixBufferOverrun.V2.diff new file mode 100644 index 00000000..085be8df --- /dev/null +++ b/etc/Patches/FAAD-v2.7-UTF8+Flush+FixBufferOverrun.V2.diff @@ -0,0 +1,409 @@ + frontend/audio.c | 11 +++++- + frontend/main.c | 89 ++++++++++++++++++++++++++++++++--------- + frontend/unicode_support.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++ + frontend/unicode_support.h | 21 ++++++++++ + include/neaacdec.h | 6 +-- + 5 files changed, 202 insertions(+), 23 deletions(-) + +diff --git a/frontend/audio.c b/frontend/audio.c +index 067ac20..a502c6e 100644 +--- a/frontend/audio.c ++++ b/frontend/audio.c +@@ -37,11 +37,14 @@ + #include + #include + #include "audio.h" ++#include "unicode_support.h" + + + audio_file *open_audio_file(char *infile, int samplerate, int channels, + int outputFormat, int fileType, long channelMask) + { ++ wchar_t *fileNameW; ++ + audio_file *aufile = malloc(sizeof(audio_file)); + + aufile->outputFormat = outputFormat; +@@ -78,7 +81,13 @@ audio_file *open_audio_file(char *infile, int samplerate, int channels, + aufile->toStdio = 1; + } else { + aufile->toStdio = 0; +- aufile->sndfile = fopen(infile, "wb"); ++ aufile->sndfile = NULL; ++ fileNameW = utf8_to_utf16(infile); ++ if(fileNameW) ++ { ++ aufile->sndfile = _wfopen(fileNameW, L"wb"); ++ free(fileNameW); ++ } + } + + if (aufile->sndfile == NULL) +diff --git a/frontend/main.c b/frontend/main.c +index 04e2058..01a5b7a 100644 +--- a/frontend/main.c ++++ b/frontend/main.c +@@ -44,11 +44,13 @@ + #include + #include + #include ++#include + + #include + #include + + #include "audio.h" ++#include "unicode_support.h" + + #ifndef min + #define min(a,b) ( (a) < (b) ? (a) : (b) ) +@@ -71,6 +73,8 @@ static void faad_fprintf(FILE *stream, const char *fmt, ...) + vfprintf(stream, fmt, ap); + + va_end(ap); ++ ++ fflush(stream); + } + } + +@@ -443,7 +447,7 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std + NeAACDecFrameInfo frameInfo; + NeAACDecConfigurationPtr config; + +- char percents[200]; ++ char percents[300]; + int percent, old_percent = -1; + int bread, fileread; + int header_type = 0; +@@ -456,11 +460,19 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std + + aac_buffer b; + ++ wchar_t *fileNameW; ++ + memset(&b, 0, sizeof(aac_buffer)); + + if (adts_out) + { +- adtsFile = fopen(adts_fn, "wb"); ++ adtsFile = NULL; ++ fileNameW = utf8_to_utf16(adts_fn); ++ if(fileNameW) ++ { ++ adtsFile = _wfopen(fileNameW, L"wb"); ++ free(fileNameW); ++ } + if (adtsFile == NULL) + { + faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); +@@ -470,20 +482,26 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std + + if (0 == strcmp(aacfile, "-")) + { +- b.infile = stdin; ++ b.infile = stdin; + #ifdef _WIN32 + setmode(fileno(stdin), O_BINARY); + #endif +- +- } else ++ } ++ else + { +- b.infile = fopen(aacfile, "rb"); +- if (b.infile == NULL) +- { +- /* unable to open file */ +- faad_fprintf(stderr, "Error opening file: %s\n", aacfile); +- return 1; +- } ++ b.infile = NULL; ++ fileNameW = utf8_to_utf16(aacfile); ++ if(fileNameW) ++ { ++ b.infile = _wfopen(fileNameW, L"rb"); ++ free(fileNameW); ++ } ++ if (b.infile == NULL) ++ { ++ /* unable to open file */ ++ faad_fprintf(stderr, "Error opening file: %s\n", aacfile); ++ return 1; ++ } + } + + retval = fseek(b.infile, 0, SEEK_END); +@@ -708,7 +726,7 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std + if (percent > old_percent) + { + old_percent = percent; +- sprintf(percents, "%d%% decoding %s.", percent, aacfile); ++ _snprintf_s(percents, 300, _TRUNCATE, "[%d%%] decoding %s.", percent, aacfile); + faad_fprintf(stderr, "%s\r", percents); + #ifdef _WIN32 + SetConsoleTitle(percents); +@@ -810,7 +828,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + unsigned char *buffer; + int buffer_size; + +- char percents[200]; ++ char percents[300]; + int percent, old_percent = -1; + + int first_time = 1; +@@ -821,6 +839,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + unsigned int framesize; + unsigned long timescale; + ++ wchar_t *fileNameW; + + /* initialise the callback structure */ + mp4ff_callback_t *mp4cb = malloc(sizeof(mp4ff_callback_t)); +@@ -830,7 +849,14 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + return 1; + } + +- mp4File = fopen(mp4file, "rb"); ++ mp4File = NULL; ++ fileNameW = utf8_to_utf16(mp4file); ++ if(fileNameW) ++ { ++ mp4File = _wfopen(fileNameW, L"rb"); ++ free(fileNameW); ++ } ++ + mp4cb->read = read_callback; + mp4cb->seek = seek_callback; + mp4cb->user_data = mp4File; +@@ -847,7 +873,13 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + + if (adts_out) + { +- adtsFile = fopen(adts_fn, "wb"); ++ adtsFile = NULL; ++ fileNameW = utf8_to_utf16(adts_fn); ++ if(fileNameW) ++ { ++ adtsFile = _wfopen(fileNameW, L"wb"); ++ free(fileNameW); ++ } + if (adtsFile == NULL) + { + faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); +@@ -1053,7 +1085,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + if (percent > old_percent) + { + old_percent = percent; +- sprintf(percents, "%d%% decoding %s.", percent, mp4file); ++ _snprintf_s(percents, 300, _TRUNCATE, "[%d%%] decoding %s.", percent, mp4file); + faad_fprintf(stderr, "%s\r", percents); + #ifdef _WIN32 + SetConsoleTitle(percents); +@@ -1091,7 +1123,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std + return frameInfo.error; + } + +-int main(int argc, char *argv[]) ++int faad_main(int argc, char *argv[]) + { + int result; + int infoOnly = 0; +@@ -1115,6 +1147,7 @@ int main(int argc, char *argv[]) + unsigned char header[8]; + float length = 0; + FILE *hMP4File; ++ wchar_t *fileNameW; + + /* System dependant types */ + #ifdef _WIN32 +@@ -1345,7 +1378,13 @@ int main(int argc, char *argv[]) + } else { + + mp4file = 0; +- hMP4File = fopen(aacFileName, "rb"); ++ hMP4File = NULL; ++ fileNameW = utf8_to_utf16(aacFileName); ++ if(fileNameW) ++ { ++ hMP4File = _wfopen(fileNameW, L"rb"); ++ free(fileNameW); ++ } + if (!hMP4File) + { + faad_fprintf(stderr, "Error opening file: %s\n", aacFileName); +@@ -1408,3 +1447,15 @@ int main(int argc, char *argv[]) + + return 0; + } ++ ++int wmain(int argc, wchar_t **argv_utf16) ++{ ++ int result = 0; ++ char **argv_utf8 = NULL; ++ ++ init_commandline_arguments_utf8(argc, &argv_utf8, argv_utf16); ++ result = faad_main(argc, argv_utf8); ++ free_commandline_arguments_utf8(argc, &argv_utf8); ++ ++ return result; ++} +diff --git a/frontend/unicode_support.c b/frontend/unicode_support.c +new file mode 100644 +index 0000000..21ecd5c +--- /dev/null ++++ b/frontend/unicode_support.c +@@ -0,0 +1,98 @@ ++#include "unicode_support.h" ++ ++#include ++#include ++ ++char *utf16_to_utf8(const wchar_t *input) ++{ ++ char *Buffer; ++ int BuffSize, Result; ++ ++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); ++ Buffer = (char*) malloc(sizeof(char) * BuffSize); ++ ++ if(!Buffer) ++ { ++ fprintf(stderr, "Error in utf16_to_utf8: Memory allocation failed!\n"); ++ return NULL; ++ } ++ ++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL); ++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; ++} ++ ++wchar_t *utf8_to_utf16(const char *input) ++{ ++ wchar_t *Buffer; ++ int BuffSize, Result; ++ ++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); ++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); ++ ++ if(!Buffer) ++ { ++ fprintf(stderr, "Error in utf8_to_utf16: Memory allocation failed!\n"); ++ return NULL; ++ } ++ ++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize); ++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; ++} ++ ++void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16) ++{ ++ int i = 0; ++ ++ *argv_utf8 = (char**) malloc(argc * sizeof(char*)); ++ if(!(*argv_utf8)) ++ { ++ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n"); ++ exit(-1); ++ } ++ ++ for(i = 0; i < argc; i++) ++ { ++ (*argv_utf8)[i] = utf16_to_utf8(argv_utf16[i]); ++ if(!(*argv_utf8)[i]) ++ { ++ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n"); ++ exit(-1); ++ } ++ } ++} ++ ++void free_commandline_arguments_utf8(int argc, char ***argv_utf8) ++{ ++ int i = 0; ++ ++ if(*argv_utf8 != NULL) ++ { ++ for(i = 0; i < argc; i++) ++ { ++ if((*argv_utf8)[i] != NULL) ++ { ++ free((*argv_utf8)[i]); ++ (*argv_utf8)[i] = NULL; ++ } ++ } ++ free(*argv_utf8); ++ *argv_utf8 = NULL; ++ } ++} ++ ++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8) ++{ ++ FILE *ret = NULL; ++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8); ++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8); ++ ++ if(filename_utf16 && mode_utf16) ++ { ++ ret = _wfopen(filename_utf16, mode_utf16); ++ } ++ ++ if(filename_utf16) free(filename_utf16); ++ if(mode_utf16) free(mode_utf16); ++ ++ return ret; ++} +diff --git a/frontend/unicode_support.h b/frontend/unicode_support.h +new file mode 100644 +index 0000000..cc13fd9 +--- /dev/null ++++ b/frontend/unicode_support.h +@@ -0,0 +1,21 @@ ++#ifndef UNICODE_SUPPORT_H_INCLUDED ++#define UNICODE_SUPPORT_H_INCLUDED ++ ++#include ++#include ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++char *utf16_to_utf8(const wchar_t *input); ++wchar_t *utf8_to_utf16(const char *input); ++void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16); ++void free_commandline_arguments_utf8(int argc, char ***argv_utf8); ++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8); ++ ++#ifdef __cplusplus ++} ++#endif ++#endif +\ No newline at end of file +diff --git a/include/neaacdec.h b/include/neaacdec.h +index 610a00b..7904175 100644 +--- a/include/neaacdec.h ++++ b/include/neaacdec.h +@@ -202,7 +202,7 @@ typedef struct NeAACDecFrameInfo + unsigned char ps; + } NeAACDecFrameInfo; + +-char NEAACDECAPI *NeAACDecGetErrorMessage(unsigned char errcode); ++char* NEAACDECAPI NeAACDecGetErrorMessage(unsigned char errcode); + + unsigned long NEAACDECAPI NeAACDecGetCapabilities(void); + +@@ -235,12 +235,12 @@ void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, long frame); + + void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder); + +-void NEAACDECAPI *NeAACDecDecode(NeAACDecHandle hDecoder, ++void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size); + +-void NEAACDECAPI *NeAACDecDecode2(NeAACDecHandle hDecoder, ++void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size, diff --git a/etc/Patches/FAAD-v2.7-UTF8+Flush.V1.diff b/etc/Patches/deprecated/FAAD-v2.7-UTF8+Flush.V1.diff similarity index 100% rename from etc/Patches/FAAD-v2.7-UTF8+Flush.V1.diff rename to etc/Patches/deprecated/FAAD-v2.7-UTF8+Flush.V1.diff diff --git a/res/tools/faad.exe b/res/tools/faad.exe index b59bc20c..1abecdf6 100644 Binary files a/res/tools/faad.exe and b/res/tools/faad.exe differ diff --git a/src/Config.h b/src/Config.h index 9bf8c734..39c970a6 100644 --- a/src/Config.h +++ b/src/Config.h @@ -30,7 +30,7 @@ #define VER_LAMEXP_MINOR_LO 6 #define VER_LAMEXP_TYPE RC #define VER_LAMEXP_PATCH 2 -#define VER_LAMEXP_BUILD 1158 +#define VER_LAMEXP_BUILD 1159 /////////////////////////////////////////////////////////////////////////////// // Tool versions (minimum expected versions!) diff --git a/src/Tools.h b/src/Tools.h index b3252836..77ae3536 100644 --- a/src/Tools.h +++ b/src/Tools.h @@ -58,7 +58,7 @@ g_lamexp_tools[] = {"6d22d4bbd7ce2162e38f70ac9187bc84eb28233b36ee6c0492d0a6195318782d7f05c444", CPU_TYPE_ALL_ALL, "avs2wav.exe", 13}, {"8fe60580f10542c25c81f03e130caf128daa1f825b621d9c7c134d8f06948f8c16f787f2", CPU_TYPE_ALL_ALL, "dcaenc.exe", 20120419}, {"e53a787d4a0319453f4fe48c3145f190fcce7ac4802e521db908771437f6250746116e6c", CPU_TYPE_ALL_ALL, "elevator.exe", UINT_MAX}, - {"9ae98a3fc779f69ee876a3b477fbc35a709ba5066823b2eb62eeb015057c38807e4be51f", CPU_TYPE_ALL_ALL, "faad.exe", 27}, + {"f53174553c7e2daa692f020f5ce802109d67585ba44992876399e333c9ae9b9481f6cd3a", CPU_TYPE_ALL_ALL, "faad.exe", 27}, {"446054f9a7f705f1aadc9053ca7b8a86a775499ef159978954ebdea92de056c34f8841f7", CPU_TYPE_ALL_ALL, "flac.exe", 121}, {"52fce35084247acc12cd5d06701c143ade9a0915fc9902bb402abd164ea35f28717432a4", CPU_TYPE_ALL_ALL, "gpgv.exe", 1412}, {"b3fca757b3567dab75c042e62213c231de378ea0fdd7fe29b733417cd5d3d33558452f94", CPU_TYPE_ALL_ALL, "gpgv.gpg", UINT_MAX},