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_find,0,sizeof(NFINDREPLACE));
|
||||
g_sdata.hInstance=GetModuleHandle(0);
|
||||
g_sdata.script_alloced=false;
|
||||
g_sdata.symbols = NULL;
|
||||
g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, "makensis win32 signint event");
|
||||
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);
|
||||
FinalizeUpdate();
|
||||
ExitProcess(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()
|
||||
{
|
||||
if(g_sdata.input_script) {
|
||||
g_sdata.script_alloced = true;
|
||||
g_sdata.script = (char *)GlobalAlloc(GPTR, (lstrlen(g_sdata.input_script)+3)*sizeof(char));
|
||||
wsprintf(g_sdata.script,"\"%s\"",g_sdata.input_script);
|
||||
SetScript(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) {
|
||||
static HINSTANCE hRichEditDLL = 0;
|
||||
if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll");
|
||||
switch (msg) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
int argc;
|
||||
char **argv;
|
||||
int i, j;
|
||||
int argSpaceSize;
|
||||
bool chooseCompressor = false;
|
||||
|
||||
g_sdata.hwnd=hwndDlg;
|
||||
HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON));
|
||||
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);
|
||||
RestoreCompressor();
|
||||
g_sdata.compressor = COMPRESSOR_NONE_SELECTED;
|
||||
|
||||
argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv);
|
||||
if(argc > 1) {
|
||||
int n;
|
||||
|
||||
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);
|
||||
g_sdata.script_cmd_args = (char *) GlobalAlloc(GPTR, 1);
|
||||
g_sdata.userSelectCompressor = FALSE;
|
||||
|
||||
ProcessCommandLine();
|
||||
|
||||
if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) {
|
||||
SetCompressor(g_sdata.default_compressor);
|
||||
}
|
||||
if(chooseCompressor) {
|
||||
|
||||
if(g_sdata.userSelectCompressor) {
|
||||
if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) {
|
||||
EnableItems(g_sdata.hwnd);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
CompileNSISScript();
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -211,9 +240,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
|
|||
if (num==1) {
|
||||
DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH);
|
||||
if (lstrlen(szTmp)>0) {
|
||||
g_sdata.script_alloced = true;
|
||||
g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7);
|
||||
wsprintf(g_sdata.script,"\"%s\"",szTmp);
|
||||
SetScript(szTmp);
|
||||
PushMRUFile(g_sdata.script);
|
||||
ResetObjects();
|
||||
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;
|
||||
lstrcpy(buf,"");
|
||||
if (GetOpenFileName(&l)) {
|
||||
g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3);
|
||||
wsprintf(g_sdata.script,"\"%s\"",buf);
|
||||
SetScript(buf);
|
||||
PushMRUFile(g_sdata.script);
|
||||
ResetObjects();
|
||||
CompileNSISScript();
|
||||
|
|
|
@ -163,14 +163,15 @@ void RestoreMRUList();
|
|||
void SaveMRUList();
|
||||
|
||||
typedef struct NSISScriptData {
|
||||
bool script_alloced;
|
||||
char *script;
|
||||
char *script_cmd_args;
|
||||
char *output_exe;
|
||||
char *input_script;
|
||||
char *branding;
|
||||
char *brandingv;
|
||||
char **symbols;
|
||||
int retcode;
|
||||
BOOL userSelectCompressor;
|
||||
DWORD logLength;
|
||||
DWORD warnings;
|
||||
BOOL appended;
|
||||
|
|
|
@ -33,9 +33,10 @@ char g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { "", "", "", "", "" };
|
|||
extern NSCRIPTDATA g_sdata;
|
||||
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;
|
||||
|
||||
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);
|
||||
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);
|
||||
if (g_sdata.script_alloced) GlobalFree(g_sdata.script);
|
||||
g_sdata.script_alloced = true;
|
||||
if (g_sdata.script) GlobalFree(g_sdata.script);
|
||||
g_sdata.script = s;
|
||||
g_sdata.appended = TRUE;
|
||||
}
|
||||
|
@ -701,7 +701,6 @@ BOOL IsValidFile(char *fname)
|
|||
void PushMRUFile(char* fname)
|
||||
{
|
||||
int i;
|
||||
char buf[MAX_PATH+1];
|
||||
DWORD rv;
|
||||
char* file_part;
|
||||
char full_file_name[MAX_PATH+1];
|
||||
|
@ -710,16 +709,8 @@ void PushMRUFile(char* fname)
|
|||
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));
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#define MRU_LIST_SIZE 5
|
||||
#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 SetBranding(HWND hwnd);
|
||||
void CopyToClipboard(HWND hwnd);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue