regedit: [2/2] Do not use a local copy of a global pointer
Detlef Riekenberg
wine.dev at web.de
Wed Feb 7 17:14:15 CST 2007
Changelog:
regedit: Do not use a local copy of a global pointer
The NULL-Check for WM_NOTIFY is required to avoid a crash,
when regedit was closed.
(NULL-Check was already present in WM_SETFOCUS and WM_SIZE)
--
By by ... Detlef
-------------- next part --------------
>From 8826b79b29ba65fc040007b47bf4881a643e1299 Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Wed, 7 Feb 2007 23:42:28 +0100
Subject: [PATCH] regedit: do not use a local copy of a global pointer
---
programs/regedit/childwnd.c | 64 +++++++++++++++++++++----------------------
1 files changed, 31 insertions(+), 33 deletions(-)
diff --git a/programs/regedit/childwnd.c b/programs/regedit/childwnd.c
index 3b3be61..6a56e82 100644
--- a/programs/regedit/childwnd.c
+++ b/programs/regedit/childwnd.c
@@ -171,7 +171,6 @@ static void OnTreeSelectionChanged(HWND
static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
- ChildWnd* pChildWnd = g_pChildWnd;
switch (LOWORD(wParam)) {
/* Parse the menu selections: */
case ID_REGISTRY_EXIT:
@@ -182,8 +181,8 @@ static BOOL _CmdWndProc(HWND hWnd, UINT
/* TODO */
break;
case ID_SWITCH_PANELS:
- pChildWnd->nFocusPanel = !pChildWnd->nFocusPanel;
- SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd);
+ g_pChildWnd->nFocusPanel = !g_pChildWnd->nFocusPanel;
+ SetFocus(g_pChildWnd->nFocusPanel? g_pChildWnd->hListWnd: g_pChildWnd->hTreeWnd);
break;
default:
return FALSE;
@@ -205,19 +204,18 @@ static BOOL _CmdWndProc(HWND hWnd, UINT
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int last_split;
- ChildWnd* pChildWnd = g_pChildWnd;
switch (message) {
case WM_CREATE:
- g_pChildWnd = pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd));
- if (!pChildWnd) return 0;
- LoadString(hInst, IDS_REGISTRY_ROOT_NAME, pChildWnd->szPath, MAX_PATH);
- pChildWnd->nSplitPos = 250;
- pChildWnd->hWnd = hWnd;
- pChildWnd->hTreeWnd = CreateTreeView(hWnd, pChildWnd->szPath, TREE_WINDOW);
- pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, pChildWnd->szPath*/);
- pChildWnd->nFocusPanel = 1;
- SetFocus(pChildWnd->hTreeWnd);
+ g_pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd));
+ if (!g_pChildWnd) return 0;
+ LoadString(hInst, IDS_REGISTRY_ROOT_NAME, g_pChildWnd->szPath, MAX_PATH);
+ g_pChildWnd->nSplitPos = 250;
+ g_pChildWnd->hWnd = hWnd;
+ g_pChildWnd->hTreeWnd = CreateTreeView(hWnd, g_pChildWnd->szPath, TREE_WINDOW);
+ g_pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, g_pChildWnd->szPath*/);
+ g_pChildWnd->nFocusPanel = 1;
+ SetFocus(g_pChildWnd->hTreeWnd);
break;
case WM_COMMAND:
if (!_CmdWndProc(hWnd, message, wParam, lParam)) {
@@ -232,23 +230,23 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
POINT pt;
GetCursorPos(&pt);
ScreenToClient(hWnd, &pt);
- if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
+ if (pt.x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
SetCursor(LoadCursor(0, IDC_SIZEWE));
return TRUE;
}
}
goto def;
case WM_DESTROY:
- HeapFree(GetProcessHeap(), 0, pChildWnd);
- pChildWnd = NULL;
+ HeapFree(GetProcessHeap(), 0, g_pChildWnd);
+ g_pChildWnd = NULL;
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: {
RECT rt;
int x = (short)LOWORD(lParam);
GetClientRect(hWnd, &rt);
- if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
- last_split = pChildWnd->nSplitPos;
+ if (x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
+ last_split = g_pChildWnd->nSplitPos;
draw_splitbar(hWnd, last_split);
SetCapture(hWnd);
}
@@ -262,7 +260,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
draw_splitbar(hWnd, last_split);
last_split = -1;
GetClientRect(hWnd, &rt);
- pChildWnd->nSplitPos = x;
+ g_pChildWnd->nSplitPos = x;
ResizeWnd(rt.right, rt.bottom);
ReleaseCapture();
}
@@ -304,8 +302,8 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
break;
case WM_SETFOCUS:
- if (pChildWnd != NULL) {
- SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd);
+ if (g_pChildWnd != NULL) {
+ SetFocus(g_pChildWnd->nFocusPanel? g_pChildWnd->hListWnd: g_pChildWnd->hTreeWnd);
}
break;
@@ -313,16 +311,16 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
break;
case WM_NOTIFY:
- if ((int)wParam == TREE_WINDOW) {
+ if (((int)wParam == TREE_WINDOW) && (g_pChildWnd != NULL)) {
switch (((LPNMHDR)lParam)->code) {
case TVN_ITEMEXPANDING:
- return !OnTreeExpanding(pChildWnd->hTreeWnd, (NMTREEVIEW*)lParam);
+ return !OnTreeExpanding(g_pChildWnd->hTreeWnd, (NMTREEVIEW*)lParam);
case TVN_SELCHANGED:
- OnTreeSelectionChanged(pChildWnd->hTreeWnd, pChildWnd->hListWnd,
+ OnTreeSelectionChanged(g_pChildWnd->hTreeWnd, g_pChildWnd->hListWnd,
((NMTREEVIEW *)lParam)->itemNew.hItem, TRUE);
break;
case NM_SETFOCUS:
- pChildWnd->nFocusPanel = 0;
+ g_pChildWnd->nFocusPanel = 0;
break;
case NM_RCLICK: {
POINT pt;
@@ -334,16 +332,16 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
case TVN_ENDLABELEDIT: {
HKEY hRootKey;
LPNMTVDISPINFO dispInfo = (LPNMTVDISPINFO)lParam;
- LPCTSTR path = GetItemPath(pChildWnd->hTreeWnd, 0, &hRootKey);
+ LPCTSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey);
BOOL res = RenameKey(hWnd, hRootKey, path, dispInfo->item.pszText);
if (res) {
TVITEMEX item;
- LPTSTR fullPath = GetPathFullPath(pChildWnd->hTreeWnd,
+ LPTSTR fullPath = GetPathFullPath(g_pChildWnd->hTreeWnd,
dispInfo->item.pszText);
item.mask = TVIF_HANDLE | TVIF_TEXT;
- item.hItem = TreeView_GetSelection(pChildWnd->hTreeWnd);
+ item.hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd);
item.pszText = dispInfo->item.pszText;
- SendMessage( pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item );
+ SendMessage( g_pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item );
SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath);
HeapFree(GetProcessHeap(), 0, fullPath);
}
@@ -353,17 +351,17 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd,
return 0; /* goto def; */
}
} else
- if ((int)wParam == LIST_WINDOW) {
+ if (((int)wParam == LIST_WINDOW) && (g_pChildWnd != NULL)) {
if (((LPNMHDR)lParam)->code == NM_SETFOCUS) {
- pChildWnd->nFocusPanel = 1;
- } else if (!SendMessage(pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) {
+ g_pChildWnd->nFocusPanel = 1;
+ } else if (!SendMessage(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) {
goto def;
}
}
break;
case WM_SIZE:
- if (wParam != SIZE_MINIMIZED && pChildWnd != NULL) {
+ if (wParam != SIZE_MINIMIZED && g_pChildWnd != NULL) {
ResizeWnd(LOWORD(lParam), HIWORD(lParam));
}
/* fall through */
--
1.4.1
More information about the wine-patches
mailing list