[PATCH 6/6] kernel32: Open the INI file in PROFILE_DeleteSection().
Zebediah Figura
z.figura12 at gmail.com
Sun Jun 21 19:24:14 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/kernel32/profile.c | 112 ++++++++++++++++++++++------------------
1 file changed, 63 insertions(+), 49 deletions(-)
diff --git a/dlls/kernel32/profile.c b/dlls/kernel32/profile.c
index 06a06f7c01f..a93968b9a27 100644
--- a/dlls/kernel32/profile.c
+++ b/dlls/kernel32/profile.c
@@ -488,29 +488,6 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
}
-/***********************************************************************
- * PROFILE_DeleteSection
- *
- * Delete a section from a profile tree.
- */
-static BOOL PROFILE_DeleteSection( PROFILESECTION **section, LPCWSTR name )
-{
- while (*section)
- {
- if (!strcmpiW( (*section)->name, name ))
- {
- PROFILESECTION *to_del = *section;
- *section = to_del->next;
- to_del->next = NULL;
- PROFILE_Free( to_del );
- return TRUE;
- }
- section = &(*section)->next;
- }
- return FALSE;
-}
-
-
/***********************************************************************
* PROFILE_DeleteKey
*
@@ -922,6 +899,37 @@ static INT PROFILE_GetSection( const WCHAR *filename, LPCWSTR section_name,
return 0;
}
+static BOOL PROFILE_DeleteSection( const WCHAR *filename, const WCHAR *name )
+{
+ PROFILESECTION **section;
+
+ EnterCriticalSection( &PROFILE_CritSect );
+
+ if (!PROFILE_Open( filename, TRUE ))
+ {
+ LeaveCriticalSection( &PROFILE_CritSect );
+ return FALSE;
+ }
+
+ for (section = &CurProfile->section; *section; section = &(*section)->next)
+ {
+ if (!strcmpiW( (*section)->name, name ))
+ {
+ PROFILESECTION *to_del = *section;
+ *section = to_del->next;
+ to_del->next = NULL;
+ PROFILE_Free( to_del );
+ PROFILE_FlushFile();
+ LeaveCriticalSection( &PROFILE_CritSect );
+ return TRUE;
+ }
+ }
+
+ LeaveCriticalSection( &PROFILE_CritSect );
+ return FALSE;
+}
+
+
/* See GetPrivateProfileSectionNamesA for documentation */
static INT PROFILE_GetSectionNames( LPWSTR buffer, UINT len )
{
@@ -1316,27 +1324,30 @@ BOOL WINAPI WritePrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
{
BOOL ret = FALSE;
- RtlEnterCriticalSection( &PROFILE_CritSect );
-
if (!section && !entry && !string) /* documented "file flush" case */
{
+ EnterCriticalSection( &PROFILE_CritSect );
if (!filename || PROFILE_Open( filename, TRUE ))
{
- if (CurProfile) PROFILE_ReleaseFile(); /* always return FALSE in this case */
+ if (CurProfile) PROFILE_ReleaseFile();
}
+ LeaveCriticalSection( &PROFILE_CritSect );
+ return FALSE;
}
- else if (PROFILE_Open( filename, TRUE ))
+ if (!entry) return PROFILE_DeleteSection( filename, section );
+
+ EnterCriticalSection( &PROFILE_CritSect );
+
+ if (PROFILE_Open( filename, TRUE ))
{
if (!section)
SetLastError(ERROR_FILE_NOT_FOUND);
- else if (!entry)
- ret = PROFILE_DeleteSection( &CurProfile->section, section );
else
ret = PROFILE_SetString( section, entry, string, FALSE);
if (ret) ret = PROFILE_FlushFile();
}
- RtlLeaveCriticalSection( &PROFILE_CritSect );
+ LeaveCriticalSection( &PROFILE_CritSect );
return ret;
}
@@ -1376,37 +1387,40 @@ BOOL WINAPI WritePrivateProfileSectionW( LPCWSTR section,
BOOL ret = FALSE;
LPWSTR p;
- RtlEnterCriticalSection( &PROFILE_CritSect );
-
if (!section && !string)
{
+ EnterCriticalSection( &PROFILE_CritSect );
if (!filename || PROFILE_Open( filename, TRUE ))
{
- if (CurProfile) PROFILE_ReleaseFile(); /* always return FALSE in this case */
+ if (CurProfile) PROFILE_ReleaseFile();
}
+ LeaveCriticalSection( &PROFILE_CritSect );
+ return FALSE;
}
- else if (PROFILE_Open( filename, TRUE )) {
- if (!string)
+ if (!string) return PROFILE_DeleteSection( filename, section );
+
+ EnterCriticalSection( &PROFILE_CritSect );
+
+ if (PROFILE_Open( filename, TRUE ))
+ {
+ PROFILE_DeleteAllKeys(section);
+ ret = TRUE;
+ while (*string && ret)
{
- ret = PROFILE_DeleteSection( &CurProfile->section, section );
- } else {
- PROFILE_DeleteAllKeys(section);
- ret = TRUE;
- while(*string && ret) {
- LPWSTR buf = HeapAlloc( GetProcessHeap(), 0, (strlenW(string)+1) * sizeof(WCHAR) );
- strcpyW( buf, string );
- if((p = strchrW( buf, '='))) {
- *p='\0';
- ret = PROFILE_SetString( section, buf, p+1, TRUE);
- }
- HeapFree( GetProcessHeap(), 0, buf );
- string += strlenW(string)+1;
+ WCHAR *buf = HeapAlloc( GetProcessHeap(), 0, (strlenW( string ) + 1) * sizeof(WCHAR) );
+ strcpyW( buf, string );
+ if ((p = strchrW( buf, '=')))
+ {
+ *p = '\0';
+ ret = PROFILE_SetString( section, buf, p+1, TRUE );
}
+ HeapFree( GetProcessHeap(), 0, buf );
+ string += strlenW( string ) + 1;
}
if (ret) ret = PROFILE_FlushFile();
}
- RtlLeaveCriticalSection( &PROFILE_CritSect );
+ LeaveCriticalSection( &PROFILE_CritSect );
return ret;
}
--
2.27.0
More information about the wine-devel
mailing list