Talk:ExecDos plug-in: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
No edit summary
(Bug)
 
(8 intermediate revisions by 5 users not shown)
Line 1: Line 1:
===Use after free===
https://sourceforge.net/p/nsis/bugs/1266/
GlobalFree(ptp);
===Possible stack corruption===
===Possible stack corruption===


Line 38: Line 43:
ExecDos::exec /DETAILED /TIMEOUT=20000 '"$0" -S $1 -d $2 -Q "select count(*) from dbo.DatabaseScript where ScriptFilename = $\'$3$\'" -o "$PLUGINSDIR\DatabaseScriptExecuted.out"' '' ''
ExecDos::exec /DETAILED /TIMEOUT=20000 '"$0" -S $1 -d $2 -Q "select count(*) from dbo.DatabaseScript where ScriptFilename = $\'$3$\'" -o "$PLUGINSDIR\DatabaseScriptExecuted.out"' '' ''
Pop $4 ; Pop the result off the stack first, before popping rest of saved global variabled
Pop $4 ; Pop the result off the stack first, before popping rest of saved global variables
Pop $5
Pop $5
Pop $4
Pop $4
Line 50: Line 55:


Note that if I move the block of script that pops my saved global variables and the message box to BEFORE the call to ExecDos::exec, the global variables are the same as when the function was entered.
Note that if I move the block of script that pops my saved global variables and the message box to BEFORE the call to ExecDos::exec, the global variables are the same as when the function was entered.
It's also interesting to note that nsExec::exec also appears to have this problem.


visualcsharpcoder "at" hotmail dawt com if you want to email me about this problem.
visualcsharpcoder "at" hotmail dawt com if you want to email me about this problem.
====Stack issues: confirmed====
Corruption is a strong word: it looks like ExecDos::exec /DETAILED just pushes an extra empty value on the stack:
<pre>
Name "Test"
OutFile "Test.exe"
Section "Foo"
  Dumpstate::debug
  ; Stack: empty
  ExecDos::exec "c:\windows\system32\ping.exe 127.0.0.1" "" ""
  Dumpstate::debug
  ; Stack: "0"
  ExecDos::exec /DETAILED "c:\windows\system32\ping.exe 127.0.0.1" "" ""
  Dumpstate::debug
  ; Stack: "0", "", "0"
  ; Expected: "0", "0"
SectionEnd
</pre>
'''Workaround''': When using /DETAILED, Pop to check the exit code, then Pop again to clear out the extra value.  I have not checked the behavior of /DETAILED /ASYNC.
I do not see this same behavior using any of the nsExec functions.
[[User:66.150.169.146|66.150.169.146]] 21:30, 6 November 2008 (UTC)
Takhir:
This is feature, not bug. Last parameter is optional, for 'to window' it defines target window handle and not required if window specified by /DETAILED option. Another words - use
ExecDos::exec /DETAILED "c:\windows\system32\ping.exe 127.0.0.1" ""
----


===Timeouts===
===Timeouts===
Line 65: Line 104:
And how this Default big is?
And how this Default big is?


Takhir:
WINBASE.H(758):#define INFINITE            0xFFFFFFFF  // Infinite timeout


An example showing how to redirect the output to the main log window would be great!
An example showing how to redirect the output to the main log window would be great!
Takhir:
If we are talking about Detailed window, just use /DETAILED option. Otherwise you should supply window handle.
BTW would be better to send requests to NSIS forum. I found these messages today (Febr. 23, 2009) only.
=Newbie trying to install ExecDos.dll=
*Hi, i been searching for details on this. I read somewhere that i just put the ExecDos.dll into the plugin of NSIS which i did, but to no avail. Compiling my nsi keep returning ''Invalid command ExecDos::exec''. Will appreciate some pointers. Rgds. - Red1
:False alarm! I put it in the wrong plugin folder. :D - Red1

Latest revision as of 23:25, 28 July 2021

Use after free

https://sourceforge.net/p/nsis/bugs/1266/

GlobalFree(ptp);

Possible stack corruption

I believe there is a problem with ExecDos corrupting the stack, or corrupting global variables:

Function DatabaseScriptExecuted
	; Stack: <Script.sql> <MyDB> <localhost> <C:\CMDSQL.EXE>
	
	MessageBox MB_OK "$0   $1   $2   $3   $4   $5"
	; Displays: "1422944   0001_TableExists.sql   True   0   1"
	
	Exch $3 ; Database script filename
	; Stack: <Old_$3> <MyDB> <localhost> <C:\CMDSQL.EXE>
	
	Exch
	; Stack: <MyDB> <Old_$3> <localhost> <C:\CMDSQL.EXE>

	Exch $2 ; Database name
	; Stack: <Old_$2> <Old_$3> <localhost> <C:\CMDSQL.EXE>

	Exch 2
	; Stack: <localhost> <Old_$3> <Old_$2> <C:\CMDSQL.EXE>

	Exch $1 ; Database host
	; Stack: <Old_$1> <Old_$3> <Old_$2> <C:\CMDSQL.EXE>

	Exch 3
	; Stack: <C:\CMDSQL.EXE> <Old_$3> <Old_$2> <Old_$1>

	Exch $0 ; SQLCMD.EXE path
	; Stack: <Old_$0> <Old_$3> <Old_$2> <Old_$1>

	Push $4
	; Stack: <Old_$4> <Old_$0> <Old_$3> <Old_$2> <Old_$1>

	Push $5
	; Stack: <Old_$5> <Old_$4> <Old_$0> <Old_$3> <Old_$2> <Old_$1>
	
	ExecDos::exec /DETAILED /TIMEOUT=20000 '"$0" -S $1 -d $2 -Q "select count(*) from dbo.DatabaseScript where ScriptFilename = $\'$3$\'" -o "$PLUGINSDIR\DatabaseScriptExecuted.out"' '' ''
	Pop $4 ; Pop the result off the stack first, before popping rest of saved global variables
	Pop $5
	Pop $4
	Pop $0
	Pop $3
	Pop $2
	Pop $1
	MessageBox MB_OK "$0   $1   $2   $3   $4   $5"
	; Displays: "0   True   0   1422944   1"

Note that if I move the block of script that pops my saved global variables and the message box to BEFORE the call to ExecDos::exec, the global variables are the same as when the function was entered.

It's also interesting to note that nsExec::exec also appears to have this problem.

visualcsharpcoder "at" hotmail dawt com if you want to email me about this problem.

Stack issues: confirmed

Corruption is a strong word: it looks like ExecDos::exec /DETAILED just pushes an extra empty value on the stack:

Name "Test"
OutFile "Test.exe"

Section "Foo"
  Dumpstate::debug
  ; Stack: empty
  ExecDos::exec "c:\windows\system32\ping.exe 127.0.0.1" "" ""
  Dumpstate::debug
  ; Stack: "0"
  ExecDos::exec /DETAILED "c:\windows\system32\ping.exe 127.0.0.1" "" ""
  Dumpstate::debug
  ; Stack: "0", "", "0"
  ; Expected: "0", "0"
SectionEnd

Workaround: When using /DETAILED, Pop to check the exit code, then Pop again to clear out the extra value. I have not checked the behavior of /DETAILED /ASYNC.

I do not see this same behavior using any of the nsExec functions.

66.150.169.146 21:30, 6 November 2008 (UTC)

Takhir: This is feature, not bug. Last parameter is optional, for 'to window' it defines target window handle and not required if window specified by /DETAILED option. Another words - use ExecDos::exec /DETAILED "c:\windows\system32\ping.exe 127.0.0.1" ""


Timeouts

TIMEOUT TOTAL execution time, milliseconds, for example /TIMEOUT=10000. Default is big enough. Short timeouts may cause app to

be terminated.




And how this Default big is?

Takhir: WINBASE.H(758):#define INFINITE 0xFFFFFFFF // Infinite timeout

An example showing how to redirect the output to the main log window would be great!

Takhir: If we are talking about Detailed window, just use /DETAILED option. Otherwise you should supply window handle. BTW would be better to send requests to NSIS forum. I found these messages today (Febr. 23, 2009) only.

Newbie trying to install ExecDos.dll

  • Hi, i been searching for details on this. I read somewhere that i just put the ExecDos.dll into the plugin of NSIS which i did, but to no avail. Compiling my nsi keep returning Invalid command ExecDos::exec. Will appreciate some pointers. Rgds. - Red1
False alarm! I put it in the wrong plugin folder. :D - Red1