Thread SpreadSheet::WriteExcel Bufferoverflow? (9 answers)
Opened by Tr0Nix at 2008-04-09 18:35

Tr0Nix
 2008-04-10 17:03
#108215 #108215
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Ok, ich habe rausgefunden, wo das Problem liegt. Nur konnte ich es leider noch nicht lösen.

Alles fängt vom Hauptmodul aus an, indem ein "Record" erstellt wird, der an "check" übergeben wird:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub createRecord {
return {
'ID' => 'Record',
'FileName' => shift,
'LineNumber'=> shift,
'LineData' => shift,
'Treatment' => shift,
};
}

# $eins - $vier sind alles normale skalare
check(createRecord($File::Find::name, $eins, $zwei, $drei, $vier));


Innerhalb der Methode check wird der erstellte Record als Referenz gesichert, und hier liegt auch das Problem: Wenn ich hier Dummy-Daten einsetze, kriege ich später keine Schutzverletzung:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub check {
my $record = shift; # <--- Probleme
#my $record = { # <--- so würde alles funktionieren
# 'FileName' => 'c:\blah\fasel2.txt',
# 'ID' => 'Record',
# 'LineData' => 'some text comes here',
# 'LineNumber' => '222',
# 'Treatment' => undef,
#};

# ... etwas Logik dazwischen bis ...
createObject($record, $eins, $zwei, $drei, $vier); # <-- hier gebe ich den bereits erhaltenen Record weiter!
}

createObject funktioniert genau gleich wie auch createRecord weiter oben, also shiften in einen anonymen Hash-Array und return dessen.

Kann mir jemand sagen, was ich hier falsch mache? Perl akzeptiert meinen Code, der Debugger zeigt mir alles korrekt gesetzt an. Aber sobald ich später mit der in createObject erstellten Datenstruktur arbeite, kriege ich eine Speicherschutzverletzung.

Wie oben in den Kommentaren versehen -> wenn ich den $record manuell erstelle läuft alles durch!

Grüsse

View full thread SpreadSheet::WriteExcel Bufferoverflow?