Schrift
[thread]13096[/thread]

Fehlermeldung bei use constant mit mod_perl *was:security



<< >> 8 Einträge, 1 Seite
bieber
 2009-02-03 09:19
#118599 #118599
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
Guten Morgen,

ich nutze in meinem CGI-Script, in der index.pl folgendes:

Code (perl): (dl )
1
2
#sicherheitsvariable für zu inkludierende Dateien (dass diese immer über index.pl aufgerufen werden müssen)
use constant SECURITY => "ich bin zur Sicherheit";


so können die von der index.pl aufgerufenen Unterseiten nicht direkt geöffnet werden, weil in jeder Datei überprüft wird, ob die Konstante gesetzt ist

leider erzeugt mir diese Konstante im error-log folgende Meldung
Code: (dl )
1
2
[Tue Feb  3 13:32:10 2009] index.pl: Prototype mismatch: sub ModPerl::ROOT::ModPerl::PerlRunPrefork::oracle_tool_index_2epl::SECURITY: none vs () at /opt/lampp/lib/perl5/5.10.0/constant.pm line 115.
[Tue Feb 3 13:32:10 2009] -e: Constant subroutine ModPerl::ROOT::ModPerl::PerlRunPrefork::oracle_tool_index_2epl::SECURITY redefined at /opt/lampp/lib/perl5/site_perl/5.10.0/i686-linux/ModPerl/Util.pm line 69.


es läuft zwar alles, aber diese Meldung hätte ich gerne weg, kann mir bitte jm. helfen/erklären warum die Meldung kommt?
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
GwenDragon
 2009-02-03 11:29
#118602 #118602
User since
2005-01-17
14538 Artikel
Admin1
[Homepage]
user image
Hast du bitte mal wengstens die Codezeilen für uns, die in der Fehlermeldung stehen?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

bieber
 2009-02-03 11:34
#118603 #118603
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
na klar, ich hatte vermutet, dass das Konstrukt mit der Konstante nicht sauber ist, weswegen ich es nicht gepostet habe, sorry

constant.pm
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
110                     # constants from cv_const_sv are read only. So we have to:
111 Internals::SvREADONLY($scalar, 1);
112 $symtab->{$name} = \$scalar;
113 mro::method_changed_in($pkg);
114 } else {
115 *$full_name = sub () { $scalar };
116 }
117 } elsif (@_) {
118 my @list = @_;
119 *$full_name = sub () { @list };
120 } else {
121 *$full_name = sub () { };
122 }

util.pm
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
 60         if ($$fullname) {
61 my $tmp; # argh, no such thing as an anonymous scalar
62 *{$fullname} = \$tmp;
63 undef $$fullname;
64 }
65 if (defined &$fullname) {
66 no warnings;
67 local $^W = 0;
68 if (defined(my $p = prototype $fullname)) {
69 *{$fullname} = eval "sub ($p) {}";
70 }
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
pq
 2009-02-03 16:43
#118623 #118623
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
dein skript wird bei jedem request neu kompiliert, falls du es geändert hast.
zunächst einmal sollte also diese warnung nur auftauchen, wenn du gerade etwas geändert hast.
dann wird jeder apache-prozess, der gerade dran kommt, das skript kompilieren.
nach einem frischen neustart sollte die warning *nicht* auftreten. (falls doch, ist das nochmal
was anderes.)

da eine konstante im prinzip in perl nichts anderes ist als eine spezielle subroutine, wird die
also beim neukompilieren des skriptes neu definiert. da aber perl nicht komplett neugestartet
wird, meckert es, dass es diese subroutine ja schon kennt.
das kannst du folgendermassen umgehen:
Code (perl): (dl )
1
2
3
4
BEGIN {
  no warnings 'redefined';
  use constant ...;
}
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2009-02-03 16:46
#118624 #118624
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
oder noch ne variante wegen dem "Prototype mismatch": du hast icht zufällig auch noch
im selben skript bzw. package eine eigene subroutine namens SECURITY?
das solltest du tunlichst lassen, weil eine konstante, wie ich oben erwähnt habe, auch eine
subroutine ist.

edit: äh ja, das ist wohl das wahrscheinlichste:
Code: (dl )
1
2
3
4
5
6
7
$ perl -wle'

use constant SECURITY => 23;

sub SECURITY { print "something" }'
Prototype mismatch: sub main::SECURITY () vs none at -e line 5.
Constant subroutine SECURITY redefined at -e line 5.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bieber
 2009-02-03 18:25
#118627 #118627
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
danke für die ausführliche Beschreibung, den prototype mismatch konnte ich so beheben (wieder was gelernt)

der Fehler mit der -e Constant Subroutine kommt nach einem neustart des Apache leider immernoch :(

der Code den du gepostet hast, erzeugt folgenden Fehler:
Code: (dl )
[error] Unknown warnings category 'redefined'

Code (perl): (dl )
1
2
3
4
BEGIN{
        no warnings 'redefined';
   use constant SECURIT => "ich bin zur Sicherheit";
}


spricht eigentlich etwas dagegen, wenn ich statt einer Konstante eine globale Variable mit our definiere? da kommen nämliche keine Meldungen^^
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
pq
 2009-02-03 21:30
#118629 #118629
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bieber+2009-02-03 17:25:14--
der Fehler mit der -e Constant Subroutine kommt nach einem neustart des Apache leider immernoch :(

der Code den du gepostet hast, erzeugt folgenden Fehler:
Code: (dl )
[error] Unknown warnings category 'redefined'

perldoc liegt auf deiner festplatte.
perldoc warnings:
The "warnings" pragma is a replacement for the command line flag "-w", but the pragma is
limited to the enclosing block, while the flag is global. See perllexwarn for more
information.

perldoc perllexwarn:
...
redefine
...



du siehst einerseits, ich habe mich vertippt und andererseits:
du kannst dir die infos auch selbst suchen. man kann mit perldoc
die doku jedes moduls aufrufen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bieber
 2009-02-04 09:16
#118631 #118631
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
*schäm*
"see more information" habe ich ignoriert :(

die Meldung kommt leider aber immernoch... ich werde ne globale Variable nehmen

vielen Dank für die Lehrstunde
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
<< >> 8 Einträge, 1 Seite



View all threads created 2009-02-03 09:19.