Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Jun 2021 17:31:26 GMT
From:      Jessica Clarke <jrtc27@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 6d2648bcaba9 - main - tip: Fix pointer-vs-integer confusion
Message-ID:  <202106081731.158HVQx5037285@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by jrtc27:

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

commit 6d2648bcaba9b14e2f5c76680f3e7608e1f125f4
Author:     Jessica Clarke <jrtc27@FreeBSD.org>
AuthorDate: 2021-06-08 17:30:59 +0000
Commit:     Jessica Clarke <jrtc27@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202106081731.158HVQx5037285>