[PATCH 1 of 3] killdaemons: fix error handling on Windows

Matt Harbison mharbison72 at gmail.com
Mon May 15 21:03:13 EDT 2017


On Mon, 15 May 2017 10:21:13 -0400, Yuya Nishihara <yuya at tcha.org> wrote:

> On Mon, 15 May 2017 00:08:30 -0400, Matt Harbison wrote:
>> # HG changeset patch
>> # User Matt Harbison <matt_harbison at yahoo.com>
>> # Date 1494779534 14400
>> #      Sun May 14 12:32:14 2017 -0400
>> # Node ID 024271e90987e5794dab6eb00844467065fae7e4
>> # Parent  db0b470547d5e21f042390a204f09ae7d7303757
>> killdaemons: fix error handling on Windows
>>
>> After taking Adrian's suggestion[1] to use util.posixfile to avoid  
>> os.unlink()
>> errors, the error changed from:
>>
>>   Errored test-hgweb-json.t: Traceback (most recent call last):
>>     File "./run-tests.py", line 724, in run
>>       self.tearDown()
>>     File "./run-tests.py", line 805, in tearDown
>>       killdaemons(entry)
>>     File "./run-tests.py", line 540, in killdaemons
>>       logfn=vlog)
>>     File "...\tests\killdaemons.py", line 94, in killdaemons
>>       os.unlink(pidfile)
>>   WindowsError: [Error 32] The process cannot access the file because  
>> it is
>>      being used by another process:  
>> '...\\hgtests.zmpqj3\\child80\\daemon.pids'
>>
>> to:
>>
>>   Errored test-largefiles.t: Traceback (most recent call last):
>>     File "./run-tests.py", line 724, in run
>>       self.tearDown()
>>     File "./run-tests.py", line 805, in tearDown
>>       killdaemons(entry)
>>     File "./run-tests.py", line 540, in killdaemons
>>       logfn=vlog)
>>     File "...\tests\killdaemons.py", line 91, in killdaemons
>>       kill(pid, logfn, tryhard)
>>     File "...\tests\killdaemons.py", line 55, in kill
>>       _check(ctypes.windll.kernel32.CloseHandle(handle))
>>     File "...\tests\killdaemons.py", line 18, in _check
>>       raise ctypes.WinError(winerrno)
>>   WindowsError: [Error 6] The handle is invalid.
>>
>> The handle in question is for the process, not the file.  That made me  
>> wonder
>> why WaitForSingleObject() didn't raise an error, and it's because it  
>> isn't a
>> BOOL return.
>
> I think it's better to define _check() function per return-value type.  
> Win32
> API doesn't state that the TRUE value is 1, even though it's practically  
> 1.
>
>> (For this method, a return of 0 is WAIT_OBJECT_0, and an error is
>> signalled by returning (DWORD) 0xFFFFFFFF.)  When I printed out that  
>> value (as
>> returned by the function) with '0x%x', it printed '0x-1'.
>
> That's probably because we don't teach ctypes the function signature. A  
> return
> value is taken as int by default.
>
>> -        if handle == 0:
>> +        if handle is None:
>>              _check(0, 87) # err 87 when process not found
>
> This could be _checkptr(handle, 87) for example.

Since there are 3 different return types in play that would need  
specialized check functions (and one of those is special cased to  
WaitForSingleObject()), isn't that a bit over-engineered?  I thought about  
just using _check(0) to handle WFSO() right as I was about to patchbomb  
it, and that would allow the previous 'ret == 0' test.


More information about the Mercurial-devel mailing list