Discussion:
Inline-0.52_01 released to CPAN
s***@public.gmane.org
2013-04-11 06:37:59 UTC
Permalink
Hi,

Inline-0.52_01 has been uploaded to CPAN.
It contains just one change from Inline-0.52.

In Inline.pm's sub read_DATA() I've changed:

@{$DATA{$pkg}} = split /(?m)(__\S+?__\n)/, $data
to:
@{$DATA{$pkg}} = split /(?m)^[ \t]{0,}(__\S+?__\n)/, $data;

The bug that this addresses was discovered by Chris Nighswonger in some
Inline::Python code.
It can also affect Inline::C/Inline::CPP - but only if somewhat unorthodox
coding styles are adopted. (Not sure what other Inline::* modules might be
affected.)

By way of example, upto and including Inline-0.52 the following Inline::C
script would *not* compile:

##################
use Inline C => 'DATA';

foo();

__DATA__
__C__

#define __symbol__ 42

void foo() {
printf("%d: %s\n", __symbol__
, "Hello\n");
}

##################

As of Inline-0.52_01 it will work as intended.

Note that this change has the potential to break existing (albeit
ill-advisedly constructed) code.
For example, upto and including Inline-0.52 the following inline::C script
*would* compile (and run) fine, though it should probably have not:

##################
use Inline C => 'DATA';

foo();

__DATA__
some arbitrary garbage !@#$%^&*()_+++ __C__

#define __symbol__ 42

void foo() {
printf("%d: %s\n", __symbol__, "Hello\n");
}

##################

As of Inline-0.52_01 it will *not* compile. (And I think that is a step in
the right direction.)

Finally, this is not a complete fix. Even as of Inline-0.52_01 the following
Inline::C script will *not* compile (though it's valid C code):

##################
use Inline C => 'DATA';

foo();

__DATA__
__C__

#define __symbol__ 42

void foo() {
printf("%d: %s\n",
__symbol__
, "Hello\n");
}

##################

For this particular Inline::C script, '__symbol__' is still deemed by
0.52_01 to be a marker (as is also the case with 0.52 and earlier).

AFAIK the bug affects only those scripts that place their code under a
__DATA__ or __END__ marker.
If you do that and you have, in your code, some symbol (such as __symbol__
in the above examples, that's *not* a marker) that begins and ends with a
double underscore, then you need to ensure that whenever that symbol appears
on a line by itself, it is not immediately followed by a newline.
If the symbol never appears on a line by itself then (as of 0.52_01) you
have nothing to worry about.
If the symbol is never followed immediately by a newline, then you have
nothing to worry about.
If you don't place your code under a __DATA__ or __END__ marker then you
have nothing to worry about.
If you don't have symbols in your code that begin and end with double
underscores, then you have nothing to worry about.

So ... the conditions under which you can be bitten by this bug are quite
limited.

I guess we could make them even more limited ... I don't see any need to
rush into doing that. (Last thing I want to do is create breakage on a grand
scale.)

Thanks to Chris Nighswonger and Stefan Seifert for their assistance with
this.

It would be good if people could check that this change doesn't break other
Inline::* module test suites. (I've checked Inline-CPP-0.42, but no others.)

Cheers,
Rob

Loading...