r12051@catbus: nickm | 2007-03-03 16:15:52 -0500

nt_service_is_stopping should not load the NT service library calls: if they are not loaded, we cannot possibly be a service trying to shut own.  Bug found by "norvid" on or-talk.  Also, rename function to something slightly less error-prone.


svn:r9720
This commit is contained in:
Nick Mathewson 2007-03-03 21:16:07 +00:00
parent bd9289cf2b
commit 25508347ec
3 changed files with 17 additions and 6 deletions

View File

@ -1,3 +1,9 @@
Changes in version 0.1.2.10-rc - 2007-03-??
o Major bugfixes (Windows)
- Do not load the NT services library functions (which may not exist)
just to detect if we're a service trying to shut down.
Changes in version 0.1.2.9-rc - 2007-03-02 Changes in version 0.1.2.9-rc - 2007-03-02
o Major bugfixes (Windows): o Major bugfixes (Windows):
- On MinGW, use "%I64u" to printf/scanf 64-bit integers, instead - On MinGW, use "%I64u" to printf/scanf 64-bit integers, instead

View File

@ -128,6 +128,7 @@ Things we'd like to do in 0.2.0.x:
minutes" in the thrashy case, and more often than "once a week" in the minutes" in the thrashy case, and more often than "once a week" in the
extra-stable case. extra-stable case.
- Implement TLS shutdown properly when possible. - Implement TLS shutdown properly when possible.
- Maybe move NT services into their own module.
- Features: - Features:
- Implement a DNS proxy - Implement a DNS proxy
- Bridges. - Bridges.

View File

@ -98,10 +98,10 @@ SERVICE_STATUS_HANDLE hStatus;
* is a job for arguments, not globals. */ * is a job for arguments, not globals. */
static char **backup_argv; static char **backup_argv;
static int backup_argc; static int backup_argc;
static int nt_service_is_stopped(void); static int nt_service_is_stopping(void);
static char* nt_strerror(uint32_t errnum); static char* nt_strerror(uint32_t errnum);
#else #else
#define nt_service_is_stopped() (0) #define nt_service_is_stopping() (0)
#endif #endif
/** If our router descriptor ever goes this long without being regenerated /** If our router descriptor ever goes this long without being regenerated
@ -1252,7 +1252,7 @@ do_main_loop(void)
second_elapsed_callback(0,0,NULL); second_elapsed_callback(0,0,NULL);
for (;;) { for (;;) {
if (nt_service_is_stopped()) if (nt_service_is_stopping())
return 0; return 0;
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
@ -1884,14 +1884,18 @@ nt_service_loadlibrary(void)
exit(1); exit(1);
} }
/** If we're compiled to run as an NT service, and the service has been /** If we're compiled to run as an NT service, and the service wants to
* shut down, then change our current status and return 1. Else * shut down, then change our current status and return 1. Else
* return 0. * return 0.
*/ */
static int static int
nt_service_is_stopped(void) nt_service_is_stopping(void)
/* XXXX this function would probably _love_ to be inline, in 0.2.0. */
{ {
nt_service_loadlibrary(); /* If we haven't loaded the function pointers, we can't possibly be an NT
* service trying to shut down. */
if (!service_fns.loaded)
return 0;
if (service_status.dwCurrentState == SERVICE_STOP_PENDING) { if (service_status.dwCurrentState == SERVICE_STOP_PENDING) {
service_status.dwWin32ExitCode = 0; service_status.dwWin32ExitCode = 0;