advapi32: Always pass valid buffers in the EnumServicesStatus requests.

oldstable
Alexandre Julliard 2011-06-09 22:00:15 +02:00
parent 519fbf6202
commit ad4c995c3f
1 changed files with 22 additions and 4 deletions

View File

@ -1486,13 +1486,14 @@ EnumServicesStatusA( SC_HANDLE hmngr, DWORD type, DWORD state, LPENUM_SERVICE_ST
TRACE("%p 0x%x 0x%x %p %u %p %p %p\n", hmngr, type, state, services, size, needed,
returned, resume_handle);
if (size && !(servicesW = HeapAlloc( GetProcessHeap(), 0, 2 * size )))
sz = max( 2 * size, sizeof(*servicesW) );
if (!(servicesW = HeapAlloc( GetProcessHeap(), 0, sz )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
ret = EnumServicesStatusW( hmngr, type, state, servicesW, 2 * size, needed, returned, resume_handle );
ret = EnumServicesStatusW( hmngr, type, state, servicesW, sz, needed, returned, resume_handle );
if (!ret) goto done;
p = (char *)services + *returned * sizeof(ENUM_SERVICE_STATUSA);
@ -1532,6 +1533,7 @@ EnumServicesStatusW( SC_HANDLE hmngr, DWORD type, DWORD state, LPENUM_SERVICE_ST
LPDWORD resume_handle )
{
DWORD err, i;
ENUM_SERVICE_STATUSW dummy_status;
TRACE("%p 0x%x 0x%x %p %u %p %p %p\n", hmngr, type, state, services, size, needed,
returned, resume_handle);
@ -1545,6 +1547,13 @@ EnumServicesStatusW( SC_HANDLE hmngr, DWORD type, DWORD state, LPENUM_SERVICE_ST
return FALSE;
}
/* make sure we pass a valid pointer */
if (!services || size < sizeof(*services))
{
services = &dummy_status;
size = sizeof(dummy_status);
}
__TRY
{
err = svcctl_EnumServicesStatusW( hmngr, type, state, (BYTE *)services, size, needed, returned );
@ -1591,7 +1600,8 @@ EnumServicesStatusExA( SC_HANDLE hmngr, SC_ENUM_TYPE level, DWORD type, DWORD st
TRACE("%p %u 0x%x 0x%x %p %u %p %p %p %s\n", hmngr, level, type, state, buffer,
size, needed, returned, resume_handle, debugstr_a(group));
if (size && !(servicesW = HeapAlloc( GetProcessHeap(), 0, 2 * size )))
sz = max( 2 * size, sizeof(*servicesW) );
if (!(servicesW = HeapAlloc( GetProcessHeap(), 0, sz )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
@ -1608,7 +1618,7 @@ EnumServicesStatusExA( SC_HANDLE hmngr, SC_ENUM_TYPE level, DWORD type, DWORD st
MultiByteToWideChar( CP_ACP, 0, group, -1, groupW, len * sizeof(WCHAR) );
}
ret = EnumServicesStatusExW( hmngr, level, type, state, (BYTE *)servicesW, 2 * size,
ret = EnumServicesStatusExW( hmngr, level, type, state, (BYTE *)servicesW, sz,
needed, returned, resume_handle, groupW );
if (!ret) goto done;
@ -1650,6 +1660,7 @@ EnumServicesStatusExW( SC_HANDLE hmngr, SC_ENUM_TYPE level, DWORD type, DWORD st
LPDWORD resume_handle, LPCWSTR group )
{
DWORD err, i;
ENUM_SERVICE_STATUS_PROCESSW dummy_status;
ENUM_SERVICE_STATUS_PROCESSW *services = (ENUM_SERVICE_STATUS_PROCESSW *)buffer;
TRACE("%p %u 0x%x 0x%x %p %u %p %p %p %s\n", hmngr, level, type, state, buffer,
@ -1669,6 +1680,13 @@ EnumServicesStatusExW( SC_HANDLE hmngr, SC_ENUM_TYPE level, DWORD type, DWORD st
return FALSE;
}
/* make sure we pass a valid buffer pointer */
if (!services || size < sizeof(*services))
{
buffer = (BYTE *)&dummy_status;
size = sizeof(dummy_status);
}
__TRY
{
err = svcctl_EnumServicesStatusExW( hmngr, type, state, buffer, size, needed,