Schrift
[thread]13159[/thread]

Compress::Zlib - Problem mit gzread / gzreadline

Leser: 2


<< >> 5 Einträge, 1 Seite
eternion
 2009-02-19 20:39
#119003 #119003
User since
2008-11-14
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich muss mit gzip komprimierte Dateien dekomprimieren und will das momentan mit dem Modul Compress::Zlib machen.

Das Ganze funktioniert eigentlich auch ganz gut ... es funktioniert zu gut: Wenn ich dem Skript eine "falsche" Datei vorwerfe, d.h. eine Datei, bei der sich das Unix Kommando "gunzip" beschwert, daß das keine gz-Datei ist, arbeitet gzreadline munter weiter ohne eine Fehlermeldung (return Wert > 0).

Das Fatale daran: ein Zweck der Komprimierung / Dekomprimierung ist eine Integritätsprüfung, d.h. falls ein paar Bytes verändert wurden (so daß gunzip einen Fehler ausgeben würde), muß das Skript eine Fehlermeldung schreiben.

Ich hab grade keinen Zugriff auf die Maschine, aber hier ein paar Eckdaten:
- Die Perlversion ist so ca. 5.8.3
- Das Betriebssystem HP-UX 11....

Any ideas?

Hier noch der Beispielcode, mit dem ich das Problem auf Ubuntu (Version Schlagmichtot: Wo finde ich die Version bei Ubuntu ...) mit Perl 5.8.8 reproduzieren kann:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use warnings;
use strict;

use Compress::Zlib;

my $file = shift;

my $gz = gzopen( $file, "rb" ) or die "gzopen failed";

my $bytesRead;
my $line;
while( $bytesRead = $gz->gzreadline( $line ) )
{
if( $bytesRead < 0 ){ die "Error: $gzerrno"; }
}

$gz->gzclose();
Taulmarill
 2009-02-20 01:24
#119014 #119014
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Die Version findest du z.B. so raus:
Code: (dl )
perl -MCompress::Zlib -le'print $Compress::Zlib::VERSION'


Mit dem Modul kenne ich mich jetzt so spontan nicht wirklich gut aus, aber mir ist aufgefallen, dass du eine etwas andere Fehlerbehandlung implementiert hast als in der Doku: http://search.cpan.org/~pmqs/Compress-Zlib-2.015/lib/Compress/Zlib.pm#Examples
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
eternion
 2009-02-20 09:14
#119019 #119019
User since
2008-11-14
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Meine Fehlerbehandlung unterscheidet sich von dem Beispiel in der Doku nur dadurch, daß ich im Fehlerfall nochmal in die while-Schleife springe. Letztlich geht es ja darum, daß gzreadline im Fehlerfall -1 liefern sollte, und eine Datei, die nicht gzip-komprimiert ist, sollte nach meiner Ansicht ein Fehlerfall sein.

Meine Modulversion ist 1.33. D.h. die Version ist nicht mehr ganz frisch, aber auf meinem Ubuntu zu Hause habe ich das Modul gestern installiert (Version muß ich heute abend nachschauen) und dasselbe Verhalten reproduziert.
nepos
 2009-02-20 09:15
#119020 #119020
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Verlass dich bloss nicht darauf, dass gunzip wirklich sauber fehlerhafte Archive erkennt!
Wenn du wirklich testen willst, ob Dateien unverändert sind, nimm Prüfsummen. Nachdem für MD5 auch schon einige Schwächen bekannt sind, würde ich dir SHA1 empfehlen.
eternion
 2009-02-21 12:10
#119062 #119062
User since
2008-11-14
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
... noch als Nachtrag: Die Modulversion auf Ubuntu ist 2.008.

Die Integrität der Dateien mit MD5 / SHA1 zu prüfen ist natürlich sinnvoller, aber ich hab die Schnittstelle nicht definiert ...
<< >> 5 Einträge, 1 Seite



View all threads created 2009-02-19 20:39.