Safer __TIMESTAMP__, __FILE__, and friends

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2638 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-06-12 22:44:45 +00:00
parent b523639b83
commit 6d246677db
2 changed files with 47 additions and 31 deletions

View file

@ -51,7 +51,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../makensis.exe" /opt:nowin98 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib /nologo /subsystem:console /pdb:none /map /machine:I386 /out:"../makensis.exe" /opt:nowin98
!ELSEIF "$(CFG)" == "makenssi - Win32 Debug" !ELSEIF "$(CFG)" == "makenssi - Win32 Debug"

View file

@ -23,8 +23,12 @@
// Added by Sunil Kamath 11 June 2003 // Added by Sunil Kamath 11 June 2003
char *CEXEBuild::set_file_predefine(char *filename) char *CEXEBuild::set_file_predefine(char *filename)
{ {
char *oldfilename = strdup(definedlist.find("__FILE__")); char *oldfilename = definedlist.find("__FILE__");
if(oldfilename) definedlist.del("__FILE__"); if(oldfilename)
{
oldfilename = strdup(oldfilename);
definedlist.del("__FILE__");
}
char *p = strrchr(filename,'\\'); char *p = strrchr(filename,'\\');
if(p) { if(p) {
p++; p++;
@ -32,7 +36,6 @@ char *CEXEBuild::set_file_predefine(char *filename)
else { else {
p = curfilename; p = curfilename;
} }
p = strdup(p);
definedlist.add("__FILE__",p); definedlist.add("__FILE__",p);
return oldfilename; return oldfilename;
@ -46,30 +49,32 @@ void CEXEBuild::restore_file_predefine(char *oldfilename)
char *CEXEBuild::set_timestamp_predefine(char *filename) char *CEXEBuild::set_timestamp_predefine(char *filename)
{ {
char *oldtimestamp = strdup(definedlist.find("__TIMESTAMP__")); char *oldtimestamp = definedlist.find("__TIMESTAMP__");
if(oldtimestamp) definedlist.del("__TIMESTAMP__"); if(oldtimestamp) {
oldtimestamp = strdup(oldtimestamp);
definedlist.del("__TIMESTAMP__");
}
char *timestampbuf = (char *)malloc(100); char timestampbuf[256] = "";
char datebuf[80]; char datebuf[128] = "";
char timebuf[16]; char timebuf[128] = "";
struct stat fs; WIN32_FIND_DATA fd;
struct tm * ltime; SYSTEMTIME stime, sloctime;
SYSTEMTIME stime;
stat(filename, &fs);
ltime = localtime(&fs.st_mtime);
stime.wYear = ltime->tm_year+1900;
stime.wMonth = ltime->tm_mon + 1;
stime.wDay = ltime->tm_mday;
stime.wHour= ltime->tm_hour;
stime.wMinute= ltime->tm_min;
stime.wSecond= ltime->tm_sec;
stime.wMilliseconds= 0;
GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &stime, NULL, datebuf, sizeof(datebuf));
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &stime, NULL, timebuf, sizeof(timebuf));
wsprintf(timestampbuf,"%s %s",datebuf,timebuf);
definedlist.add("__TIMESTAMP__",timestampbuf); HANDLE hSearch = FindFirstFile(filename, &fd);
if (hSearch != INVALID_HANDLE_VALUE)
{
FindClose(hSearch);
FileTimeToSystemTime(&fd.ftLastWriteTime, &stime);
SystemTimeToTzSpecificLocalTime(0, &stime, &sloctime);
GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &sloctime, NULL, datebuf, sizeof(datebuf));
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &sloctime, NULL, timebuf, sizeof(timebuf));
wsprintf(timestampbuf,"%s %s",datebuf,timebuf);
definedlist.add("__TIMESTAMP__",timestampbuf);
}
return oldtimestamp; return oldtimestamp;
} }
@ -82,11 +87,14 @@ void CEXEBuild::restore_timestamp_predefine(char *oldtimestamp)
char *CEXEBuild::set_line_predefine(int linecnt) char *CEXEBuild::set_line_predefine(int linecnt)
{ {
char *linebuf = (char *)malloc(8); char linebuf[32] = "";
wsprintf(linebuf,"%d",linecnt); wsprintf(linebuf,"%d",linecnt);
char *oldline = (char *)strdup(definedlist.find("__LINE__")); char *oldline = definedlist.find("__LINE__");
if(oldline) definedlist.del("__LINE__"); if(oldline) {
oldline = strdup(oldline);
definedlist.del("__LINE__");
}
definedlist.add("__LINE__",linebuf); definedlist.add("__LINE__",linebuf);
return oldline; return oldline;
@ -122,7 +130,9 @@ int CEXEBuild::process_script(FILE *filepointer, char *filename)
#ifdef NSIS_SUPPORT_STANDARD_PREDEFINES #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES
// Added by Sunil Kamath 11 June 2003 // Added by Sunil Kamath 11 June 2003
restore_file_predefine(oldfilename); restore_file_predefine(oldfilename);
if (oldfilename) free(oldfilename);
restore_timestamp_predefine(oldtimestamp); restore_timestamp_predefine(oldtimestamp);
if (oldtimestamp) free(oldtimestamp);
#endif #endif
fp = 0; fp = 0;
@ -427,6 +437,7 @@ int CEXEBuild::parseScript()
#ifdef NSIS_SUPPORT_STANDARD_PREDEFINES #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES
// Added by Sunil Kamath 11 June 2003 // Added by Sunil Kamath 11 June 2003
restore_line_predefine(oldline); restore_line_predefine(oldline);
if (oldline) free(oldline);
#endif #endif
if (ret != PS_OK) return ret; if (ret != PS_OK) return ret;
@ -450,8 +461,8 @@ int CEXEBuild::process_oneline(char *line, char *filename, int linenum)
char *oldfilename = NULL; char *oldfilename = NULL;
char *oldtimestamp = NULL; char *oldtimestamp = NULL;
char *oldline = NULL; char *oldline = NULL;
BOOL is_commandline = !lstrcmp(filename,"command line"); BOOL is_commandline = !strcmp(filename,"command line");
BOOL is_macro = !strncmp(filename,"macro:",lstrlen("macro:")); BOOL is_macro = !strncmp(filename,"macro:",strlen("macro:"));
if(!is_commandline) { // Don't set the predefines for command line /X option if(!is_commandline) { // Don't set the predefines for command line /X option
if(is_macro) { if(is_macro) {
@ -472,9 +483,12 @@ int CEXEBuild::process_oneline(char *line, char *filename, int linenum)
if(!is_commandline) { // Don't set the predefines for command line /X option if(!is_commandline) { // Don't set the predefines for command line /X option
if(!is_macro) { if(!is_macro) {
restore_file_predefine(oldfilename); restore_file_predefine(oldfilename);
if (oldfilename) free(oldfilename);
restore_timestamp_predefine(oldtimestamp); restore_timestamp_predefine(oldtimestamp);
if (oldtimestamp) free(oldtimestamp);
} }
restore_line_predefine(oldline); restore_line_predefine(oldline);
if (oldline) free(oldline);
} }
#endif #endif
@ -2251,7 +2265,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
#ifdef NSIS_SUPPORT_STANDARD_PREDEFINES #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES
// Added by Sunil Kamath 11 June 2003 // Added by Sunil Kamath 11 June 2003
restore_file_predefine(oldfilename); restore_file_predefine(oldfilename);
if (oldfilename) free(oldfilename);
restore_timestamp_predefine(oldtimestamp); restore_timestamp_predefine(oldtimestamp);
if (oldtimestamp) free(oldtimestamp);
#endif #endif