[Bug 13958] New: Services: handle null display names properly when populating SCM db entries
wine-bugs at winehq.org
wine-bugs at winehq.org
Mon Jun 16 14:43:11 CDT 2008
http://bugs.winehq.org/show_bug.cgi?id=13958
Summary: Services: handle null display names properly when
populating SCM db entries
Product: Wine
Version: 1.0-rc5
Platform: PC
OS/Version: Linux
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: programs
AssignedTo: wine-bugs at winehq.org
ReportedBy: focht at gmx.net
Hello,
there is a bug in services code when one or more services have no display name
set (null).
If CreateServiceW() is called, it checks for existing services using
scmdatabase_find_service_by_displayname().
Unfortunately this internal helper doesn't handle the "null" service name
properly while iterating, resulting in exception and messy side effects
(although mapped to rpc exception it isn't propagated properly).
Following is service db dump with such cases:
--- snip ---
000d:trace:service:scmdatabase_load_services Loading service L"BITS"
000d:trace:service:load_service_config Image path = L"svchost.exe -k
netsvcs"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"BITS"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"MountMgr"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\drivers\\mountmgr.sys"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"Mount Manager"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"MSIServer"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\msiexec.exe /V"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"MSIServer"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"PnkBstrA"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\PnkBstrA.exe"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"PnkBstrA"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"PnkBstrB"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\PnkBstrB.exe"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"PnkBstrB"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"PnkBstrK"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\drivers\\PnkBstrK.sys"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"PnkBstrK"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"PROCMON13"
000d:trace:service:load_service_config Image path =
L"\\??\\C:\\windows\\system32\\Drivers\\PROCMON13.SYS"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = (null)
000d:trace:service:load_service_config Display name = (null)
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"SecDrv"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\drivers\\\\SECDRV.SYS"
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"SecDrv"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"Spooler"
000d:trace:service:load_service_config Image path =
L"C:\\windows\\system32\\spoolsv.exe"
000d:trace:service:load_service_config Group = L"SpoolerGroup"
000d:trace:service:load_service_config Service account name = L"LocalSystem"
000d:trace:service:load_service_config Display name = L"Print Spooler"
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
000d:trace:service:scmdatabase_load_services Loading service L"VxD"
000d:trace:service:load_service_config Image path = (null)
000d:trace:service:load_service_config Group = (null)
000d:trace:service:load_service_config Service account name = (null)
000d:trace:service:load_service_config Display name = (null)
000d:trace:service:load_service_config Service dependencies : (none)
000d:trace:service:load_service_config Group dependencies : (none)
--- snip ---
Quick fix:
--- snip ---
diff --git a/programs/services/services.c b/programs/services/services.c
index 806fbb6..d48c985 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -341,7 +341,7 @@ struct service_entry
*scmdatabase_find_service_by_displayname(struct scmdatabase
LIST_FOR_EACH_ENTRY(service, &db->services, struct service_entry, entry)
{
- if (strcmpiW(name, service->config.lpDisplayName) == 0)
+ if (service->config.lpDisplayName && strcmpiW(name,
service->config.lpDisplayName) == 0)
return service;
}
--- snip ---
Hopefully it's not too late for 1.0 ;-|
Regards
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list