2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 09:57:41 +00:00

iolog_adjust_delay: avoid division by zero

Fixes a problem in sudoreplay where a speed factor of 0 or less
would result in a negative delay value that caused a hang during
playback.  Bug #1078.
This commit is contained in:
Todd C. Miller 2025-08-21 12:40:28 -06:00
parent 2df8f2ca9e
commit 9263e19f7e
2 changed files with 8 additions and 3 deletions

View File

@ -55,6 +55,12 @@ iolog_adjust_delay(struct timespec *delay, struct timespec *max_delay,
{ {
debug_decl(iolog_adjust_delay, SUDO_DEBUG_UTIL); debug_decl(iolog_adjust_delay, SUDO_DEBUG_UTIL);
/* Avoid division by zero or negative delays. */
if (scale_factor <= 0.0) {
sudo_timespecclear(delay);
debug_return;
}
if (scale_factor != 1.0) { if (scale_factor != 1.0) {
/* Order is important: we don't want to double the remainder. */ /* Order is important: we don't want to double the remainder. */
const double seconds = (double)delay->tv_sec / scale_factor; const double seconds = (double)delay->tv_sec / scale_factor;

View File

@ -287,7 +287,7 @@ main(int argc, char *argv[])
case 's': case 's':
errno = 0; errno = 0;
speed_factor = strtod(optarg, &ep); speed_factor = strtod(optarg, &ep);
if (*ep != '\0' || errno != 0) if (*ep != '\0' || errno != 0 || speed_factor < 0.0)
sudo_fatalx(U_("invalid speed factor: %s"), optarg); sudo_fatalx(U_("invalid speed factor: %s"), optarg);
break; break;
case 'V': case 'V':
@ -795,8 +795,7 @@ get_timing_record(struct replay_closure *closure)
if (nodelay) { if (nodelay) {
/* Already waited, fire immediately. */ /* Already waited, fire immediately. */
timing->delay.tv_sec = 0; sudo_timespecclear(&timing->delay);
timing->delay.tv_nsec = 0;
} else { } else {
/* Adjust delay using speed factor and max_delay. */ /* Adjust delay using speed factor and max_delay. */
iolog_adjust_delay(&timing->delay, closure->max_delay, iolog_adjust_delay(&timing->delay, closure->max_delay,