To be more accurate, it appears it broke DNS resolution. Could you please stop committing untested patches? This would help trunk going better. TYA
> It looks like this change has caused some regressions in sysreg > > http://www.reactos.org/testman/compare.php?ids=3934,3935 > > [email protected] wrote: > > Author: cgutman > > Date: Sun Aug 22 22:22:27 2010 > > New Revision: 48593 > > > > URL: http://svn.reactos.org/svn/reactos?rev=48593&view=rev > > Log: > > [DHCPCSVC] > > - Write the DNS servers in a REG_MULTI_SZ value > > [IPHLPAPI] > > - Rewrite the registry reading code > > - Use HeapFree to free memory from the allocated from heap > > > > Modified: > > trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c > > trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h > > trunk/reactos/dll/win32/iphlpapi/registry.c > > trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c > > > > Modified: trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c > > URL: > > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c?rev=48593&r1=48592&r2=48593&view=diff > > ============================================================================== > > --- trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c [iso-8859-1] (original) > > +++ trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c [iso-8859-1] Sun Aug > > 22 22:22:27 2010 > > @@ -507,24 +507,25 @@ > > char *nsbuf; > > int i, addrs = > > new_lease->options[DHO_DOMAIN_NAME_SERVERS].len / > > sizeof(ULONG); > > - > > - nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) ); > > + int len = 0; > > + > > + nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) + 1 ); > > > > if( nsbuf) { > > - nsbuf[0] = 0; > > + memset(nsbuf, 0, addrs * sizeof(IP_ADDRESS_STRING) + 1); > > 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) ); > > - if( i != addrs-1 ) strcat( nsbuf, "," ); > > + len += strlen(nsbuf) + 1; > > } > > > > DH_DbgPrint(MID_TRACE,("Setting DhcpNameserver: %s\n", nsbuf)); > > > > - RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_SZ, > > - (LPBYTE)nsbuf, strlen(nsbuf) + 1 ); > > + RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_MULTI_SZ, > > + (LPBYTE)nsbuf, len + 1 ); > > free( nsbuf ); > > } > > > > > > Modified: trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h > > URL: > > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h?rev=48593&r1=48592&r2=48593&view=diff > > ============================================================================== > > --- trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h [iso-8859-1] > > (original) > > +++ trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h [iso-8859-1] Sun > > Aug 22 22:22:27 2010 > > @@ -139,6 +139,7 @@ > > PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ); > > void ConsumeChildKeyName( PWCHAR Name ); > > PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ); > > +PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName > > ); > > void ConsumeRegValueString( PWCHAR NameServer ); > > BOOL isInterface( TDIEntityID *if_maybe ); > > BOOL hasArp( HANDLE tcpFile, TDIEntityID *arp_maybe ); > > > > Modified: trunk/reactos/dll/win32/iphlpapi/registry.c > > URL: > > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/registry.c?rev=48593&r1=48592&r2=48593&view=diff > > ============================================================================== > > --- trunk/reactos/dll/win32/iphlpapi/registry.c [iso-8859-1] (original) > > +++ trunk/reactos/dll/win32/iphlpapi/registry.c [iso-8859-1] Sun Aug 22 > > 22:22:27 2010 > > @@ -66,25 +66,123 @@ > > if (Name) HeapFree( GetProcessHeap(), 0, Name ); > > } > > > > -PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ) { > > - PWCHAR Name; > > - DWORD ReturnedSize = 0; > > +PVOID QueryRegistryValue(HANDLE RegHandle, PWCHAR ValueName, LPDWORD > > RegistryType, LPDWORD Length) > > +{ > > + PVOID ReadValue = NULL; > > + DWORD Error; > > > > - if (RegQueryValueExW( RegHandle, ValueName, NULL, NULL, NULL, > > - &ReturnedSize ) != 0) { > > - return 0; > > - } else { > > - Name = malloc( ReturnedSize); > > - RegQueryValueExW( RegHandle, ValueName, NULL, NULL, (PVOID)Name, > > - &ReturnedSize ); > > - return Name; > > - } > > + *Length = 0; > > + *RegistryType = REG_NONE; > > + > > + while (TRUE) > > + { > > + Error = RegQueryValueExW(RegHandle, ValueName, NULL, RegistryType, > > ReadValue, Length); > > + if (Error == ERROR_SUCCESS) > > + { > > + if (ReadValue) break; > > + } > > + else if (Error == ERROR_MORE_DATA) > > + { > > + HeapFree(GetProcessHeap(), 0, ReadValue); > > + } > > + else break; > > + > > + ReadValue = HeapAlloc(GetProcessHeap(), 0, *Length); > > + if (!ReadValue) return NULL; > > + } > > + > > + if (Error != ERROR_SUCCESS) > > + { > > + if (ReadValue) HeapFree(GetProcessHeap(), 0, ReadValue); > > + > > + *Length = 0; > > + *RegistryType = REG_NONE; > > + ReadValue = NULL; > > + } > > + > > + return ReadValue; > > +} > > + > > +PWCHAR TerminateReadString(PWCHAR String, DWORD Length) > > +{ > > + PWCHAR TerminatedString; > > + > > + TerminatedString = HeapAlloc(GetProcessHeap(), 0, Length + > > sizeof(WCHAR)); > > + if (TerminatedString == NULL) > > + return NULL; > > + > > + memcpy(TerminatedString, String, Length); > > + > > + TerminatedString[Length / sizeof(WCHAR)] = UNICODE_NULL; > > + > > + return TerminatedString; > > +} > > + > > +PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ) > > +{ > > + PWCHAR String, TerminatedString; > > + DWORD Type, Length; > > + > > + String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length); > > + if (!String) return NULL; > > + if (Type != REG_SZ) > > + { > > + DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, > > REG_SZ); > > + //HeapFree(GetProcessHeap(), 0, String); > > + //return NULL; > > + } > > + > > + TerminatedString = TerminateReadString(String, Length); > > + HeapFree(GetProcessHeap(), 0, String); > > + if (!TerminatedString) return NULL; > > + > > + return TerminatedString; > > } > > > > void ConsumeRegValueString( PWCHAR Value ) { > > - if (Value) free(Value); > > + if (Value) HeapFree(GetProcessHeap(), 0, Value); > > } > > > > PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName > > ) { > > - return 0; /* FIXME if needed */ > > + PWCHAR String, TerminatedString, Tmp; > > + PWCHAR *Table; > > + DWORD Type, Length, i, j; > > + > > + String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length); > > + if (!String) return NULL; > > + if (Type != REG_MULTI_SZ) > > + { > > + DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, > > REG_MULTI_SZ); > > + //HeapFree(GetProcessHeap(), 0, String); > > + //return NULL; > > + } > > + > > + TerminatedString = TerminateReadString(String, Length); > > + HeapFree(GetProcessHeap(), 0, String); > > + if (!TerminatedString) return NULL; > > + > > + for (Tmp = TerminatedString, i = 0; *Tmp; Tmp++, i++) while (*Tmp) > > Tmp++; > > + > > + Table = HeapAlloc(GetProcessHeap(), 0, (i + 1) * sizeof(PWCHAR)); > > + if (!Table) > > + { > > + HeapFree(GetProcessHeap(), 0, TerminatedString); > > + return NULL; > > + } > > + > > + for (Tmp = TerminatedString, j = 0; *Tmp; Tmp++, j++) > > + { > > + PWCHAR Orig = Tmp; > > + > > + for (i = 0; *Tmp; i++, Tmp++); > > + > > + Table[j] = HeapAlloc(GetProcessHeap(), 0, i * sizeof(WCHAR)); > > + memcpy(Table[j], Orig, i * sizeof(WCHAR)); > > + } > > + > > + Table[j] = NULL; > > + > > + HeapFree(GetProcessHeap(), 0, TerminatedString); > > + > > + return Table; > > } > > > > Modified: trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c > > URL: > > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c?rev=48593&r1=48592&r2=48593&view=diff > > ============================================================================== > > --- trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c [iso-8859-1] > > (original) > > +++ trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c [iso-8859-1] Sun Aug > > 22 22:22:27 2010 > > @@ -122,47 +122,24 @@ > > > > void EnumNameServers( HANDLE RegHandle, PWCHAR Interface, > > PVOID Data, EnumNameServersFunc cb ) { > > - PWCHAR NameServerString = > > - QueryRegistryValueString(RegHandle, L"DhcpNameServer"); > > + PWCHAR *NameServerString = > > + QueryRegistryValueStringMulti(RegHandle, L"DhcpNameServer"); > > + DWORD i; > > > > if (!NameServerString) > > - 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); > > - } > > -} > > - > > + NameServerString = QueryRegistryValueStringMulti(RegHandle, > > L"NameServer"); > > + > > + if (!NameServerString) return; > > + > > + for (i = 0; NameServerString[i]; i++) > > + { > > + cb(Interface, NameServerString[i], Data); > > + > > + HeapFree(GetProcessHeap(), 0, NameServerString[i]); > > + } > > + > > + HeapFree(GetProcessHeap(), 0, NameServerString); > > +} > > static void CreateNameServerListEnumNamesFuncCount( PWCHAR Interface, > > PWCHAR Server, > > PVOID _Data ) { > > > > > > > > > > > _______________________________________________ > Ros-dev mailing list > [email protected] > http://www.reactos.org/mailman/listinfo/ros-dev _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
