]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
cpio/cpio.c: avoid calling strlen() for destdir twice
authorMartin Matuska <martin@matuska.org>
Sun, 1 Mar 2020 23:48:47 +0000 (00:48 +0100)
committerMartin Matuska <martin@matuska.org>
Sun, 1 Mar 2020 23:48:47 +0000 (00:48 +0100)
cpio/cpio.c
cpio/cpio.h

index da5c3986001882efd642376910e06ce2231bd835..c9ffe76bdefc1228b388cce00c9131b00956072a 100644 (file)
@@ -737,7 +737,7 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
         */
        destpath = srcpath;
        if (cpio->destdir) {
-               len = strlen(cpio->destdir) + strlen(srcpath) + 8;
+               len = cpio->destdir_len + strlen(srcpath) + 8;
                if (len >= cpio->pass_destpath_alloc) {
                        while (len >= cpio->pass_destpath_alloc) {
                                cpio->pass_destpath_alloc += 512;
@@ -1228,15 +1228,14 @@ mode_pass(struct cpio *cpio, const char *destdir)
        struct lafe_line_reader *lr;
        const char *p;
        int r;
-       size_t destdir_len;
 
        /* Ensure target dir has a trailing '/' to simplify path surgery. */
-       destdir_len = strlen(destdir);
-       cpio->destdir = malloc(destdir_len + 8);
-       memcpy(cpio->destdir, destdir, destdir_len);
-       if (destdir_len == 0 || destdir[destdir_len - 1] != '/')
-               cpio->destdir[destdir_len++] = '/';
-       cpio->destdir[destdir_len++] = '\0';
+       cpio->destdir_len = strlen(destdir);
+       cpio->destdir = malloc(cpio->destdir_len + 8);
+       memcpy(cpio->destdir, destdir, cpio->destdir_len);
+       if (cpio->destdir_len == 0 || destdir[cpio->destdir_len - 1] != '/')
+               cpio->destdir[cpio->destdir_len++] = '/';
+       cpio->destdir[cpio->destdir_len + 1] = '\0';
 
        cpio->archive = archive_write_disk_new();
        if (cpio->archive == NULL)
index abf3628bfaee8dbf1ad9e546d562775e0282281c..8e7cc5fdd2067b190cc2d2600e2498746de9e608 100644 (file)
@@ -64,6 +64,7 @@ struct cpio {
        int               option_numeric_uid_gid; /* -n */
        int               option_rename; /* -r */
        char             *destdir;
+       size_t            destdir_len;
        size_t            pass_destpath_alloc;
        char             *pass_destpath;
        int               uid_override;