diff options
Diffstat (limited to 'dev-ruby/ruby-fcgi/files/ruby-fcgi-leak.patch')
-rw-r--r-- | dev-ruby/ruby-fcgi/files/ruby-fcgi-leak.patch | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/dev-ruby/ruby-fcgi/files/ruby-fcgi-leak.patch b/dev-ruby/ruby-fcgi/files/ruby-fcgi-leak.patch new file mode 100644 index 000000000000..09acc768d1e8 --- /dev/null +++ b/dev-ruby/ruby-fcgi/files/ruby-fcgi-leak.patch @@ -0,0 +1,60 @@ +--- ext/fcgi/fcgi.c.orig 2003-08-27 20:28:35.000000000 +0900 ++++ ext/fcgi/fcgi.c 2005-02-01 16:57:39.741372024 +0900 +@@ -37,6 +37,12 @@ + rb_gc_mark(data->env); + } + ++static void fcgi_free_req(fcgi_data *data) ++{ ++ free(data->req); ++ free(data); ++} ++ + static VALUE fcgi_s_accept(VALUE self) + { + int status; +@@ -64,7 +70,7 @@ + VALUE obj,key, value; + char *pkey,*pvalue; + +- obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, 0, data); ++ obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, fcgi_free_req, data); + data->req = req; + data->in = Data_Wrap_Struct(cFCGIStream, 0, 0, req->in); + data->out = Data_Wrap_Struct(cFCGIStream, 0, 0, req->out); +@@ -379,7 +385,10 @@ + buff = ALLOC_N(char, 16384); + n = FCGX_GetStr(buff, 16384, stream); + CHECK_STREAM_ERROR(stream); +- if (n == 0) return Qnil; ++ if (n == 0) { ++ free(buff); ++ return Qnil; ++ } + str = rb_str_new(buff, n); + OBJ_TAINT(str); + +@@ -389,9 +398,11 @@ + if (n > 0) { + rb_str_cat(str, buff, n); + } else { ++ free(buff); + return Qnil; + } + } ++ free(buff); + return str; + } + +@@ -404,9 +415,11 @@ + if (n > 0) { + str = rb_str_new(buff, n); + OBJ_TAINT(str); ++ free(buff); + return str; + } + else { ++ free(buff); + return Qnil; + } + } |