From 09de95b3d44e37484d8788dbf4ce048b908aedb4 Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Sat, 3 Nov 2012 20:28:03 -0700 Subject: [PATCH] Rebase for libarchive 3.3.1 Change-Id: I2d1fe3ed1a95038ea9554b0266082147b978d177 Signed-off-by: DongHun Kwak --- libarchive/archive_write_disk_posix.c | 223 +++++++++++++++------------------- packaging/libarchive.changes | 7 ++ packaging/libarchive.manifest | 5 + packaging/libarchive.spec | 84 +++++++++++++ 4 files changed, 191 insertions(+), 128 deletions(-) create mode 100644 packaging/libarchive.changes create mode 100644 packaging/libarchive.manifest create mode 100644 packaging/libarchive.spec 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 upstream/3.1.2@a174a74 +- Update to 3.1.2 +- resetting manifest requested domain to floor + +* Sat May 11 2013 Anas Nashif 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 @@ + + + + + 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 + -- 2.7.4