• Kir Kolyshkin's avatar
    criu/filesystems.c: refactor binfmt_misc_restore_bme · 02c3605c
    Kir Kolyshkin authored
    The following error is emitted by clang:
    
    >   CC       criu/filesystems.o
    > criu/filesystems.c:280:13: error: variable 'ret' is used uninitialized
    >    whenever 'if' condition is false [-Werror,-Wsometimes-uninitialized]
    >         } else if (bme->extension) {
    >                    ^~~~~~~~~~~~~~
    > criu/filesystems.c:287:6: note: uninitialized use occurs here
    >         if (ret > 0) {
    >             ^~~
    > criu/filesystems.c:280:9: note: remove the 'if' if its condition is
    >    always true
    >         } else if (bme->extension) {
    >                ^~~~~~~~~~~~~~~~~~~~
    > criu/filesystems.c:272:9: note: initialize the variable 'ret' to silence
    >    this warning
    >         int ret;
    >                ^
    >                 = 0
    > 1 error generated.
    
    This code was a result of commit 398e7d3.
    
    If we look closely, this is a false alarm, as "else if (bme->extension)"
    is always true as it was checked before. But this is not very clear,
    and the issue with clangs still needs to be fixed.
    
    There are many ways to do so:
    
    1. Initialize ret to 0. This is what initial version of this patch did.
    
    2. Remove the always-true condition, like this:
    
    	-	} else if (bme->extension) {
    	+	} else {
    
    In my opinion this would hurt readability.
    
    3. Change the code flow, improving readability at the same time.
    
    I believe that #3 is what this patch does. In addition, it fixes
    handling of a few corner cases:
    
    - an overflow in snprintf();
    - a case when bme->name is NULL (as it is used for strlen/snprintf,
      there is a potential for SIGSEGV);
    - a case of ret == 0 (currently there is no code flow that
      results in ret being 0, so it's just for the future).
    
    [v2: use linux kernel style for 'else' after a block]
    [xemul: Fix // comments ]
    
    Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
    Signed-off-by: 's avatarKir Kolyshkin <kir@openvz.org>
    Acked-by: 's avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
    02c3605c
Name
Last commit
Last update
Documentation Loading commit data...
contrib Loading commit data...
coredump Loading commit data...
crit Loading commit data...
criu Loading commit data...
images Loading commit data...
lib Loading commit data...
scripts Loading commit data...
test Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
INSTALL.md Loading commit data...
Makefile Loading commit data...
Makefile.install Loading commit data...
Makefile.versions Loading commit data...
README.md Loading commit data...