]> granicus.if.org Git - python/commitdiff
Added leading comment and security check.
authorGuido van Rossum <guido@python.org>
Sat, 19 Jul 1997 21:33:10 +0000 (21:33 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 19 Jul 1997 21:33:10 +0000 (21:33 +0000)
Demo/pysvr/pysvr.c

index f6f9e08c4918441b3611a8668bbf80eb5001b6de..133b7850b5f89fc49cfa3d0f17f95ae84efd433d 100644 (file)
@@ -1,3 +1,13 @@
+/* A multi-threaded telnet-like server that gives a Python prompt.
+
+Usage: pysvr [port]
+
+For security reasons, it only accepts requests from the current host.
+This can still be insecure, but restricts violations from people who
+can log in on your machine.  Use with caution!
+
+*/
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -88,8 +98,8 @@ usage()
 static void
 main_thread(int port)
 {
-       int sock;
-       struct sockaddr_in addr;
+       int sock, conn, size;
+       struct sockaddr_in addr, clientaddr;
 
        sock = socket(PF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
@@ -117,9 +127,7 @@ main_thread(int port)
        fprintf(stderr, "Listening on port %d...\n", port);
 
        for (;;) {
-               struct sockaddr_in clientaddr;
-               int conn, size;
-
+               size = sizeof clientaddr;
                conn = accept(sock, (struct sockaddr *) &clientaddr, &size);
                if (conn < 0) {
                        oprogname();
@@ -127,6 +135,21 @@ main_thread(int port)
                        exit(1);
                }
 
+               size = sizeof addr;
+               if (getsockname(conn, (struct sockaddr *)&addr, &size) < 0) {
+                       oprogname();
+                       perror("can't get socket name of connection");
+                       exit(1);
+               }
+               if (clientaddr.sin_addr.s_addr != addr.sin_addr.s_addr) {
+                       oprogname();
+                       perror("connection from non-local host refused");
+                       fprintf(stderr, "(addr=%lx, clientaddr=%lx)\n",
+                               ntohl(addr.sin_addr.s_addr),
+                               ntohl(clientaddr.sin_addr.s_addr));
+                       close(conn);
+                       continue;
+               }
                create_thread(conn, &clientaddr);
        }
 }