Skip to content
  • Nicolai Stange's avatar
    debugfs: full_proxy_open(): free proxy on ->open() failure · b10e3e90
    Nicolai Stange authored
    Debugfs' full_proxy_open(), the ->open() installed at all inodes created
    through debugfs_create_file(),
    - grabs a reference to the original struct file_operations instance passed
      to debugfs_create_file(),
    - dynamically allocates a proxy struct file_operations instance wrapping
      the original
    - and installs this at the file's ->f_op.
    
    Afterwards, it calls the original ->open() and passes its return value back
    to the VFS layer.
    
    Now, if that return value indicates failure, the VFS layer won't ever call
    ->release() and thus, neither the reference to the original file_operations
    nor the memory for the proxy file_operations will get released, i.e. both
    are leaked.
    
    Upon failure of the original fops' ->open(), undo the proxy installation.
    That is:
    - Set the struct file ->f_op to what it had been when full_proxy_open()
      was entered.
    - Drop the reference to the original file_operations.
    - Free the memory holding the proxy file_operations.
    
    Fixes: 49d200de
    
     ("debugfs: prevent access to removed files' private
                          data")
    Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b10e3e90