diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-05-01 06:03:02 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-05-01 06:03:02 -0700 |
commit | 62c6be5c35da62c1809b217850c18b1e3abe47f1 (patch) | |
tree | 6e4e532708fcbfb48fe9364c7254717532414972 /share | |
parent | 68c2febec2dd78fd76ea9092fffec0086e7dfe33 (diff) | |
download | txr-62c6be5c35da62c1809b217850c18b1e3abe47f1.tar.gz txr-62c6be5c35da62c1809b217850c18b1e3abe47f1.tar.bz2 txr-62c6be5c35da62c1809b217850c18b1e3abe47f1.zip |
sockets: bug in formatting ipv6 address.
The str-in6addr and str-in6addr-net functions mishandle
the zero address, rendering it as ":" instead of "::".
* share/txr/stdlib/socket.tl (sys:in6addr-condensed-text):
Test for the degenerate case and map it to "::" output.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/socket.tl | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/share/txr/stdlib/socket.tl b/share/txr/stdlib/socket.tl index 5f9d3d7c..2571aef1 100644 --- a/share/txr/stdlib/socket.tl +++ b/share/txr/stdlib/socket.tl @@ -62,17 +62,20 @@ `@a.@b.@c.@d@p`))) (defun sys:in6addr-condensed-text (numeric-pieces) - (let* ((notyet t) - (texts (window-mappend - 1 nil - (lambda (pre chunk post) - (cond - ((and notyet (zerop (car chunk)) (cdr chunk)) - (zap notyet) - (if (and post pre) '("") '(":"))) - (t (mapcar (op format nil "~x") chunk)))) - [partition-by zerop numeric-pieces]))) - `@{texts ":"}`)) + (let ((parted [partition-by zerop numeric-pieces])) + (if (or (cdr parted) (nzerop (caar parted))) + (let* ((notyet t) + (texts (window-mappend + 1 nil + (lambda (pre chunk post) + (cond + ((and notyet (zerop (car chunk)) (cdr chunk)) + (zap notyet) + (if (and post pre) '("") '(":"))) + (t (mapcar (op format nil "~x") chunk)))) + parted))) + `@{texts ":"}`) + "::"))) (defun str-in6addr (addr : port) (let ((str (if (and (<= (width addr) 48) |