This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug (old?) in ZipEntry?


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martin Egholm Nielsen wrote:
>>I think I have found the problem. The "fromzip.zip" archive
>>contains an additional timestamp entry for "ZipDates.java":
>>
>>Current Location part 1 offset 43
>>    extra field 0x5455 (universal time), 4 header and 9 data bytes:
>>    03 90 5d 21 43 f6 5d 21 43                      ..]!C.]!C
>>    extra field 0x7855 (Unix UID/GID), 4 header and 4 data bytes:
>>    20 02 11 29                                      ..)
>>
>>The modification timestamp is "1126260112" which is *seconds*
>>since *the standard UNIX epoch* (i.e., it is *not* a dostime).

[...]

>>Our ZipEntry code (both in libgcj/classpath) treats it as a
>>dostime, leading to the error that you have noticed.

This part is wrong - I misread the code.


>>Please file a bug report against classpath, including a link to
>>this message, if possible.
> 
> 
> Hereby done!
> 
> I'll make a workaround - (x-epoch1)*1000+epoch2 (maybe epoch1=epoch2)...

If I patch GCJ's java/util/zip/ZipEntry.java as shown later, I get:

  ~/tmp/men > mygij ZipDates fromzip.zip
  ZipDates.java   date: 1126260112000     Fri Sep 09 15:31:52 GMT+05:30 2005

  ~/tmp/men > java ZipDates fromzip.zip
  ZipDates.java   date: 1126247512000     Fri Sep 09 12:01:52 IST 2005

Note that GCJ still seems off by 3.5 hours. However, according to the
docs, the given timestamp is seconds from epoch *UTC*, which *does*
translate to the time shown by GCJ. To confuse things further, the ZIP's
"normal" entry for "ZipDates.java" (not the 0x5455 extension entry
shown earlier) says it is the time reported by the JDK. (What is your
timezone? Is it GMT+02:00?)

So either the JDK is showing only the "normal" entry without taking
the extension entry into account or the reference document that I
cited earlier has it wrong (unlikely). Either ways, your original
archiver program (the one that created the "fromzip.zip" archive)
is lying about the modification time in one of the entries.

The patch I was talking of was:
- ------------------------------- 8< -------------------------------
Index: java/util/zip/ZipEntry.java
===================================================================
- --- java/util/zip/ZipEntry.java 2005-09-13 13:40:41.000000000 +0530
+++ java/util/zip/ZipEntry.java 2005-09-13 15:43:40.000000000 +0530
@@ -168,5 +168,5 @@ public class ZipEntry implements ZipCons
     synchronized (cal)
       {
- -       cal.setTime(new Date(time));
+       cal.setTimeInMillis(time);
        dostime = (cal.get(Calendar.YEAR) - 1980 & 0x7f) << 25
          | (cal.get(Calendar.MONTH) + 1) << 21
@@ -337,5 +337,5 @@ public class ZipEntry implements ZipCons
                            | (extra[pos+3] & 0xff) << 16
                            | (extra[pos+4] & 0xff) << 24);
- -                   setTime(time);
+                   setTime(time*1000);
                  }
              }
- ------------------------------- 8< -------------------------------

Ranjit.

- --
Ranjit Mathew      Email: rmathew AT gmail DOT com

Bangalore, INDIA.    Web: http://ranjitmathew.hostingzero.com/


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFDJq8rYb1hx2wRS48RAsgEAJwOuoDs1RVvhj/GO7DRY6LixsPHaACeN+GW
E2iucXRl4mRLmTiHAA9c+zg=
=LpSq
-----END PGP SIGNATURE-----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]