]> git.eshelyaron.com Git - emacs.git/commitdiff
Use raw bytes for SOCKS 4 IP addresses
authorF. Jason Park <jp@neverwas.me>
Sat, 6 Feb 2021 03:41:04 +0000 (19:41 -0800)
committerEli Zaretskii <eliz@gnu.org>
Sat, 20 Feb 2021 11:03:12 +0000 (13:03 +0200)
* lisp/net/socks.el: (socks--open-network-stream, socks-send-command):
* test/lisp/net/socks-tests.el: (socks-tests-v4-basic): (Bug#46342).

lisp/net/socks.el
test/lisp/net/socks-tests.el

index 96fafc826b82d5e50bc1a75f504e781d4a5d1a18..1da1d31d6785aa0e08c39d34c0d37454b2c11cf1 100644 (file)
       proc)))
 
 (defun socks-send-command (proc command atype address port)
+  "Send COMMAND to SOCKS service PROC for proxying ADDRESS and PORT.
+When ATYPE indicates an IP, param ADDRESS must be given as raw bytes."
   (let ((addr (cond
               ((or (= atype socks-address-type-v4)
                    (= atype socks-address-type-v6))
                (setq host (socks-nslookup-host host))
                (if (not (listp host))
                    (error "Could not get IP address for: %s" host))
-               (setq host (apply #'format "%c%c%c%c" host))
+               (setq host (apply #'unibyte-string host))
                 socks-address-type-v4)
                (t
                 socks-address-type-name))))
index 340a42d79cc518504d62cc1b2a99a02e7fd968e5..9a2dcba9daf50fa098a6dbe5846cbd3e4ce44c4e 100644 (file)
@@ -185,6 +185,26 @@ Vectors must match verbatim. Strings are considered regex patterns.")
     (kill-buffer buf)
     (ignore url-gateway-method)))
 
+;; Unlike curl, socks.el includes the ID field (but otherwise matches):
+;; $ curl --proxy socks4://127.0.0.1:1080 example.com
+
+(ert-deftest socks-tests-v4-basic ()
+  "Show correct preparation of SOCKS4 connect command (Bug#46342)."
+  (let ((socks-server '("server" "127.0.0.1" 10079 4))
+        (url-user-agent "Test/4-basic")
+        (socks-tests-canned-server-patterns
+         `(([4 1 0 80 93 184 216 34 ?f ?o ?o 0] . [0 90 0 0 0 0 0 0])
+           ,socks-tests--hello-world-http-request-pattern))
+        socks-nslookup-program)
+    (ert-info ("Make HTTP request over SOCKS4")
+      (cl-letf (((symbol-function 'socks-nslookup-host)
+                 (lambda (host)
+                   (should (equal host "example.com"))
+                   (list 93 184 216 34)))
+                ((symbol-function 'user-full-name)
+                 (lambda () "foo")))
+        (socks-tests-perform-hello-world-http-request)))))
+
 ;; Replace first pattern below with ([5 3 0 1 2] . [5 2]) to validate
 ;; against curl 7.71 with the following options:
 ;; $ curl --verbose -U foo:bar --proxy socks5h://127.0.0.1:10080 example.com