Subject: chmod reads uninitialized variables when fts_info is an error and -v is set, leading to random error messages

From: Michael Debertol <[email-masked]>
Date: Sun, 15 Aug 2021 22:15:58 +0200

Hi,

I noticed that when running chmod with -v on a dangling symlink the 
error message is somewhat random:

 > ln -s file-that-does-not-exist lnk

 > chmod -w lnk -v

 > chmod: cannot operate on dangling symlink 'lnk'

 > failed to change mode of 'lnk' from 0000 (---------) to 7777 (rwsrwsrwt)

 > chmod -w lnk -v

 > chmod: cannot operate on dangling symlink 'lnk'

 > failed to change mode of 'lnk' from 0000 (---------) to 7775 (rwsrwsr-t)

 > chmod -w lnk -v

 > chmod: cannot operate on dangling symlink 'lnk'

 > failed to change mode of 'lnk' from 0000 (---------) to 7774 (rwsrwsr-T)

(note that the value for "to" is different)

This appears to be because in the process_file function, old_mode and 
new_mode are only set when ok is true. When chmod encounters a dangling 
symlink, ok will be false and old_mode/new_mode won't be set. However, 
old_mode and new_mode are still accessed for the invocation of 
describe_change if verbosity is set to high, leading to incorrect error 
messages.

I think a better behavior could be to not print the "from mode to mode" 
part of the error message if the file could not be accessed, since it is 
meaningless anyways.

Have a nice day,

Michael