Skip to content

Commit a20556f

Browse files
nabijaczleweliaafeijoo-suse
authored andcommitted
perf(dracut-install): don't strdup() excessively for dracut_install()
1 parent e7ed833 commit a20556f

File tree

1 file changed

+18
-23
lines changed

1 file changed

+18
-23
lines changed

src/install/dracut-install.c

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -356,23 +356,23 @@ static int library_install(const char *src, const char *lib)
356356
char *q, *clibdir;
357357
int r, ret = 0;
358358

359-
p = strdup(lib);
360-
361-
r = dracut_install(p, p, false, false, true);
359+
r = dracut_install(lib, lib, false, false, true);
362360
if (r != 0)
363-
log_error("ERROR: failed to install '%s' for '%s'", p, src);
361+
log_error("ERROR: failed to install '%s' for '%s'", lib, src);
364362
else
365-
log_debug("Lib install: '%s'", p);
363+
log_debug("Lib install: '%s'", lib);
366364
ret += r;
367365

368366
/* also install lib.so for lib.so.* files */
369-
q = strstr(p, ".so.");
367+
q = strstr(lib, ".so.");
370368
if (q) {
371-
q[3] = '\0';
369+
p = strndup(lib, q - lib + 3);
372370

373371
/* ignore errors for base lib symlink */
374372
if (dracut_install(p, p, false, false, true) == 0)
375373
log_debug("Lib install: '%s'", p);
374+
375+
free(p);
376376
}
377377

378378
/* Also try to install the same library from one directory above
@@ -384,7 +384,6 @@ static int library_install(const char *src, const char *lib)
384384
libc.so.6 (libc6,64bit, OS ABI: Linux 2.6.32) => /lib64/libc.so.6
385385
*/
386386

387-
free(p);
388387
p = strdup(lib);
389388

390389
pdir = dirname_malloc(p);
@@ -752,25 +751,24 @@ static int dracut_install(const char *orig_src, const char *orig_dst, bool isdir
752751
mode_t src_mode = 0;
753752
bool dst_exists = true;
754753
char *i = NULL;
755-
_cleanup_free_ char *src;
756-
_cleanup_free_ char *dst;
754+
const char *src, *dst;
757755

758756
if (sysrootdirlen) {
759757
if (strncmp(orig_src, sysrootdir, sysrootdirlen) == 0) {
760-
src = strdup(orig_src + sysrootdirlen);
758+
src = orig_src + sysrootdirlen;
761759
fullsrcpath = strdup(orig_src);
762760
} else {
763-
src = strdup(orig_src);
761+
src = orig_src;
764762
_asprintf(&fullsrcpath, "%s%s", sysrootdir, src);
765763
}
766764
if (strncmp(orig_dst, sysrootdir, sysrootdirlen) == 0)
767-
dst = strdup(orig_dst + sysrootdirlen);
765+
dst = orig_dst + sysrootdirlen;
768766
else
769-
dst = strdup(orig_dst);
767+
dst = orig_dst;
770768
} else {
771-
src = strdup(orig_src);
769+
src = orig_src;
772770
fullsrcpath = strdup(src);
773-
dst = strdup(orig_dst);
771+
dst = orig_dst;
774772
}
775773

776774
log_debug("dracut_install('%s', '%s', %d, %d, %d)", src, dst, isdir, resolvedeps, hashdst);
@@ -1335,8 +1333,7 @@ static int install_all(int argc, char **argv)
13351333

13361334
} else {
13371335
if (strchr(argv[i], '*') == NULL) {
1338-
_cleanup_free_ char *dest = strdup(argv[i]);
1339-
ret = dracut_install(argv[i], dest, arg_createdir, arg_resolvedeps, true);
1336+
ret = dracut_install(argv[i], argv[i], arg_createdir, arg_resolvedeps, true);
13401337
} else {
13411338
_cleanup_free_ char *realsrc = NULL;
13421339
_cleanup_globfree_ glob_t globbuf;
@@ -1348,11 +1345,9 @@ static int install_all(int argc, char **argv)
13481345
size_t j;
13491346

13501347
for (j = 0; j < globbuf.gl_pathc; j++) {
1351-
char *dest = strdup(globbuf.gl_pathv[j] + sysrootdirlen);
1352-
ret |=
1353-
dracut_install(globbuf.gl_pathv[j] + sysrootdirlen, dest,
1354-
arg_createdir, arg_resolvedeps, true);
1355-
free(dest);
1348+
ret |= dracut_install(globbuf.gl_pathv[j] + sysrootdirlen,
1349+
globbuf.gl_pathv[j] + sysrootdirlen,
1350+
arg_createdir, arg_resolvedeps, true);
13561351
}
13571352
}
13581353
}

0 commit comments

Comments
 (0)