summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-11-03 20:28:03 -0700
committerDongHun Kwak <dh0128.kwak@samsung.com>2017-06-20 16:29:27 +0900
commit09de95b3d44e37484d8788dbf4ce048b908aedb4 (patch)
tree1e10a3c20bd6a045d25715a4496a333cd22efce0
parentfba3796012cffd6686f4beccd907c88efcc7440a (diff)
downloadlibarchive-09de95b3d44e37484d8788dbf4ce048b908aedb4.tar.gz
libarchive-09de95b3d44e37484d8788dbf4ce048b908aedb4.tar.bz2
libarchive-09de95b3d44e37484d8788dbf4ce048b908aedb4.zip
Rebase for libarchive 3.3.1
Change-Id: I2d1fe3ed1a95038ea9554b0266082147b978d177 Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
-rw-r--r--libarchive/archive_write_disk_posix.c223
-rw-r--r--packaging/libarchive.changes7
-rw-r--r--packaging/libarchive.manifest5
-rw-r--r--packaging/libarchive.spec84
4 files changed, 191 insertions, 128 deletions
diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
index 5a01e84..9c000fb 100644
--- a/libarchive/archive_write_disk_posix.c
+++ b/libarchive/archive_write_disk_posix.c
@@ -348,10 +348,7 @@ struct archive_write_disk {
#define HFS_BLOCKS(s) ((s) >> 12)
-static void fsobj_error(int *, struct archive_string *, int, const char *,
- const char *);
-static int check_symlinks_fsobj(char *, int *, struct archive_string *,
- int);
+static int check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags);
static int check_symlinks(struct archive_write_disk *);
static int create_filesystem_object(struct archive_write_disk *);
static struct fixup_entry *current_fixup(struct archive_write_disk *,
@@ -359,8 +356,7 @@ static struct fixup_entry *current_fixup(struct archive_write_disk *,
#if defined(HAVE_FCHDIR) && defined(PATH_MAX)
static void edit_deep_directories(struct archive_write_disk *ad);
#endif
-static int cleanup_pathname_fsobj(char *, int *, struct archive_string *,
- int);
+static int cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags);
static int cleanup_pathname(struct archive_write_disk *);
static int create_dir(struct archive_write_disk *, char *);
static int create_parent_dir(struct archive_write_disk *, char *);
@@ -2068,7 +2064,6 @@ create_filesystem_object(struct archive_write_disk *a)
int r;
/* these for check_symlinks_fsobj */
char *linkname_copy; /* non-const copy of linkname */
- struct stat st;
struct archive_string error_string;
int error_number;
@@ -2084,38 +2079,22 @@ create_filesystem_object(struct archive_write_disk *a)
if (linkname_copy == NULL) {
return (EPERM);
}
- /*
- * TODO: consider using the cleaned-up path as the link
- * target?
- */
- r = cleanup_pathname_fsobj(linkname_copy, &error_number,
- &error_string, a->flags);
+ /* TODO: consider using the cleaned-up path as the link target? */
+ r = cleanup_pathname_fsobj(linkname_copy, &error_number, &error_string, a->flags);
if (r != ARCHIVE_OK) {
- archive_set_error(&a->archive, error_number, "%s",
- error_string.s);
+ archive_set_error(&a->archive, error_number, "%s", error_string.s);
free(linkname_copy);
- archive_string_free(&error_string);
- /*
- * EPERM is more appropriate than error_number for our
- * callers
- */
+ /* EPERM is more appropriate than error_number for our callers */
return (EPERM);
}
- r = check_symlinks_fsobj(linkname_copy, &error_number,
- &error_string, a->flags);
+ r = check_symlinks_fsobj(linkname_copy, &error_number, &error_string, a->flags);
if (r != ARCHIVE_OK) {
- archive_set_error(&a->archive, error_number, "%s",
- error_string.s);
+ archive_set_error(&a->archive, error_number, "%s", error_string.s);
free(linkname_copy);
- archive_string_free(&error_string);
- /*
- * EPERM is more appropriate than error_number for our
- * callers
- */
+ /* EPERM is more appropriate than error_number for our callers */
return (EPERM);
}
free(linkname_copy);
- archive_string_free(&error_string);
r = link(linkname, a->name) ? errno : 0;
/*
* New cpio and pax formats allow hardlink entries
@@ -2482,11 +2461,11 @@ fsobj_error(int *a_eno, struct archive_string *a_estr,
* ARCHIVE_OK if there are none, otherwise puts an error in errmsg.
*/
static int
-check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
- int flags)
+check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags)
{
#if !defined(HAVE_LSTAT)
/* Platform doesn't have lstat, so we can't look for symlinks. */
+ (void)a; /* UNUSED */
(void)path; /* UNUSED */
(void)error_number; /* UNUSED */
(void)error_string; /* UNUSED */
@@ -2516,8 +2495,7 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* - if it's a directory and it's not the last chunk, cd into it
* As we go:
* head points to the current (relative) path
- * tail points to the temporary \0 terminating the segment we're
- * currently examining
+ * tail points to the temporary \0 terminating the segment we're currently examining
* c holds what used to be in *tail
* last is 1 if this is the last tail
*/
@@ -2539,9 +2517,7 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* Exiting the loop with break is okay; continue is not.
*/
while (!last) {
- /*
- * Skip the separator we just consumed, plus any adjacent ones
- */
+ /* Skip the separator we just consumed, plus any adjacent ones */
while (*tail == '/')
++tail;
/* Skip the next path element. */
@@ -2560,20 +2536,19 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
if (errno == ENOENT) {
break;
} else {
- /*
- * Treat any other error as fatal - best to be
- * paranoid here.
- * Note: This effectively disables deep
- * directory support when security checks are
- * enabled. Otherwise, very long pathnames that
- * trigger an error here could evade the
- * sandbox.
- * TODO: We could do better, but it would
- * probably require merging the symlink checks
- * with the deep-directory editing.
- */
- fsobj_error(a_eno, a_estr, errno,
- "Could not stat %s", path);
+ /* Treat any other error as fatal - best to be paranoid here
+ * Note: This effectively disables deep directory
+ * support when security checks are enabled.
+ * Otherwise, very long pathnames that trigger
+ * an error here could evade the sandbox.
+ * TODO: We could do better, but it would probably
+ * require merging the symlink checks with the
+ * deep-directory editing. */
+ if (error_number) *error_number = errno;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Could not stat %s",
+ path);
res = ARCHIVE_FAILED;
break;
}
@@ -2581,8 +2556,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
if (!last) {
if (chdir(head) != 0) {
tail[0] = c;
- fsobj_error(a_eno, a_estr, errno,
- "Could not chdir %s", path);
+ if (error_number) *error_number = errno;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Could not chdir %s",
+ path);
res = (ARCHIVE_FATAL);
break;
}
@@ -2598,9 +2576,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
*/
if (unlink(head)) {
tail[0] = c;
- fsobj_error(a_eno, a_estr, errno,
- "Could not remove symlink %s",
- path);
+ if (error_number) *error_number = errno;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Could not remove symlink %s",
+ path);
res = ARCHIVE_FAILED;
break;
}
@@ -2611,14 +2591,13 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* symlink with another symlink.
*/
tail[0] = c;
- /*
- * FIXME: not sure how important this is to
- * restore
- */
- /*
+ /* FIXME: not sure how important this is to restore
if (!S_ISLNK(path)) {
- fsobj_error(a_eno, a_estr, 0,
- "Removing symlink %s", path);
+ if (error_number) *error_number = 0;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Removing symlink %s",
+ path);
}
*/
/* Symlink gone. No more problem! */
@@ -2628,60 +2607,22 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
/* User asked us to remove problems. */
if (unlink(head) != 0) {
tail[0] = c;
- fsobj_error(a_eno, a_estr, 0,
- "Cannot remove intervening "
- "symlink %s", path);
+ if (error_number) *error_number = 0;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Cannot remove intervening symlink %s",
+ path);
res = ARCHIVE_FAILED;
break;
}
tail[0] = c;
- } else if ((flags &
- ARCHIVE_EXTRACT_SECURE_SYMLINKS) == 0) {
- /*
- * We are not the last element and we want to
- * follow symlinks if they are a directory.
- *
- * This is needed to extract hardlinks over
- * symlinks.
- */
- r = stat(head, &st);
- if (r != 0) {
- tail[0] = c;
- if (errno == ENOENT) {
- break;
- } else {
- fsobj_error(a_eno, a_estr,
- errno,
- "Could not stat %s", path);
- res = (ARCHIVE_FAILED);
- break;
- }
- } else if (S_ISDIR(st.st_mode)) {
- if (chdir(head) != 0) {
- tail[0] = c;
- fsobj_error(a_eno, a_estr,
- errno,
- "Could not chdir %s", path);
- res = (ARCHIVE_FATAL);
- break;
- }
- /*
- * Our view is now from inside
- * this dir:
- */
- head = tail + 1;
- } else {
- tail[0] = c;
- fsobj_error(a_eno, a_estr, 0,
- "Cannot extract through "
- "symlink %s", path);
- res = ARCHIVE_FAILED;
- break;
- }
} else {
tail[0] = c;
- fsobj_error(a_eno, a_estr, 0,
- "Cannot extract through symlink %s", path);
+ if (error_number) *error_number = 0;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Cannot extract through symlink %s",
+ path);
res = ARCHIVE_FAILED;
break;
}
@@ -2698,8 +2639,10 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
if (restore_pwd >= 0) {
r = fchdir(restore_pwd);
if (r != 0) {
- fsobj_error(a_eno, a_estr, errno,
- "chdir() failure", "");
+ if(error_number) *error_number = errno;
+ if(error_string)
+ archive_string_sprintf(error_string,
+ "chdir() failure");
}
close(restore_pwd);
restore_pwd = -1;
@@ -2711,6 +2654,9 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
/* TODO: reintroduce a safe cache here? */
return res;
#endif
+ /* TODO: reintroduce a safe cache here? */
+ return res;
+#endif
}
/*
@@ -2735,6 +2681,26 @@ check_symlinks(struct archive_write_disk *a)
return rc;
}
+/*
+ * Check a->name for symlinks, returning ARCHIVE_OK if its clean, otherwise
+ * calls archive_set_error and returns ARCHIVE_{FATAL,FAILED}
+ */
+static int
+check_symlinks(struct archive_write_disk *a)
+{
+ struct archive_string error_string;
+ int error_number;
+ int rc;
+ archive_string_init(&error_string);
+ rc = check_symlinks_fsobj(a->name, &error_number, &error_string, a->flags);
+ if (rc != ARCHIVE_OK) {
+ archive_set_error(&a->archive, error_number, "%s", error_string.s);
+ }
+ archive_string_free(&error_string);
+ a->pst = NULL; /* to be safe */
+ return rc;
+}
+
#if defined(__CYGWIN__)
/*
@@ -2809,16 +2775,17 @@ cleanup_pathname_win(char *path)
* is set) if the path is absolute.
*/
static int
-cleanup_pathname_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
- int flags)
+cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags)
{
char *dest, *src;
char separator = '\0';
dest = src = path;
if (*src == '\0') {
- fsobj_error(a_eno, a_estr, ARCHIVE_ERRNO_MISC,
- "Invalid empty ", "pathname");
+ if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Invalid empty pathname");
return (ARCHIVE_FAILED);
}
@@ -2828,8 +2795,10 @@ cleanup_pathname_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
/* Skip leading '/'. */
if (*src == '/') {
if (flags & ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS) {
- fsobj_error(a_eno, a_estr, ARCHIVE_ERRNO_MISC,
- "Path is ", "absolute");
+ if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Path is absolute");
return (ARCHIVE_FAILED);
}
@@ -2856,11 +2825,11 @@ cleanup_pathname_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
} else if (src[1] == '.') {
if (src[2] == '/' || src[2] == '\0') {
/* Conditionally warn about '..' */
- if (flags
- & ARCHIVE_EXTRACT_SECURE_NODOTDOT) {
- fsobj_error(a_eno, a_estr,
- ARCHIVE_ERRNO_MISC,
- "Path contains ", "'..'");
+ if (flags & ARCHIVE_EXTRACT_SECURE_NODOTDOT) {
+ if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
+ if (error_string)
+ archive_string_sprintf(error_string,
+ "Path contains '..'");
return (ARCHIVE_FAILED);
}
}
@@ -2913,11 +2882,9 @@ cleanup_pathname(struct archive_write_disk *a)
int error_number;
int rc;
archive_string_init(&error_string);
- rc = cleanup_pathname_fsobj(a->name, &error_number, &error_string,
- a->flags);
+ rc = cleanup_pathname_fsobj(a->name, &error_number, &error_string, a->flags);
if (rc != ARCHIVE_OK) {
- archive_set_error(&a->archive, error_number, "%s",
- error_string.s);
+ archive_set_error(&a->archive, error_number, "%s", error_string.s);
}
archive_string_free(&error_string);
return rc;
diff --git a/packaging/libarchive.changes b/packaging/libarchive.changes
new file mode 100644
index 0000000..b5ddbd3
--- /dev/null
+++ b/packaging/libarchive.changes
@@ -0,0 +1,7 @@
+* Thu Aug 15 2013 Anas Nashif <anas.nashif@intel.com> upstream/3.1.2@a174a74
+- Update to 3.1.2
+- resetting manifest requested domain to floor
+
+* Sat May 11 2013 Anas Nashif <anas.nashif@intel.com> submit/tizen/20130509.180935@3180c2c
+- Set license using %license
+
diff --git a/packaging/libarchive.manifest b/packaging/libarchive.manifest
new file mode 100644
index 0000000..017d22d
--- /dev/null
+++ b/packaging/libarchive.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
diff --git a/packaging/libarchive.spec b/packaging/libarchive.spec
new file mode 100644
index 0000000..6381083
--- /dev/null
+++ b/packaging/libarchive.spec
@@ -0,0 +1,84 @@
+Name: libarchive
+Version: 3.2.1
+Release: 0
+License: BSD-2-Clause
+Summary: A library for handling streaming archive formats
+Url: http://code.google.com/p/libarchive/
+Group: System/Libraries
+Source0: http://libarchive.googlecode.com/files/libarchive-%{version}.tar.gz
+Source1001: libarchive.manifest
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: bison
+BuildRequires: bzip2-devel
+BuildRequires: libacl-devel
+BuildRequires: libattr-devel
+BuildRequires: libtool
+BuildRequires: zlib-devel
+BuildRequires: pkgconfig(ext2fs)
+BuildRequires: pkgconfig(liblzma)
+BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(openssl)
+
+%description
+Libarchive is a programming library that can create and read several different
+streaming archive formats, including most popular tar variants, several cpio
+formats, and both BSD and GNU ar variants. It can also write shar archives and
+read ISO9660 CDROM images and ZIP archives.
+
+%package tools
+Summary: Tools based on %{name}
+Requires: %{name} = %{version}
+
+%description tools
+Tools based on %{name}.
+
+%package devel
+Summary: Development files for %{name}
+Requires: %{name} = %{version}
+
+%description devel
+The %{name}-devel package contains libraries and header files for
+developing applications that use %{name}.
+
+%prep
+%setup -q
+cp %{SOURCE1001} .
+
+
+%build
+%global optflags %{optflags} -D_REENTRANT -pipe
+%configure --disable-static --enable-bsdcpio
+make %{?_smp_mflags}
+
+%install
+%make_install
+
+find %{buildroot} -name cpio.5 -exec rm -f {} ';'
+find %{buildroot} -name mtree.5 -exec rm -f {} ';'
+find %{buildroot} -name tar.5 -exec rm -f {} ';'
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%manifest %{name}.manifest
+%license COPYING
+%defattr(-,root,root,-)
+%{_libdir}/*.so.*
+
+
+%files devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/*
+%{_mandir}/*/*
+%{_libdir}/*.so
+%{_libdir}/pkgconfig/*
+
+%files tools
+%{_bindir}/bsdcpio
+%{_bindir}/bsdtar
+%{_bindir}/bsdcat
+