libtar - Fix extraction of hardlinks to use the prefix
Change-Id: I116982ceed722364406b99fb08bc6943afa0390a
This commit is contained in:
+5
-4
@@ -89,7 +89,7 @@ tar_set_file_perms(TAR *t, char *realname)
|
||||
|
||||
/* switchboard */
|
||||
int
|
||||
tar_extract_file(TAR *t, char *realname)
|
||||
tar_extract_file(TAR *t, char *realname, char *prefix)
|
||||
{
|
||||
int i;
|
||||
char *lnp;
|
||||
@@ -115,7 +115,7 @@ tar_extract_file(TAR *t, char *realname)
|
||||
}
|
||||
else if (TH_ISLNK(t)) {
|
||||
printf("link\n");
|
||||
i = tar_extract_hardlink(t, realname);
|
||||
i = tar_extract_hardlink(t, realname, prefix);
|
||||
}
|
||||
else if (TH_ISSYM(t)) {
|
||||
printf("sym\n");
|
||||
@@ -300,7 +300,7 @@ tar_skip_regfile(TAR *t)
|
||||
|
||||
/* hardlink */
|
||||
int
|
||||
tar_extract_hardlink(TAR * t, char *realname)
|
||||
tar_extract_hardlink(TAR * t, char *realname, char *prefix)
|
||||
{
|
||||
char *filename;
|
||||
char *linktgt = NULL;
|
||||
@@ -325,7 +325,8 @@ tar_extract_hardlink(TAR * t, char *realname)
|
||||
}
|
||||
else
|
||||
linktgt = th_get_linkname(t);
|
||||
|
||||
char *newtgt = strdup(linktgt);
|
||||
sprintf(linktgt, "%s/%s", prefix, newtgt);
|
||||
#ifdef DEBUG
|
||||
printf(" ==> extracting: %s (link to %s)\n", filename, linktgt);
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -218,11 +218,11 @@ void th_finish(TAR *t);
|
||||
/***** extract.c ***********************************************************/
|
||||
|
||||
/* sequentially extract next file from t */
|
||||
int tar_extract_file(TAR *t, char *realname);
|
||||
int tar_extract_file(TAR *t, char *realname, char *prefix);
|
||||
|
||||
/* extract different file types */
|
||||
int tar_extract_dir(TAR *t, char *realname);
|
||||
int tar_extract_hardlink(TAR *t, char *realname);
|
||||
int tar_extract_hardlink(TAR *t, char *realname, char *prefix);
|
||||
int tar_extract_symlink(TAR *t, char *realname);
|
||||
int tar_extract_chardev(TAR *t, char *realname);
|
||||
int tar_extract_blockdev(TAR *t, char *realname);
|
||||
|
||||
+2
-2
@@ -44,7 +44,7 @@ tar_extract_glob(TAR *t, char *globname, char *prefix)
|
||||
snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
|
||||
else
|
||||
strlcpy(buf, filename, sizeof(buf));
|
||||
if (tar_extract_file(t, filename) != 0)
|
||||
if (tar_extract_file(t, filename, prefix) != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ tar_extract_all(TAR *t, char *prefix)
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
if (tar_extract_file(t, buf) != 0)
|
||||
if (tar_extract_file(t, buf, prefix) != 0)
|
||||
return -1;
|
||||
}
|
||||
return (i == 1 ? 0 : -1);
|
||||
|
||||
+2
-2
@@ -122,7 +122,7 @@ int twrpTar::extractTarFork() {
|
||||
int status;
|
||||
pid_t pid;
|
||||
if ((pid = fork()) == -1) {
|
||||
LOGI("create tar failed to fork.\n");
|
||||
LOGI("extract tar failed to fork.\n");
|
||||
return -1;
|
||||
}
|
||||
if (pid == 0) {
|
||||
@@ -144,7 +144,7 @@ int twrpTar::extractTarFork() {
|
||||
else if (WIFEXITED(status) != 0)
|
||||
LOGI("Tar extraction successful\n");
|
||||
else {
|
||||
LOGI("Tar creation failed\n");
|
||||
LOGI("Tar extraction failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user