Skip to content
  • Daniel P. Berrangé's avatar
    b4682a63
    filemon: fix watch IDs to avoid potential wraparound issues · b4682a63
    Daniel P. Berrangé authored
    
    
    Watch IDs are allocated from incrementing a int counter against
    the QFileMonitor object. In very long life QEMU processes with
    a huge amount of USB MTP activity creating & deleting directories
    it is just about conceivable that the int counter can wrap
    around. This would result in incorrect behaviour of the file
    monitor watch APIs due to clashing watch IDs.
    
    Instead of trying to detect this situation, this patch changes
    the way watch IDs are allocated. It is turned into an int64_t
    variable where the high 32 bits are set from the underlying
    inotify "int" ID. This gives an ID that is guaranteed unique
    for the directory as a whole, and we can rely on the kernel
    to enforce this. QFileMonitor then sets the low 32 bits from
    a per-directory counter.
    
    The USB MTP device only sets watches on the directory as a
    whole, not files within, so there is no risk of guest
    triggered wrap around on the low 32 bits.
    
    Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    b4682a63
    filemon: fix watch IDs to avoid potential wraparound issues
    Daniel P. Berrangé authored
    
    
    Watch IDs are allocated from incrementing a int counter against
    the QFileMonitor object. In very long life QEMU processes with
    a huge amount of USB MTP activity creating & deleting directories
    it is just about conceivable that the int counter can wrap
    around. This would result in incorrect behaviour of the file
    monitor watch APIs due to clashing watch IDs.
    
    Instead of trying to detect this situation, this patch changes
    the way watch IDs are allocated. It is turned into an int64_t
    variable where the high 32 bits are set from the underlying
    inotify "int" ID. This gives an ID that is guaranteed unique
    for the directory as a whole, and we can rely on the kernel
    to enforce this. QFileMonitor then sets the low 32 bits from
    a per-directory counter.
    
    The USB MTP device only sets watches on the directory as a
    whole, not files within, so there is no risk of guest
    triggered wrap around on the low 32 bits.
    
    Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
Loading