summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--ext/openssl/ossl_config.c4
-rw-r--r--ext/openssl/ossl_x509ext.c1
-rw-r--r--ext/strscan/strscan.c14
4 files changed, 27 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 8cf1373..a680a59 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sat Aug 30 15:43:03 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * ext/openssl/ossl_config.c (Init_ossl_config): memory leak fixed.
+ a patch <shinichiro.hamaji at gmail.com> in [ruby-dev:35880].
+
+ * ext/openssl/ossl_x509ext.c (ossl_x509ext_set_value): ditto.
+
+ * ext/strscan/strscan.c (strscan_do_scan): ditto.
+
Sat Aug 30 14:58:32 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/openssl/ossl_x509ext.c (ossl_x509ext_initialize): fix for
diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c
index baa573d..f305af4 100644
--- a/ext/openssl/ossl_config.c
+++ b/ext/openssl/ossl_config.c
@@ -443,8 +443,10 @@ Init_ossl_config()
eConfigError = rb_define_class_under(mOSSL, "ConfigError", eOSSLError);
cConfig = rb_define_class_under(mOSSL, "Config", rb_cObject);
+ const char *default_config_file = CONF_get1_default_config_file();
rb_define_const(cConfig, "DEFAULT_CONFIG_FILE",
- rb_str_new2(CONF_get1_default_config_file()));
+ rb_str_new2(default_config_file));
+ OPENSSL_free(default_config_file);
rb_include_module(cConfig, rb_mEnumerable);
rb_define_singleton_method(cConfig, "parse", ossl_config_s_parse, 1);
rb_define_alias(CLASS_OF(cConfig), "load", "new");
diff --git a/ext/openssl/ossl_x509ext.c b/ext/openssl/ossl_x509ext.c
index f08006f..6486703 100644
--- a/ext/openssl/ossl_x509ext.c
+++ b/ext/openssl/ossl_x509ext.c
@@ -333,6 +333,7 @@ ossl_x509ext_set_value(VALUE self, VALUE data)
ASN1_OCTET_STRING_free(asn1s);
ossl_raise(eX509ExtError, NULL);
}
+ free(s);
GetX509Ext(self, ext);
X509_EXTENSION_set_data(ext, asn1s);
diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c
index 622bfae..6f05ec3 100644
--- a/ext/strscan/strscan.c
+++ b/ext/strscan/strscan.c
@@ -407,6 +407,7 @@ strscan_do_scan(VALUE self, VALUE regex, int succptr, int getstr, int headonly)
struct strscanner *p;
regex_t *re;
int ret;
+ int tmpreg;
Check_Type(regex, T_REGEXP);
GET_SCANNER(self, p);
@@ -416,6 +417,9 @@ strscan_do_scan(VALUE self, VALUE regex, int succptr, int getstr, int headonly)
return Qnil;
}
re = rb_reg_prepare_re(regex, p->str);
+ tmpreg = re != RREGEXP(regex)->ptr;
+ if (!tmpreg) RREGEXP(regex)->usecnt++;
+
if (headonly) {
ret = onig_match(re, (UChar* )CURPTR(p),
(UChar* )(CURPTR(p) + S_RESTLEN(p)),
@@ -427,6 +431,16 @@ strscan_do_scan(VALUE self, VALUE regex, int succptr, int getstr, int headonly)
(UChar* )CURPTR(p), (UChar* )(CURPTR(p) + S_RESTLEN(p)),
&(p->regs), ONIG_OPTION_NONE);
}
+ if (!tmpreg) RREGEXP(re)->usecnt--;
+ if (tmpreg) {
+ if (RREGEXP(regex)->usecnt) {
+ onig_free(re);
+ }
+ else {
+ onig_free(RREGEXP(regex)->ptr);
+ RREGEXP(regex)->ptr = re;
+ }
+ }
if (ret == -2) rb_raise(ScanError, "regexp buffer overflow");
if (ret < 0) {