tar: small fix and small optimization
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 25 Nov 2006 23:47:32 +0000 (23:47 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 25 Nov 2006 23:47:32 +0000 (23:47 -0000)
archival/libunarchive/get_header_tar.c
archival/tar.c

index a49081f40487bfb641098691ea84902de9fd4b7f..b785d631d383c1e23d70d9ac96801c72ef6ccde8 100644 (file)
@@ -152,9 +152,11 @@ char get_header_tar(archive_handle_t *archive_handle)
        if (!longname && parse_names) {
                /* we trash mode[0] here, it's ok */
                tar.name[sizeof(tar.name)] = '\0';
-               if (tar.prefix[0])
+               if (tar.prefix[0]) {
+                       /* and padding[0] */
+                       tar.prefix[sizeof(tar.prefix)] = '\0';
                        file_header->name = concat_path_file(tar.prefix, tar.name);
-               else
+               else
                        file_header->name = xstrdup(tar.name);
        }
 
index d875805b067564bf95963f084d6811dee1355a73..c870d53c203b84b715108d82aac33e2e15f127fd 100644 (file)
@@ -150,9 +150,8 @@ static HardLinkInfo *findHardLinkInfo(HardLinkInfo * hlInfo, struct stat *statbu
 
 /* Put an octal string into the specified buffer.
  * The number is zero padded and possibly null terminated.
- * Stores low-order bits only if whole value does not fit.
- * Returns FALSE if that happens.  */
-static int putOctal(char *cp, int len, off_t value)
+ * Stores low-order bits only if whole value does not fit. */
+static void putOctal(char *cp, int len, off_t value)
 {
        char tempBuffer[sizeof(off_t)*3+1];
        char *tempString = tempBuffer;
@@ -169,10 +168,6 @@ static int putOctal(char *cp, int len, off_t value)
 
        /* Copy the string to the field */
        memcpy(cp, tempString, len);
-
-       /* If after shift we have zero - value did not overflow, */
-       /* return 1 (TRUE) then */
-       return (value >> (len*3)) == 0;
 }
 
 /* Write out a tar header for the specified file/directory/whatever */
@@ -239,14 +234,15 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
        } else if (S_ISFIFO(statbuf->st_mode)) {
                header.typeflag = FIFOTYPE;
        } else if (S_ISREG(statbuf->st_mode)) {
-               header.typeflag = REGTYPE;
-               if ((PUT_OCTAL(header.size, statbuf->st_size) == FALSE)
-                && sizeof(statbuf->st_size) > 4
+               if (sizeof(statbuf->st_size) > 4
+                && statbuf->st_size > (off_t)0777777777777LL
                ) {
                        bb_error_msg_and_die("cannot store file '%s' "
                                "of size %"OFF_FMT"d, aborting",
                                fileName, statbuf->st_size);
                }
+               header.typeflag = REGTYPE;
+               PUT_OCTAL(header.size, statbuf->st_size);
        } else {
                bb_error_msg("%s: unknown file type", fileName);
                return FALSE;