The branch main has been updated by jrtc27:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=6d2648bcaba9b14e2f5c76680f3e7608e1f125f4

commit 6d2648bcaba9b14e2f5c76680f3e7608e1f125f4
Author:     Jessica Clarke <jrt...@freebsd.org>
AuthorDate: 2021-06-08 17:30:59 +0000
Commit:     Jessica Clarke <jrt...@freebsd.org>
CommitDate: 2021-06-08 17:30:59 +0000

    tip: Fix pointer-vs-integer confusion
    
    Currently IREMOTE assumes that every value is (initially) a pointer to a
    long. This is true for NUMBERs, but false for STRINGs, which are instead
    pointers to pointers, though on ILP32 and LP64 systems these happen to
    have the same representation, but this is still a strict aliasing
    violation, and of course breaks on systems where the representations are
    not the same, such as CHERI. We do not currently have any BOOLs (short,
    curiously) or CHARs used with IREMOTE, though the code should not be
    relying on that.
    
    This removes the unused setaddress macro, and the now-unused address
    macro due to the above issue.
    
    Reviewed by:    imp, kib
    Obtained from:  CheriBSD
    Differential Revision:  https://reviews.freebsd.org/D30697
---
 usr.bin/tip/tip/tip.h   |  2 --
 usr.bin/tip/tip/value.c | 18 ++++++++++++++++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/usr.bin/tip/tip/tip.h b/usr.bin/tip/tip/tip.h
index 6bf94521cdfd..298b08cb6692 100644
--- a/usr.bin/tip/tip/tip.h
+++ b/usr.bin/tip/tip/tip.h
@@ -158,12 +158,10 @@ typedef
 #define        number(v)       ((long)(intptr_t)(v))
 #define        boolean(v)      ((short)(intptr_t)(v))
 #define        character(v)    ((char)(intptr_t)(v))
-#define        address(v)      ((long *)(v))
 
 #define        setnumber(v,n)          do { (v) = (char *)(intptr_t)(n); } 
while (0)
 #define        setboolean(v,n)         do { (v) = (char *)(intptr_t)(n); } 
while (0)
 #define        setcharacter(v,n)       do { (v) = (char *)(intptr_t)(n); } 
while (0)
-#define        setaddress(v,n)         do { (v) = (char *)(n); } while (0)
 
 /*
  * Escape command table definitions --
diff --git a/usr.bin/tip/tip/value.c b/usr.bin/tip/tip/value.c
index a4776b80d35d..9cf1052d3ea2 100644
--- a/usr.bin/tip/tip/value.c
+++ b/usr.bin/tip/tip/value.c
@@ -69,8 +69,22 @@ vinit(void)
                if (p->v_type&ENVIRON)
                        if ((cp = getenv(p->v_name)))
                                p->v_value = cp;
-               if (p->v_type&IREMOTE)
-                       setnumber(p->v_value, *address(p->v_value));
+               if (p->v_type&IREMOTE) {
+                       switch (p->v_type&TMASK) {
+                       case STRING:
+                               p->v_value = *(char **)p->v_value;
+                               break;
+                       case NUMBER:
+                               setnumber(p->v_value, *(long *)p->v_value);
+                               break;
+                       case BOOL:
+                               setboolean(p->v_value, *(short *)p->v_value);
+                               break;
+                       case CHAR:
+                               setcharacter(p->v_value, *(char *)p->v_value);
+                               break;
+                       }
+               }
        }
        /*
         * Read the .tiprc file in the HOME directory
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to