Skip to content

Commit def7235

Browse files
committed
merge revision(s) 17561:
* ext/win32ole/win32ole.c(ole_invoke): fix memory leak. [ruby-bugs-20792] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@17684 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent b53240a commit def7235

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Sun Jun 29 18:22:06 2008 Masaki Suketa <masaki.suketa@nifty.ne.jp>
2+
3+
* ext/win32ole/win32ole.c(ole_invoke): fix memory leak.
4+
[ruby-bugs-20792]
5+
16
Sun Jun 29 18:19:11 2008 Akinori MUSHA <knu@iDaemons.org>
27

38
* eval.c (PUSH_FRAME, PUSH_CLASS): Add volatile to avoid a

ext/win32ole/win32ole.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979

8080
#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
8181

82-
#define WIN32OLE_VERSION "0.7.4"
82+
#define WIN32OLE_VERSION "0.7.5"
8383

8484
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
8585
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
@@ -522,6 +522,15 @@ ole_hresult2msg(hr)
522522
return msg;
523523
}
524524

525+
static void
526+
ole_freeexceptinfo(pExInfo)
527+
EXCEPINFO *pExInfo;
528+
{
529+
SysFreeString(pExInfo->bstrDescription);
530+
SysFreeString(pExInfo->bstrSource);
531+
SysFreeString(pExInfo->bstrHelpFile);
532+
}
533+
525534
static VALUE
526535
ole_excepinfo2msg(pExInfo)
527536
EXCEPINFO *pExInfo;
@@ -561,9 +570,7 @@ ole_excepinfo2msg(pExInfo)
561570
}
562571
if(pSource) free(pSource);
563572
if(pDescription) free(pDescription);
564-
SysFreeString(pExInfo->bstrDescription);
565-
SysFreeString(pExInfo->bstrSource);
566-
SysFreeString(pExInfo->bstrHelpFile);
573+
ole_freeexceptinfo(pExInfo);
567574
return error_msg;
568575
}
569576

@@ -2109,6 +2116,9 @@ ole_invoke(argc, argv, self, wFlags)
21092116
param = rb_ary_entry(paramS, i-cNamedArgs);
21102117
ole_val2variant(param, &op.dp.rgvarg[n]);
21112118
}
2119+
if (hr == DISP_E_EXCEPTION) {
2120+
ole_freeexceptinfo(&excepinfo);
2121+
}
21122122
memset(&excepinfo, 0, sizeof(EXCEPINFO));
21132123
VariantInit(&result);
21142124
hr = pole->pDispatch->lpVtbl->Invoke(pole->pDispatch, DispID,
@@ -2121,6 +2131,9 @@ ole_invoke(argc, argv, self, wFlags)
21212131
* hResult == DISP_E_EXCEPTION. this only happens on
21222132
* functions whose DISPID > 0x8000 */
21232133
if ((hr == DISP_E_EXCEPTION || hr == DISP_E_MEMBERNOTFOUND) && DispID > 0x8000) {
2134+
if (hr == DISP_E_EXCEPTION) {
2135+
ole_freeexceptinfo(&excepinfo);
2136+
}
21242137
memset(&excepinfo, 0, sizeof(EXCEPINFO));
21252138
hr = pole->pDispatch->lpVtbl->Invoke(pole->pDispatch, DispID,
21262139
&IID_NULL, lcid, wFlags,
@@ -2140,6 +2153,9 @@ ole_invoke(argc, argv, self, wFlags)
21402153
param = rb_ary_entry(paramS, i-cNamedArgs);
21412154
ole_val2variant2(param, &op.dp.rgvarg[n]);
21422155
}
2156+
if (hr == DISP_E_EXCEPTION) {
2157+
ole_freeexceptinfo(&excepinfo);
2158+
}
21432159
memset(&excepinfo, 0, sizeof(EXCEPINFO));
21442160
VariantInit(&result);
21452161
hr = pole->pDispatch->lpVtbl->Invoke(pole->pDispatch, DispID,

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define RUBY_RELEASE_DATE "2008-06-29"
33
#define RUBY_VERSION_CODE 187
44
#define RUBY_RELEASE_CODE 20080629
5-
#define RUBY_PATCHLEVEL 29
5+
#define RUBY_PATCHLEVEL 30
66

77
#define RUBY_VERSION_MAJOR 1
88
#define RUBY_VERSION_MINOR 8

0 commit comments

Comments
 (0)