From 3f98870c621d574cbcbb97a6601229cfc1781c7b Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 21 Sep 2018 12:54:56 -0500 Subject: Stack can grow in either direction, so needs signed subtraction and abs(). Both positive and both negative should work, even crossing midpoint (which should never happen on linux) works in two's complement. --- main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 2d6cc2f8..6f8490ff 100644 --- a/main.c +++ b/main.c @@ -156,8 +156,10 @@ void toy_exec_which(struct toy_list *which, char *argv[]) // Compiler writers have decided subtracting char * is undefined behavior, // so convert to integers. (LP64 says sizeof(long)==sizeof(pointer).) + // Signed typecast so stack growth direction is irrelevant: we're measuring + // the distance between two pointers on the same stack, hence the labs(). if (!CFG_TOYBOX_NORECURSE && toys.stacktop) - if (labs((unsigned long)toys.stacktop-(unsigned long)&which)>6000) return; + if (labs((long)toys.stacktop-(long)&which)>6000) return; // Return if we need to re-exec to acquire root via suid bit. if (toys.which && (which->flags&TOYFLAG_ROOTONLY) && toys.wasroot) return; -- cgit v1.2.3