Nikolay Sivov : comctl32/monthcal: After notification safely free buffer allocated on heap.
Alexandre Julliard
julliard at winehq.org
Mon Oct 3 17:21:24 CDT 2011
Module: wine
Branch: master
Commit: 40c783fcc10e47c9653322644956021029368a34
URL: http://source.winehq.org/git/wine.git/?a=commit;h=40c783fcc10e47c9653322644956021029368a34
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Sep 30 23:41:04 2011 +0400
comctl32/monthcal: After notification safely free buffer allocated on heap.
---
dlls/comctl32/monthcal.c | 29 +++++++++++++++--------------
dlls/comctl32/tests/monthcal.c | 23 +++++++++++++++++++++++
2 files changed, 38 insertions(+), 14 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index a2d8a19..0c51075 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -1884,24 +1884,25 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
/* MCN_GETDAYSTATE notification helper */
static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
{
- if(infoPtr->dwStyle & MCS_DAYSTATE) {
- NMDAYSTATE nmds;
+ MONTHDAYSTATE *state;
+ NMDAYSTATE nmds;
- nmds.nmhdr.hwndFrom = infoPtr->hwndSelf;
- nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- nmds.nmhdr.code = MCN_GETDAYSTATE;
- nmds.cDayState = MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0);
- nmds.prgDayState = Alloc(nmds.cDayState * sizeof(MONTHDAYSTATE));
+ if (!(infoPtr->dwStyle & MCS_DAYSTATE)) return;
- MONTHCAL_GetMinDate(infoPtr, &nmds.stStart);
- nmds.stStart.wDay = 1;
+ nmds.nmhdr.hwndFrom = infoPtr->hwndSelf;
+ nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
+ nmds.nmhdr.code = MCN_GETDAYSTATE;
+ nmds.cDayState = MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0);
+ nmds.prgDayState = state = Alloc(nmds.cDayState * sizeof(MONTHDAYSTATE));
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds);
- memcpy(infoPtr->monthdayState, nmds.prgDayState,
- MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
+ MONTHCAL_GetMinDate(infoPtr, &nmds.stStart);
+ nmds.stStart.wDay = 1;
- Free(nmds.prgDayState);
- }
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds);
+ memcpy(infoPtr->monthdayState, nmds.prgDayState,
+ MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
+
+ Free(state);
}
/* no valid range check performed */
diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c
index 2686fb7..9775095 100644
--- a/dlls/comctl32/tests/monthcal.c
+++ b/dlls/comctl32/tests/monthcal.c
@@ -466,6 +466,29 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP
add_message(sequences, PARENT_SEQ_INDEX, &msg);
}
+ if (message == WM_NOTIFY)
+ {
+ NMHDR *hdr = (NMHDR*)lParam;
+ switch (hdr->code)
+ {
+ case MCN_GETDAYSTATE:
+ {
+ NMDAYSTATE *nmstate = (NMDAYSTATE*)lParam;
+ MONTHDAYSTATE months[14] = { 0 };
+
+ ok(nmstate->cDayState > 0, "got %d\n", nmstate->cDayState);
+ ok(nmstate->cDayState <= 14, "got %d\n", nmstate->cDayState);
+ ok(nmstate->prgDayState != NULL, "got %p\n", nmstate->prgDayState);
+
+ nmstate->prgDayState = months;
+
+ return TRUE;
+ }
+ default:
+ break;
+ }
+ }
+
defwndproc_counter++;
ret = DefWindowProcA(hwnd, message, wParam, lParam);
defwndproc_counter--;
More information about the wine-cvs
mailing list