summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-05-05 16:50:22 -0700
committerGabe Black <gabeblack@google.com>2017-05-09 16:44:30 +0000
commitf2b6dc8d2701dc8da5d365a73336d4a8a3dd3478 (patch)
tree7ea103b6d3de20eee5783787abde491ab0c67b6e /src
parent20e221c9c9d4fb4314af062f062a196fafdbb515 (diff)
downloadgem5-f2b6dc8d2701dc8da5d365a73336d4a8a3dd3478.tar.xz
base: Teach the socket listeners how to bind to the loopback.
The loopback device will allow access to various services like remote GDB debugging, connecting to the terminal, etc., without letting external agents like port scanners connect and disrupting the simulation. Change-Id: I76dccbf152fa278ae9f342b25f7e345a1329fbe4 Reviewed-on: https://gem5-review.googlesource.com/3080 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/base/socket.cc14
-rw-r--r--src/base/socket.hh4
2 files changed, 17 insertions, 1 deletions
diff --git a/src/base/socket.cc b/src/base/socket.cc
index 7a444373b..5ef0f4b9e 100644
--- a/src/base/socket.cc
+++ b/src/base/socket.cc
@@ -40,12 +40,15 @@
#include "base/misc.hh"
#include "base/types.hh"
+#include "sim/byteswap.hh"
using namespace std;
bool ListenSocket::listeningDisabled = false;
bool ListenSocket::anyListening = false;
+bool ListenSocket::bindToLoopback = false;
+
void
ListenSocket::disableAll()
{
@@ -60,6 +63,14 @@ ListenSocket::allDisabled()
return listeningDisabled;
}
+void
+ListenSocket::loopbackOnly()
+{
+ if (anyListening)
+ panic("Too late to bind to loopback, already have a listener");
+ bindToLoopback = true;
+}
+
////////////////////////////////////////////////////////////////////////
//
//
@@ -94,7 +105,8 @@ ListenSocket::listen(int port, bool reuse)
struct sockaddr_in sockaddr;
sockaddr.sin_family = PF_INET;
- sockaddr.sin_addr.s_addr = INADDR_ANY;
+ sockaddr.sin_addr.s_addr =
+ htobe<unsigned long>(bindToLoopback ? INADDR_LOOPBACK : INADDR_ANY);
sockaddr.sin_port = htons(port);
// finally clear sin_zero
memset(&sockaddr.sin_zero, 0, sizeof(sockaddr.sin_zero));
diff --git a/src/base/socket.hh b/src/base/socket.hh
index 942318e45..fab7f7576 100644
--- a/src/base/socket.hh
+++ b/src/base/socket.hh
@@ -37,10 +37,14 @@ class ListenSocket
static bool listeningDisabled;
static bool anyListening;
+ static bool bindToLoopback;
+
public:
static void disableAll();
static bool allDisabled();
+ static void loopbackOnly();
+
protected:
bool listening;
int fd;