This file is indexed.

/usr/share/perl5/pgBackRest/Common/Exit.pm is in pgbackrest 1.25-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
####################################################################################################################################
# COMMON EXIT MODULE
####################################################################################################################################
package pgBackRest::Common::Exit;

use strict;
use warnings FATAL => qw(all);
use Carp qw(confess);
use English '-no_match_vars';

use Exporter qw(import);
    our @EXPORT = qw();
use File::Basename qw(dirname);

use pgBackRest::Common::Exception;
use pgBackRest::Common::Lock;
use pgBackRest::Common::Log;
use pgBackRest::Config::Config;
use pgBackRest::Protocol::Helper;

####################################################################################################################################
# Signal constants
####################################################################################################################################
use constant SIGNAL_HUP                                             => 'HUP';
use constant SIGNAL_INT                                             => 'INT';
use constant SIGNAL_TERM                                            => 'TERM';

####################################################################################################################################
# Hook important signals into exitSafe function
####################################################################################################################################
$SIG{&SIGNAL_HUP} = sub {exitSafe(ERROR_TERM, undef, SIGNAL_HUP)};
$SIG{&SIGNAL_INT} = sub {exitSafe(ERROR_TERM, undef, SIGNAL_INT)};
$SIG{&SIGNAL_TERM} = sub {exitSafe(ERROR_TERM, undef, SIGNAL_TERM)};

####################################################################################################################################
# exitSafe
#
# Terminate all remotes and release locks.
####################################################################################################################################
sub exitSafe
{
    # Assign function parameters, defaults, and log debug info
    my
    (
        $strOperation,
        $iExitCode,
        $oException,
        $strSignal,
    ) =
        logDebugParam
        (
            __PACKAGE__ . '::exitSafe', \@_,
            {name => 'iExitCode', required => false},
            {name => 'oException', required => false},
            {name => 'strSignal', required => false},
        );

    # Reset logging in case it was disabled when the exception/signal occurred
    configLogging();

    # Close the remote
    protocolDestroy(undef, undef, defined($iExitCode) && ($iExitCode == 0 || $iExitCode == 1));

    # Don't fail if the lock can't be released
    eval
    {
        lockRelease(false);
    }
    # uncoverable branch false - this eval exists only to suppress lock errors so original error will not be lost
    or do {};

    # If exit code is not defined then try to get it from the exception
    if (!defined($iExitCode))
    {
        # If a backrest exception
        if (isException(\$oException))
        {
            $iExitCode = $oException->code();
            logException($oException);
        }
        else
        {
            $iExitCode = ERROR_UNHANDLED;

            &log(
                ERROR,
                'process terminated due to an unhandled exception' .
                    (defined($oException) ? ":\n${oException}" : ': [exception not defined]'),
                $iExitCode);
        }
    }
    elsif ($iExitCode == ERROR_TERM)
    {
        &log(ERROR, "terminated on signal [SIG${strSignal}]", ERROR_TERM);
    }

    # Log command end
    commandEnd(defined($oException) || $iExitCode == ERROR_TERM ? $iExitCode : undef, $strSignal);

    # Log return values if any
    logDebugReturn
    (
        $strOperation,
        {name => 'iExitCode', value => $iExitCode}
    );

    exit $iExitCode;
}

push @EXPORT, qw(exitSafe);

1;