You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Christian Grobmeier (JIRA)" <ji...@apache.org> on 2009/01/07 08:08:46 UTC

[jira] Commented: (SANDBOX-30) [compress] TarOutputStream.java long file name bug (and fix!)

    [ https://issues.apache.org/jira/browse/SANDBOX-30?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12661467#action_12661467 ] 

Christian Grobmeier commented on SANDBOX-30:
--------------------------------------------

According to:
http://www.gnu.org/software/tar/manual/html_section/Standard.html#SEC166
"The name, linkname, magic, uname, and gname are null-terminated character strings. All other fields are zero-filled octal numbers in ASCII. Each numeric field of width w contains w minus 1 digits, and a null. "

TarArchiveEntry.NAMELEN should not be 100, it should be 99 as Derc pointed out.
See also:
http://www.gnu.org/software/tar/manual/html_section/Formats.html

Format V7: "The maximum length of a file name is limited to 99 characters. "


> [compress] TarOutputStream.java long file name bug (and fix!)
> -------------------------------------------------------------
>
>                 Key: SANDBOX-30
>                 URL: https://issues.apache.org/jira/browse/SANDBOX-30
>             Project: Commons Sandbox
>          Issue Type: Bug
>          Components: Compress
>         Environment: Operating System: other
> Platform: All
>            Reporter: Derc Yamasaki
>
> 'LongLink' entries written to a tar file header by
> TarOutputStream.putNextEntry() specify the wrong file name length and data,
> preventing GNU tar from properly reading long file name entries (in the current
> GNU 'tar' implementation, sometimes one gets lucky and the entry happens to be
> null-terminated so it works anyway).  In particular, the file name
> length--stored as an octal string in each header entry--should include an extra
> byte for the null terminator that must also be written at the end of the file
> name in the header.
> Here's what the code in
> org.apache.commons.compress.tar.TarOutputStream.putNextEntry() currently looks
> like (starting around line 424):
> if( m_longFileMode == LONGFILE_GNU ) {
> // create a TarEntry for the LongLink, the contents
> // of which are the entry's name
>   final TarEntry longLinkEntry =
>        new TarEntry( TarConstants.GNU_LONGLINK,
>                      TarConstants.LF_GNUTYPE_LONGNAME );
>   longLinkEntry.setSize( entry.getName().length() );
>   putNextEntry( longLinkEntry );
>   write( entry.getName().getBytes() );
>   //write( 0 );
>   closeEntry();
> }
> Here's what the code should have been:
> if( m_longFileMode == LONGFILE_GNU ) {
> // create a TarEntry for the LongLink, the contents
> // of which are the entry's name
>   final TarEntry longLinkEntry =
>        new TarEntry( TarConstants.GNU_LONGLINK,
>                      TarConstants.LF_GNUTYPE_LONGNAME );
>   longLinkEntry.setSize( entry.getName().length() + 1 );
>   putNextEntry( longLinkEntry );
>   write( entry.getName().getBytes() );
>   write( 0 );
>   closeEntry();
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.