From 73cf8e82e768af870964d6f3375ab758e774165c Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 21 Dec 2011 12:01:39 -0800 Subject: [PATCH] Add HandleScope to http-parser binding Fixes production crashes. We were not able to reproduce in the test suite. --- src/node_http_parser.cc | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index 38251a1e7c0..32fd08d676f 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -119,15 +119,17 @@ static size_t current_buffer_len; #define HTTP_CB(name) \ - static int name(http_parser* p_) { \ - Parser* self = container_of(p_, Parser, parser_); \ - return self->name##_(); \ - } \ - int always_inline name##_() + static int name(http_parser* p_) { \ + HandleScope scope; \ + Parser* self = container_of(p_, Parser, parser_); \ + return self->name##_(); \ + } \ + int always_inline name##_() #define HTTP_DATA_CB(name) \ static int name(http_parser* p_, const char* at, size_t length) { \ + HandleScope scope; \ Parser* self = container_of(p_, Parser, parser_); \ return self->name##_(at, length); \ } \ @@ -212,10 +214,12 @@ struct StringPtr { Handle ToString() const { - if (str_) - return String::New(str_, size_); - else - return String::Empty(); + HandleScope scope; + if (str_) { + return scope.Close(String::New(str_, size_)); + } else { + return scope.Close(String::Empty()); + } } @@ -513,6 +517,8 @@ public: private: Local CreateHeaders() { + HandleScope scope; + // num_values_ is either -1 or the entry # of the last header // so num_values_ == 0 means there's a single header Local headers = Array::New(2 * (num_values_ + 1)); @@ -522,7 +528,7 @@ private: headers->Set(2 * i + 1, values_[i].ToString()); } - return headers; + return scope.Close(headers); }