[Bug 815] New: SEGFAULT in archival/tar.c found

bugzilla at busybox.net bugzilla at busybox.net
Thu Dec 17 21:33:10 UTC 2009


https://bugs.busybox.net/show_bug.cgi?id=815

              Host: powerpc-gnu-linux-uclibc
            Target: powerpc-gnu-linux-uclibc
             Build: powerpc-gnu-linux-uclibc
           Summary: SEGFAULT in archival/tar.c found
           Product: Busybox
           Version: 1.16.x
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: trivial
          Priority: P2
         Component: Standard Compliance
        AssignedTo: unassigned at busybox.net
        ReportedBy: dougmencken at gmail.com
                CC: busybox-cvs at busybox.net
   Estimated Hours: 0.0


How to reproduce:
just 'tar' (yep, it must be busybox's tar)

What you'll get:
a segfault

The fix is trivial; all you need is *not* to argv[1][0] int tar_main(int argc,
char **argv) w/o any knowledge of number of arguments passed.

The working version is:

int tar_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int tar_main(int argc, char **argv)
{
        char FAST_FUNC (*get_header_ptr)(archive_handle_t *) = get_header_tar;
        archive_handle_t *tar_handle;
        char *base_dir = NULL;
        const char *tar_filename = "-";
        unsigned opt;
        int verboseFlag = 0;
#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM
        llist_t *excludes = NULL;
#endif

        /* Initialise default values */
        tar_handle = init_handle();
        tar_handle->ah_flags = ARCHIVE_CREATE_LEADING_DIRS
                             | ARCHIVE_RESTORE_DATE
                             | ARCHIVE_UNLINK_OLD;

        /* Apparently only root's tar preserves perms (see bug 3844) */
        if (getuid() != 0)
                tar_handle->ah_flags |= ARCHIVE_DONT_RESTORE_PERM;

        /* Prepend '-' to the first argument if required */
        opt_complementary = "--:" // first arg is options
                "tt:vv:" // count -t,-v
                "?:" // bail out with usage instead of error return
                "X::T::" // cumulative lists
#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM
                "\xff::" // cumulative lists for --exclude
#endif
                IF_FEATURE_TAR_CREATE("c:") "t:x:" // at least one of these is
reqd
                IF_FEATURE_TAR_CREATE("c--tx:t--cx:x--ct") // mutually
exclusive
                IF_NOT_FEATURE_TAR_CREATE("t--x:x--t"); // mutually exclusive
#if ENABLE_FEATURE_TAR_LONG_OPTIONS
        applet_long_options = tar_longopts;
#endif
#if ENABLE_DESKTOP
        if ((argc > 1) && (argv[1][0] != '-')) {
                /* Compat:
                 * 1st argument without dash handles options with parameters


-- 
Configure bugmail: https://bugs.busybox.net/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.


More information about the busybox-cvs mailing list