git: 6d2648bcaba9 - main - tip: Fix pointer-vs-integer confusion
Jessica Clarke
jrtc27 at FreeBSD.org
Tue Jun 8 17:31:26 UTC 2021
The branch main has been updated by jrtc27:
URL: https://cgit.FreeBSD.org/src/commit/?id=6d2648bcaba9b14e2f5c76680f3e7608e1f125f4
commit 6d2648bcaba9b14e2f5c76680f3e7608e1f125f4
Author: Jessica Clarke <jrtc27 at FreeBSD.org>
AuthorDate: 2021-06-08 17:30:59 +0000
Commit: Jessica Clarke <jrtc27 at 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
More information about the dev-commits-src-main
mailing list