[pso] [tema1]Problema GetUserOf

Octavian Voicu octavian.voicu at gmail.com
Thu Mar 25 13:32:56 EET 2010


2010/3/21 Alexandra Arcalianu <arcalianualexandra at gmail.com>:
> Am urmatoarea problema pe Windows la ultimul apel do_stop din functia
> test_syscall.
> Avem secventa:
>     do_as_guest("test start %s -1 %d", syscall, STATUS_SUCCESS);
>     do_stop(syscall, last_child, STATUS_INVALID_PARAMETER);
> Adica procesul curent porneste un copil ce face start la monitorizare pentru
> apelul syscall. Parintele asteapta acest copil, cu WaitForSingleObject
> (pi.hProcess, INFINITE), dupa care apeleaza do_stop pentru pid-ul copilului
> care __acum__ nu mai este un pid valid.
> La mine functia GetUserOf() imi returneaza tot STATUS_SUCCESS pentru
> acest pid invalid si nu inteleg de ce.
> Problema e valabila pentru orice syscall valid.

Problema ar fi din codul testerului:

CreateProcessAsUser(token, NULL, dummy, NULL, NULL,
                                        FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);

Conform documentatiei, CreateProcessAsUser [1] returneaza in structura
LPPROCESS_INFORMATION, printre altele, doua handle-uri: unul la
procesul creat si altul la thread-ul creat:

# lpProcessInformation [out]
#   A pointer to a PROCESS_INFORMATION structure that receives
identification information about the new process.
#   Handles in PROCESS_INFORMATION must be closed with CloseHandle
when they are no longer needed.

Pana nu inchidem toate handle-urile, sistemul nu va elibera resursa
respectiva. Cum noi mai avem un handle deschis la procesul respectiv
(pi.hProcess, deschis implicit de CreateProcessAsUser), functia
GetUserOf (mai exact ZwOpenProcess din cadrul ei) il va putea deschide
si nu va aparea nicio eroare.

In concluzie, "eroarea" s-ar putea considera ca este in codul de
testare; pe de alta parte, ar fi gresit sa va bazati pe acest lucru
(ca GetUserOf returneaza eroare pentru un pid care s-a terminat), deci
puteti privi lipsa cleanup-urilor din cod ca un mod de a impune un
comportament corect.

Ca sa verifici daca asta era cauza comportamentului aparent incorect,
adauga dupa WaitForSingleObject clean-up corespunzator:
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);

Octavian

[1] http://msdn.microsoft.com/en-us/library/ms682429(VS.85).aspx


More information about the pso mailing list