James Hawkins : kernel32: Handle writing empty sections and keys in WritePrivateProfileString.

svn path=/trunk/; revision=40488
This commit is contained in:
Christoph von Wittich 2009-04-13 18:53:56 +00:00
parent 1ceab2328e
commit 75d63be3e0

View file

@ -213,31 +213,31 @@ static void PROFILE_Save( HANDLE hFile, const PROFILESECTION *section, ENCODING
for ( ; section; section = section->next) for ( ; section; section = section->next)
{ {
int len = 0; int len = 4;
if (section->name[0]) len += wcslen(section->name) + 6; if (section->name[0]) len += wcslen(section->name);
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
{ {
len += wcslen(key->name) + 2; len += wcslen(key->name);
if (key->value) len += wcslen(key->value) + 1; if (key->value && key->value[0]) len += wcslen(key->value);
len += 3; /* '=' and "\r\n" */
} }
buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if (!buffer) return; if (!buffer) return;
p = buffer; p = buffer;
*p++ = '[';
if (section->name[0]) if (section->name[0])
{ {
*p++ = '\r';
*p++ = '\n';
*p++ = '[';
wcscpy( p, section->name ); wcscpy( p, section->name );
p += wcslen(p); p += wcslen(p);
*p++ = ']';
*p++ = '\r';
*p++ = '\n';
} }
*p++ = ']';
*p++ = '\r';
*p++ = '\n';
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
{ {
wcscpy( p, key->name ); wcscpy( p, key->name );
@ -607,12 +607,20 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
int seclen, keylen; int seclen, keylen;
while (PROFILE_isspaceW(*section_name)) section_name++; while (PROFILE_isspaceW(*section_name)) section_name++;
p = section_name + wcslen(section_name) - 1; if (*section_name)
p = section_name + wcslen(section_name) - 1;
else
p = section_name;
while ((p > section_name) && PROFILE_isspaceW(*p)) p--; while ((p > section_name) && PROFILE_isspaceW(*p)) p--;
seclen = p - section_name + 1; seclen = p - section_name + 1;
while (PROFILE_isspaceW(*key_name)) key_name++; while (PROFILE_isspaceW(*key_name)) key_name++;
p = key_name + wcslen(key_name) - 1; if (*key_name)
p = key_name + wcslen(key_name) - 1;
else
p = key_name;
while ((p > key_name) && PROFILE_isspaceW(*p)) p--; while ((p > key_name) && PROFILE_isspaceW(*p)) p--;
keylen = p - key_name + 1; keylen = p - key_name + 1;