Introduction
Introduction Statistics Contact Development Disclaimer Help
util: trim() fix for UB on pointer arithmetic - sic - simple irc client
git clone git://git.suckless.org/sic
Log
Files
Refs
README
LICENSE
---
commit 058547e707e961e0cb7f8af4877f1b92f4c6d888
parent 68c1c4e5110ed6a30cd3da0ae0c2ab0753e02cbb
Author: Hiltjo Posthuma <[email protected]>
Date: Thu, 6 May 2021 12:18:21 +0200
util: trim() fix for UB on pointer arithmetic
Follow-up fix on commit df4c0611366bf361fa263fbc57009cbe68456855
"
While it is true reversing the condition solves a single-byte read at
one before s, there is a second instance of UB.
Having a pointer to one before an object is in of itself UB in C, it's
on the side of language lawyering, but it's UB.
I add here a quote from a C standard draft:
> When an expression that has integer type is added to or subtracted
> from a pointer, the result has the type of the pointer operand.
> If both the pointer operand and the result point to elements of the
> same array object, or one past the last element of the array object,
> the evaluation shall not produce an overflow; otherwise, the
> behavior is undefined.
Taken from: http://www.iso-9899.info/n1570.html#6.5.6p8
"
Thanks Guilherme Janczak <[email protected]>
Diffstat:
M util.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
---
diff --git a/util.c b/util.c
@@ -60,8 +60,7 @@ static void
trim(char *s) {
char *e;
- e = s + strlen(s) - 1;
- while(e > s && isspace((unsigned char)*e))
- e--;
- *(e + 1) = '\0';
+ for (e = s + strlen(s); e > s && isspace((unsigned char)*(e - 1)); e--)
+ ;
+ *e = '\0';
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.