mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-07-26 10:39:01 +02:00
sort: fix unlikely int overflow with -r
* src/sort.c (keycompare, compare): Don’t overflow if -r is specified and a comparison function returns INT_MIN, as this causes the comparison to have undefined behavior (typically the reverse of correct). glibc memcmp on s390x reportedly returns INT_MIN in some cases, so this is not a purely academic issue.
This commit is contained in:
+6
-2
@@ -2794,7 +2794,9 @@ keycompare (struct line const *a, struct line const *b)
|
||||
}
|
||||
}
|
||||
|
||||
return key->reverse ? -diff : diff;
|
||||
if (key->reverse)
|
||||
diff = diff < 0 ? -1 : -diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
/* Compare two lines A and B, returning negative, zero, or positive
|
||||
@@ -2839,7 +2841,9 @@ compare (struct line const *a, struct line const *b)
|
||||
diff = (alen > blen) - (alen < blen);
|
||||
}
|
||||
|
||||
return reverse ? -diff : diff;
|
||||
if (reverse)
|
||||
diff = diff < 0 ? 1 : -diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
/* Write LINE to output stream FP; the output file's name is
|
||||
|
||||
Reference in New Issue
Block a user