fixed bug #1696534 - Broken Parameter Handling for Makensisw.exe v.2.3

the entire command line processing and handling of g_sdata.script is overly complex and apparently a bit malfunctioning... for example, g_sdata.script, while expected to contain just the file name, contains every command line argument passed to makensisw and also quotes


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5044 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2007-04-10 20:31:20 +00:00
parent 39e22a96dd
commit d545d00bda
4 changed files with 92 additions and 74 deletions

View file

@ -43,7 +43,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd
my_memset(&g_resize,0,sizeof(NRESIZEDATA)); my_memset(&g_resize,0,sizeof(NRESIZEDATA));
my_memset(&g_find,0,sizeof(NFINDREPLACE)); my_memset(&g_find,0,sizeof(NFINDREPLACE));
g_sdata.hInstance=GetModuleHandle(0); g_sdata.hInstance=GetModuleHandle(0);
g_sdata.script_alloced=false;
g_sdata.symbols = NULL; g_sdata.symbols = NULL;
g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, "makensis win32 signint event"); g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, "makensis win32 signint event");
RestoreSymbols(); RestoreSymbols();
@ -70,34 +69,98 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd
} }
} }
} }
if (g_sdata.script_alloced) GlobalFree(g_sdata.script); if (g_sdata.script) GlobalFree(g_sdata.script);
if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event);
FinalizeUpdate(); FinalizeUpdate();
ExitProcess(msg.wParam); ExitProcess(msg.wParam);
return msg.wParam; return msg.wParam;
} }
void SetScript(const char *script)
{
if (g_sdata.script)
{
GlobalFree(g_sdata.script);
}
g_sdata.script = (char *) GlobalAlloc(GPTR, lstrlen(script) + 1);
lstrcpy(g_sdata.script, script);
}
void AddScriptCmdArgs(const char *arg)
{
g_sdata.script_cmd_args = (char *) GlobalReAlloc(g_sdata.script_cmd_args,
GlobalSize(g_sdata.script_cmd_args) + 2 /* quotes */ + 1 /* space */,
0);
lstrcat(g_sdata.script_cmd_args, " \"");
lstrcat(g_sdata.script_cmd_args, arg);
lstrcat(g_sdata.script_cmd_args, "\"");
}
void ResetInputScript() void ResetInputScript()
{ {
if(g_sdata.input_script) { if(g_sdata.input_script) {
g_sdata.script_alloced = true; SetScript(g_sdata.input_script);
g_sdata.script = (char *)GlobalAlloc(GPTR, (lstrlen(g_sdata.input_script)+3)*sizeof(char));
wsprintf(g_sdata.script,"\"%s\"",g_sdata.input_script);
} }
} }
void ProcessCommandLine()
{
int argc;
char **argv;
int i, j;
int argSpaceSize;
argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv);
if (argc > 1) {
for (i = 1; i < argc; i++)
{
if (!lstrncmpi(argv[i], "/XSetCompressor ", lstrlen("/XSetCompressor ")))
{
char *p = argv[i] + lstrlen("/XSetCompressor ");
if(!lstrncmpi(p,"/FINAL ", lstrlen("/FINAL ")))
{
p += lstrlen("/FINAL ");
}
while (*p == ' ') p++;
for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++)
{
if (!lstrcmpi(p, compressor_names[j]))
{
SetCompressor((NCOMPRESSOR) j);
}
}
}
else if (!lstrcmpi(argv[i], "/ChooseCompressor"))
{
g_sdata.userSelectCompressor = TRUE;
}
else if (argv[i][0] == '-' || argv[i][0] == '/')
{
AddScriptCmdArgs(argv[i]);
}
else
{
SetScript(argv[i]);
}
}
PushMRUFile(g_sdata.script);
}
if (argSpaceSize)
GlobalFree(argv);
}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
static HINSTANCE hRichEditDLL = 0; static HINSTANCE hRichEditDLL = 0;
if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll"); if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll");
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
{ {
int argc;
char **argv;
int i, j;
int argSpaceSize;
bool chooseCompressor = false;
g_sdata.hwnd=hwndDlg; g_sdata.hwnd=hwndDlg;
HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON));
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
@ -118,56 +181,22 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
RestoreWindowPos(g_sdata.hwnd); RestoreWindowPos(g_sdata.hwnd);
RestoreCompressor(); RestoreCompressor();
g_sdata.compressor = COMPRESSOR_NONE_SELECTED; g_sdata.compressor = COMPRESSOR_NONE_SELECTED;
g_sdata.script_cmd_args = (char *) GlobalAlloc(GPTR, 1);
argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv); g_sdata.userSelectCompressor = FALSE;
if(argc > 1) {
int n; ProcessCommandLine();
g_sdata.script_alloced = true;
g_sdata.script = (char *) GlobalAlloc(GPTR,argSpaceSize+2*(argc-1)*sizeof(char)+1);
lstrcpy(g_sdata.script,"");
for(i=1; i<argc; i++) {
if(!lstrncmpi(argv[i],"/XSetCompressor ",lstrlen("/XSetCompressor "))) {
char *p = argv[i]+lstrlen("/XSetCompressor ");
if(!lstrncmpi(p,"/FINAL ",lstrlen("/FINAL "))) {
p += lstrlen("/FINAL ");
}
while(*p == ' ') p++;
if(p && lstrlen(p)) {
for(j=(int)COMPRESSOR_SCRIPT+1; j < (int)COMPRESSOR_BEST; j++) {
if(!lstrcmpi(p,compressor_names[j])) {
SetCompressor((NCOMPRESSOR)j);
}
}
}
}
else if(!lstrcmpi(argv[i],"/ChooseCompressor")) {
chooseCompressor = true;
}
else {
lstrcat(g_sdata.script,"\"");
lstrcat(g_sdata.script,argv[i]);
lstrcat(g_sdata.script,"\" ");
}
}
n = lstrlen(g_sdata.script);
if(n > 0) {
g_sdata.script[n-1] = '\0';
}
PushMRUFile(argv[argc-1]);
}
if (argSpaceSize)
GlobalFree(argv);
if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) { if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) {
SetCompressor(g_sdata.default_compressor); SetCompressor(g_sdata.default_compressor);
} }
if(chooseCompressor) {
if(g_sdata.userSelectCompressor) {
if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) {
EnableItems(g_sdata.hwnd); EnableItems(g_sdata.hwnd);
return TRUE; return TRUE;
} }
} }
CompileNSISScript(); CompileNSISScript();
return TRUE; return TRUE;
} }
@ -211,9 +240,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
if (num==1) { if (num==1) {
DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH);
if (lstrlen(szTmp)>0) { if (lstrlen(szTmp)>0) {
g_sdata.script_alloced = true; SetScript(szTmp);
g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7);
wsprintf(g_sdata.script,"\"%s\"",szTmp);
PushMRUFile(g_sdata.script); PushMRUFile(g_sdata.script);
ResetObjects(); ResetObjects();
CompileNSISScript(); CompileNSISScript();
@ -500,8 +527,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
lstrcpy(buf,""); lstrcpy(buf,"");
if (GetOpenFileName(&l)) { if (GetOpenFileName(&l)) {
g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3); SetScript(buf);
wsprintf(g_sdata.script,"\"%s\"",buf);
PushMRUFile(g_sdata.script); PushMRUFile(g_sdata.script);
ResetObjects(); ResetObjects();
CompileNSISScript(); CompileNSISScript();

View file

@ -163,14 +163,15 @@ void RestoreMRUList();
void SaveMRUList(); void SaveMRUList();
typedef struct NSISScriptData { typedef struct NSISScriptData {
bool script_alloced;
char *script; char *script;
char *script_cmd_args;
char *output_exe; char *output_exe;
char *input_script; char *input_script;
char *branding; char *branding;
char *brandingv; char *brandingv;
char **symbols; char **symbols;
int retcode; int retcode;
BOOL userSelectCompressor;
DWORD logLength; DWORD logLength;
DWORD warnings; DWORD warnings;
BOOL appended; BOOL appended;

View file

@ -33,9 +33,10 @@ char g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { "", "", "", "", "" };
extern NSCRIPTDATA g_sdata; extern NSCRIPTDATA g_sdata;
extern char *compressor_names[]; extern char *compressor_names[];
int SetArgv(char *cmdLine, int *argc, char ***argv) int SetArgv(const char *cmdLine, int *argc, char ***argv)
{ {
char *p, *arg, *argSpace; const char *p;
char *arg, *argSpace;
int size, argSpaceSize, inquote, copy, slashes; int size, argSpaceSize, inquote, copy, slashes;
size = 2; size = 2;
@ -280,10 +281,9 @@ void CompileNSISScript() {
} }
s = (char *)GlobalAlloc(GPTR, lstrlen(g_sdata.script)+lstrlen(symbols)+lstrlen(compressor)+sizeof(EXENAME)+sizeof(" /NOTIFYHWND ")+23); s = (char *)GlobalAlloc(GPTR, lstrlen(g_sdata.script)+lstrlen(symbols)+lstrlen(compressor)+sizeof(EXENAME)+sizeof(" /NOTIFYHWND ")+23);
wsprintf(s,"%s %s%s /NOTIFYHWND %d -- %s",EXENAME,compressor,symbols,g_sdata.hwnd,g_sdata.script); wsprintf(s,"%s %s%s /NOTIFYHWND %d %s -- \"%s\"",EXENAME,compressor,symbols,g_sdata.hwnd,g_sdata.script_cmd_args,g_sdata.script);
GlobalFree(symbols); GlobalFree(symbols);
if (g_sdata.script_alloced) GlobalFree(g_sdata.script); if (g_sdata.script) GlobalFree(g_sdata.script);
g_sdata.script_alloced = true;
g_sdata.script = s; g_sdata.script = s;
g_sdata.appended = TRUE; g_sdata.appended = TRUE;
} }
@ -701,7 +701,6 @@ BOOL IsValidFile(char *fname)
void PushMRUFile(char* fname) void PushMRUFile(char* fname)
{ {
int i; int i;
char buf[MAX_PATH+1];
DWORD rv; DWORD rv;
char* file_part; char* file_part;
char full_file_name[MAX_PATH+1]; char full_file_name[MAX_PATH+1];
@ -710,16 +709,8 @@ void PushMRUFile(char* fname)
return; return;
} }
if(fname[0] == '"') {
fname++;
}
lstrcpy(buf,fname);
if(buf[lstrlen(buf)-1] == '"') {
buf[lstrlen(buf)-1] = '\0';
}
my_memset(full_file_name,0,sizeof(full_file_name)); my_memset(full_file_name,0,sizeof(full_file_name));
rv = GetFullPathName(buf,sizeof(full_file_name),full_file_name,&file_part); rv = GetFullPathName(fname,sizeof(full_file_name),full_file_name,&file_part);
if (rv == 0) { if (rv == 0) {
return; return;
} }

View file

@ -28,7 +28,7 @@
#define MRU_LIST_SIZE 5 #define MRU_LIST_SIZE 5
#define MRU_DISPLAY_LENGTH 40 #define MRU_DISPLAY_LENGTH 40
int SetArgv(char *cmdLine, int *argc, char ***argv); int SetArgv(const char *cmdLine, int *argc, char ***argv);
void SetTitle(HWND hwnd,char *substr); void SetTitle(HWND hwnd,char *substr);
void SetBranding(HWND hwnd); void SetBranding(HWND hwnd);
void CopyToClipboard(HWND hwnd); void CopyToClipboard(HWND hwnd);