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:
parent
39e22a96dd
commit
d545d00bda
4 changed files with 92 additions and 74 deletions
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue