Security Advisories (11)
CVE-2006-7230 (2007-11-15)

Perl-Compatible Regular Expression (PCRE) library before 7.0 does not properly calculate the amount of memory needed for a compiled regular expression pattern when the (1) -x or (2) -i UTF-8 options change within the pattern, which allows context-dependent attackers to cause a denial of service (PCRE or glibc crash) via crafted regular expressions.

CVE-2007-1660 (2007-11-07)

Perl-Compatible Regular Expression (PCRE) library before 7.0 does not properly calculate sizes for unspecified "multiple forms of character class", which triggers a buffer overflow that allows context-dependent attackers to cause a denial of service (crash) and possibly execute arbitrary code.

CVE-2007-1659 (2007-11-07)

Perl-Compatible Regular Expression (PCRE) library before 7.3 allows context-dependent attackers to cause a denial of service (crash) and possibly execute arbitrary code via regex patterns containing unmatched "\Q\E" sequences with orphan "\E" codes.

CVE-2007-1661 (2007-11-07)

Perl-Compatible Regular Expression (PCRE) library before 7.3 backtracks too far when matching certain input bytes against some regex patterns in non-UTF-8 mode, which allows context-dependent attackers to obtain sensitive information or cause a denial of service (crash), as demonstrated by the "\X?\d" and "\P{L}?\d" patterns.

CVE-2007-1662 (2007-11-07)

Perl-Compatible Regular Expression (PCRE) library before 7.3 reads past the end of the string when searching for unmatched brackets and parentheses, which allows context-dependent attackers to cause a denial of service (crash), possibly involving forward references.

CVE-2007-4766 (2007-11-07)

Multiple integer overflows in Perl-Compatible Regular Expression (PCRE) library before 7.3 allow context-dependent attackers to cause a denial of service (crash) or execute arbitrary code via unspecified escape (backslash) sequences.

CVE-2007-4767 (2007-11-07)

Perl-Compatible Regular Expression (PCRE) library before 7.3 does not properly compute the length of (1) a \p sequence, (2) a \P sequence, or (3) a \P{x} sequence, which allows context-dependent attackers to cause a denial of service (infinite loop or crash) or execute arbitrary code.

CVE-2007-4768 (2007-11-07)

Heap-based buffer overflow in Perl-Compatible Regular Expression (PCRE) library before 7.3 allows context-dependent attackers to execute arbitrary code via a singleton Unicode sequence in a character class in a regex pattern, which is incorrectly optimized.

CVE-2015-2325 (2020-01-14)

The compile_branch function in PCRE before 8.37 allows context-dependent attackers to compile incorrect code, cause a denial of service (out-of-bounds heap read and crash), or possibly have other unspecified impact via a regular expression with a group containing a forward reference repeated a large number of times within a repeated outer group that has a zero minimum quantifier.

CVE-2015-2326 (2020-01-14)

The pcre_compile2 function in PCRE before 8.37 allows context-dependent attackers to compile incorrect code and cause a denial of service (out-of-bounds read) via regular expression with a group containing both a forward referencing subroutine call and a recursive back reference, as demonstrated by "((?+1)(\1))/".

CVE-2015-8382 (2015-12-02)

The match function in pcre_exec.c in PCRE before 8.37 mishandles the /(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ pattern and related patterns involving (*ACCEPT), which allows remote attackers to obtain sensitive information from process memory or cause a denial of service (partially initialized memory and application crash) via a crafted regular expression, as demonstrated by a JavaScript RegExp object encountered by Konqueror, aka ZDI-CAN-2547.

Explanation of How Hangman Operates

sub cls

Returns nothing.

Checks the magical lexical (S02) $?OS against a junction consisting of 3 values. Use the ternary operator ?? :: to decide what system command to use to clear the screen.

sub get_committer_list

err is the low precedence form of // (S03). // is especially useful in its assignment form:

$x //= $y;

To summarize, || and or relate to truth, while // and err relate to definedness.

Next, we use smart matching, ~~, to skip all of the lines from the beginning of the file which have something other than whitespace.

In the loop that follows:

for (=$dict) -> $name {

we use the unary = to perform a readline operation on the filehandle.

sub draw_board

We look over the numbers which are the indices to the elements of the array @letters by forcing the array into numerical context:

for (0 .. (+@letters - 1)) -> $i {

Now, ~= might throw you. You Perl 5'ers are seeing the regexp matching operator in reverse. But what you should be seeing is the Perl 6 string concatenation operator (~) followed by an equal sign. Which therefore means that

$output ~= @letters[$i]; 

translates to:

$output = $output ~ @letters[$i] ;

sub has_won

In the grep here:

@letters == @solution.grep:{ $_ ne '' };

the block beginning with a colon is called an adverbial block. It is equivalent with:

grep(@solutions: { $_ ne '' })

In both cases, @solutions is the invocant, and the block is the argument.

sub guess

The loop construction (S04) is used without the the statement modifiers until or <while> which it can take.

sub draw_if_greater_than

sub draw_if_greater_than (Str $char, Int $num) returns Bool { 
    ($number_of_bad_guesses >= $num) ?? $char :: ' ';
}

The character for blank should be a constant, e.g.:

my ($BLANK) is constant = ' ';

but it is not implemented yet.

sub draw_hangman

Here we see function interpolation, i.e. the use of { ... } blocks inside strings.

## main loop

Note that the list-context x in Perl 5 is now xx in Perl 6:

@solution = ('' xx +@letters);

ERRATA

If you read Apocalypse 03, you will see strong motivation for changing the ternary operator syntax.

AUTHOR

Terrence "metaperl" Brannon

Substantial #perl6 help from

mauke, ninereaons, revdiablo, autrijus, stevan