[ros-dev] [ros-diffs] [cgutman] 48593: [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
Timo Kreuzer
timo.kreuzer at web.de
Mon Aug 23 03:16:53 UTC 2010
It looks like this change has caused some regressions in sysreg
http://www.reactos.org/testman/compare.php?ids=3934,3935
cgutman at svn.reactos.org 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 ) {
>
>
>
>
More information about the Ros-dev
mailing list