From d979a7993eb20843a8dd01ef2b596295b4d4311d Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Fri, 5 Feb 2010 19:47:16 -0800 Subject: [PATCH] Wrap syscalls with try-catch --- lib/net.js | 63 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/lib/net.js b/lib/net.js index 232cf906bc6..b35674ae913 100644 --- a/lib/net.js +++ b/lib/net.js @@ -92,20 +92,25 @@ function Socket (peerInfo) { debug('recvBuffer.used ' + recvBuffer.used); var bytesRead; - if (self.type == "unix") { - bytesRead = recvMsg(self.fd, - recvBuffer, - recvBuffer.used, - recvBuffer.length - recvBuffer.used); - debug('recvMsg.fd ' + recvMsg.fd); - if (recvMsg.fd) { - self.emit('fd', recvMsg.fd); + try { + if (self.type == "unix") { + bytesRead = recvMsg(self.fd, + recvBuffer, + recvBuffer.used, + recvBuffer.length - recvBuffer.used); + debug('recvMsg.fd ' + recvMsg.fd); + if (recvMsg.fd) { + self.emit('fd', recvMsg.fd); + } + } else { + bytesRead = read(self.fd, + recvBuffer, + recvBuffer.used, + recvBuffer.length - recvBuffer.used); } - } else { - bytesRead = read(self.fd, - recvBuffer, - recvBuffer.used, - recvBuffer.length - recvBuffer.used); + } catch (e) { + self.forceClose(e); + return; } debug('bytesRead ' + bytesRead + '\n'); @@ -320,15 +325,22 @@ Socket.prototype.flush = function () { } var fdToSend = null; - if (b.isFd) { - fdToSend = parseInt(b.asciiSlice(b.sent, b.used - b.sent)); - bytesWritten = sendFD(self.fd, fdToSend); - } else { - bytesWritten = write(self.fd, - b, - b.sent, - b.used - b.sent); + + try { + if (b.isFd) { + fdToSend = parseInt(b.asciiSlice(b.sent, b.used - b.sent)); + bytesWritten = sendFD(self.fd, fdToSend); + } else { + bytesWritten = write(self.fd, + b, + b.sent, + b.used - b.sent); + } + } catch (e) { + self.forceClose(e); + return; } + if (bytesWritten === null) { // could not flush everything self._writeWatcher.start(); @@ -451,7 +463,14 @@ Socket.prototype.forceClose = function (exception) { Socket.prototype._shutdown = function () { if (this.writable) { this.writable = false; - shutdown(this.fd, 'write'); + + try { + shutdown(this.fd, 'write') + } catch (e) { + this.forceClose(e); + return; + } + if (!this.readable) this.forceClose(); } };