Fix #1707 hasOwnProperty usage
authorisaacs <i@izs.me>
Thu, 15 Sep 2011 17:38:25 +0000 (10:38 -0700)
committerisaacs <i@izs.me>
Thu, 15 Sep 2011 17:54:08 +0000 (10:54 -0700)
If hasOwnProperty is overridden, then calling `obj.hasOwnProperty(prop)`
can fail.  Any time a dictionary of user-generated items is built, we
cannot rely on hasOwnProperty being safe, so must call it from the
Object.prototype explicitly.

lib/module.js
lib/querystring.js
lib/repl.js
test/simple/test-querystring.js

index 650f340..3d3d1e7 100644 (file)
@@ -26,7 +26,10 @@ var runInNewContext = Script.runInNewContext;
 var assert = require('assert').ok;
 
 
-function hOP(obj, prop) {
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
   return Object.prototype.hasOwnProperty.call(obj, prop);
 }
 
@@ -91,7 +94,7 @@ function statPath(path) {
 var packageCache = {};
 
 function readPackage(requestPath) {
-  if (hOP(packageCache, requestPath)) {
+  if (hasOwnProperty(packageCache, requestPath)) {
     return packageCache[requestPath];
   }
 
index e8796e4..58b9025 100644 (file)
@@ -25,7 +25,10 @@ var QueryString = exports;
 var urlDecode = process.binding('http_parser').urlDecode;
 
 
-function hOP(obj, prop) {
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
   return Object.prototype.hasOwnProperty.call(obj, prop);
 }
 
@@ -171,7 +174,7 @@ QueryString.parse = QueryString.decode = function(qs, sep, eq) {
     var k = QueryString.unescape(x[0], true);
     var v = QueryString.unescape(x.slice(1).join(eq), true);
 
-    if (!hOP(obj, k)) {
+    if (!hasOwnProperty(obj, k)) {
       obj[k] = v;
     } else if (!Array.isArray(obj[k])) {
       obj[k] = [obj[k], v];
index 3a9cae0..3ae5b4c 100644 (file)
@@ -46,8 +46,10 @@ var path = require('path');
 var fs = require('fs');
 var rl = require('readline');
 
-
-function hOP(obj, prop) {
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
   return Object.prototype.hasOwnProperty.call(obj, prop);
 }
 
@@ -452,7 +454,7 @@ REPLServer.prototype.complete = function(line) {
       group.sort();
       for (var j = 0; j < group.length; j++) {
         c = group[j];
-        if (!hOP(uniq, c)) {
+        if (!hasOwnProperty(uniq, c)) {
           completions.push(c);
           uniq[c] = true;
         }
index 127fb59..0900c33 100644 (file)
@@ -49,6 +49,7 @@ var qsTestCases = [
   [' foo = bar ', '%20foo%20=%20bar%20', {' foo ': ' bar '}],
   ['foo=%zx', 'foo=%25zx', {'foo': '%zx'}],
   ['foo=%EF%BF%BD', 'foo=%EF%BF%BD', {'foo': '\ufffd' }],
+  // See: https://github.com/joyent/node/issues/1707
   [ 'hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz',
     'hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz',
     { hasOwnProperty: 'x',