diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c b/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c index 120fd6c01e9..3b60e1ad95d 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c @@ -507,25 +507,24 @@ void set_name_servers( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { char *nsbuf; int i, addrs = new_lease->options[DHO_DOMAIN_NAME_SERVERS].len / sizeof(ULONG); - int len = 0; - nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) + 1 ); + nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) ); if( nsbuf) { - memset(nsbuf, 0, addrs * sizeof(IP_ADDRESS_STRING) + 1); + nsbuf[0] = 0; for( i = 0; i < addrs; i++ ) { nameserver.len = sizeof(ULONG); memcpy( nameserver.iabuf, new_lease->options[DHO_DOMAIN_NAME_SERVERS].data + (i * sizeof(ULONG)), sizeof(ULONG) ); strcat( nsbuf, piaddr(nameserver) ); - len += strlen(nsbuf) + 1; + if( i != addrs-1 ) strcat( nsbuf, "," ); } DH_DbgPrint(MID_TRACE,("Setting DhcpNameserver: %s\n", nsbuf)); - RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_MULTI_SZ, - (LPBYTE)nsbuf, len + 1 ); + RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_SZ, + (LPBYTE)nsbuf, strlen(nsbuf) + 1 ); free( nsbuf ); } diff --git a/reactos/dll/win32/iphlpapi/resinfo_reactos.c b/reactos/dll/win32/iphlpapi/resinfo_reactos.c index 154170d0836..02bcb3b9129 100644 --- a/reactos/dll/win32/iphlpapi/resinfo_reactos.c +++ b/reactos/dll/win32/iphlpapi/resinfo_reactos.c @@ -122,24 +122,47 @@ static void EnumInterfaces( PVOID Data, EnumInterfacesFunc cb ) { void EnumNameServers( HANDLE RegHandle, PWCHAR Interface, PVOID Data, EnumNameServersFunc cb ) { - PWCHAR *NameServerString = - QueryRegistryValueStringMulti(RegHandle, L"DhcpNameServer"); - DWORD i; + PWCHAR NameServerString = + QueryRegistryValueString(RegHandle, L"DhcpNameServer"); if (!NameServerString) - NameServerString = QueryRegistryValueStringMulti(RegHandle, L"NameServer"); - - if (!NameServerString) return; - - for (i = 0; NameServerString[i]; i++) - { - cb(Interface, NameServerString[i], Data); - - HeapFree(GetProcessHeap(), 0, NameServerString[i]); + NameServerString = QueryRegistryValueString(RegHandle, L"NameServer"); + + if (NameServerString) { + /* Now, count the non-empty comma separated */ + DWORD ch; + DWORD LastNameStart = 0; + for (ch = 0; NameServerString[ch]; ch++) { + if (NameServerString[ch] == ',') { + if (ch - LastNameStart > 0) { /* Skip empty entries */ + PWCHAR NameServer = + malloc(((ch - LastNameStart) + 1) * sizeof(WCHAR)); + if (NameServer) { + memcpy(NameServer,NameServerString + LastNameStart, + (ch - LastNameStart) * sizeof(WCHAR)); + NameServer[ch - LastNameStart] = 0; + cb( Interface, NameServer, Data ); + free(NameServer); + LastNameStart = ch +1; + } + } + LastNameStart = ch + 1; /* The first one after the comma */ + } + } + if (ch - LastNameStart > 0) { /* A last name? */ + PWCHAR NameServer = malloc(((ch - LastNameStart) + 1) * sizeof(WCHAR)); + if (NameServer) { + memcpy(NameServer,NameServerString + LastNameStart, + (ch - LastNameStart) * sizeof(WCHAR)); + NameServer[ch - LastNameStart] = 0; + cb( Interface, NameServer, Data ); + free(NameServer); + } + } + ConsumeRegValueString(NameServerString); } - - HeapFree(GetProcessHeap(), 0, NameServerString); } + static void CreateNameServerListEnumNamesFuncCount( PWCHAR Interface, PWCHAR Server, PVOID _Data ) {