mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	make sure we never overflow when calculating sleep time
Issue pointed out by Jaroslav Kysela
This commit is contained in:
		
							parent
							
								
									6eaeaea581
								
							
						
					
					
						commit
						d8de5d374e
					
				
					 2 changed files with 28 additions and 4 deletions
				
			
		| 
						 | 
					@ -483,7 +483,13 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) - process_usec;
 | 
					    *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (*sleep_usec > process_usec)
 | 
				
			||||||
 | 
					        *sleep_usec -= process_usec;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        *sleep_usec = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return work_done ? 1 : 0;
 | 
					    return work_done ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -605,7 +611,13 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) - process_usec;
 | 
					    *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (*sleep_usec > process_usec)
 | 
				
			||||||
 | 
					        *sleep_usec -= process_usec;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        *sleep_usec = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return work_done ? 1 : 0;
 | 
					    return work_done ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -465,7 +465,13 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec) - process_usec;
 | 
					    *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (*sleep_usec > process_usec)
 | 
				
			||||||
 | 
					        *sleep_usec -= process_usec;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        *sleep_usec = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return work_done ? 1 : 0;
 | 
					    return work_done ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -575,7 +581,13 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec) - process_usec;
 | 
					    *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (*sleep_usec > process_usec)
 | 
				
			||||||
 | 
					        *sleep_usec -= process_usec;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        *sleep_usec = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return work_done ? 1 : 0;
 | 
					    return work_done ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue