There are several issues with this patch:
+ /* What a strage dance */
+ struct client_config *config = ifi->client->config;
1) dhcp crashes for me on the line above.
+ char ComputerName [MAX_COMPUTERNAME_LENGTH +
1];
2) use Unicode, please. Obsolete as described in 4)
+ DWORD ComputerNameSize = sizeof ComputerName /
sizeof ComputerName[0];
+
+ GetComputerName(ComputerName, & ComputerNameSize);
3) missing error check, leading to buffer overflow if accessed the
string in ComputerName
+ /* This never gets freed since it's only
called once */
+ LPSTR lpCompName =
+ HeapAlloc(GetProcessHeap(), 0, strlen(ComputerName) + 1);
4) makes the ComputerName buffer on the stack obsolete. Only use the
dynamic buffer. strlen will likely cause a buffer overflow if the
computer name was longer than the length of the (obsolete) static buffer
on the stack, since the static buffer will never be initialized in this
case.
+ if (lpCompName !=NULL) {
+ GetComputerName(lpCompName, & ComputerNameSize);
5) once again missing error check which may cause buffer overflows in
the following code
+ /* Send our hostname, some dhcpds use this
to update DNS */
+ config->send_options[DHO_HOST_NAME].data = strlwr(lpCompName);
6) strlwr is POSIX ;)
+ config->send_options[DHO_HOST_NAME].len
= strlen(ComputerName);
7) operating on the wrong buffer, may cause buffer overflow due to 5)
+ warn("util.c read_client_conf poorly
implemented!");
Indeed :(
Apart from the bugs mentioned in this code, GetComputerNameExA has a few
bugs: 1) incorrectly returning ERROR_OUTOFMEMORY instead of FALSE and 2)
not checking the return value of RtlUnicodeStringToAnsiString.
- Thomas