net: fix net.Server.listen({fd:x}) error reporting
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 12 Jul 2012 16:16:57 +0000 (18:16 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 12 Jul 2012 16:18:38 +0000 (18:18 +0200)
* don't assert when fd isn't an open file descriptor

* don't die with a ReferenceError when fd isn't a file descriptor
  you can listen() on

Fixes #3699.

lib/net.js
src/tty_wrap.cc
test/simple/test-listen-fd-ebadf.js [new file with mode: 0644]

index f129c0c..f5d3ebd 100644 (file)
@@ -851,6 +851,7 @@ var createServerHandle = exports._createServerHandle =
       default:
         // Not a fd we can listen on.  This will trigger an error.
         debug('listen invalid fd=' + fd + ' type=' + type);
+        global.errno = 'EINVAL'; // hack, callers expect that errno is set
         handle = null;
         break;
     }
index f1a189c..fde8717 100644 (file)
@@ -104,6 +104,9 @@ Handle<Value> TTYWrap::GuessHandleType(const Arguments& args) {
     case UV_FILE:
       return scope.Close(String::New("FILE"));
 
+    case UV_UNKNOWN_HANDLE:
+      return scope.Close(String::New("UNKNOWN"));
+
     default:
       assert(0);
       return v8::Undefined();
diff --git a/test/simple/test-listen-fd-ebadf.js b/test/simple/test-listen-fd-ebadf.js
new file mode 100644 (file)
index 0000000..6c0f20a
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var net = require('net');
+
+var gotError = 0;
+
+process.on('exit', function() {
+  assert.equal(gotError, 2);
+});
+
+net.createServer(assert.fail).listen({fd:2}).on('error', onError);
+net.createServer(assert.fail).listen({fd:42}).on('error', onError);
+
+function onError(ex) {
+  assert.equal(ex.code, 'EINVAL');
+  gotError++;
+}