#define HFS_BLOCKS(s) ((s) >> 12)
-static int check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags);
+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 *, const char *pathname);
+static struct fixup_entry *current_fixup(struct archive_write_disk *,
+ const char *pathname);
#if defined(HAVE_FCHDIR) && defined(PATH_MAX)
static void edit_deep_directories(struct archive_write_disk *ad);
#endif
-static int cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *error_string, int flags);
+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 *);
static int _archive_write_disk_close(struct archive *);
static int _archive_write_disk_free(struct archive *);
-static int _archive_write_disk_header(struct archive *, struct archive_entry *);
+static int _archive_write_disk_header(struct archive *,
+ struct archive_entry *);
static int64_t _archive_write_disk_filter_bytes(struct archive *, int);
static int _archive_write_disk_finish_entry(struct archive *);
-static ssize_t _archive_write_disk_data(struct archive *, const void *, size_t);
-static ssize_t _archive_write_disk_data_block(struct archive *, const void *, size_t, int64_t);
+static ssize_t _archive_write_disk_data(struct archive *, const void *,
+ size_t);
+static ssize_t _archive_write_disk_data_block(struct archive *, const void *,
+ size_t, int64_t);
static int
lazy_stat(struct archive_write_disk *a)
if (a->restore_pwd >= 0) {
r = fchdir(a->restore_pwd);
if (r != 0) {
- archive_set_error(&a->archive, errno, "chdir() failure");
+ archive_set_error(&a->archive, errno,
+ "chdir() failure");
ret = ARCHIVE_FATAL;
}
close(a->restore_pwd);
}
if (archive_entry_birthtime_is_set(entry)) {
fe->birthtime = archive_entry_birthtime(entry);
- fe->birthtime_nanos = archive_entry_birthtime_nsec(entry);
+ fe->birthtime_nanos = archive_entry_birthtime_nsec(
+ entry);
} else {
/* If birthtime is unset, use mtime. */
fe->birthtime = fe->mtime;
return (ARCHIVE_FATAL);
fe->mac_metadata = malloc(metadata_size);
if (fe->mac_metadata != NULL) {
- memcpy(fe->mac_metadata, metadata, metadata_size);
+ memcpy(fe->mac_metadata, metadata,
+ metadata_size);
fe->mac_metadata_size = metadata_size;
fe->fixup |= TODO_MAC_METADATA;
}
return (r);
if ((size_t)r < size) {
archive_set_error(&a->archive, 0,
- "Too much data: Truncating file at %ju bytes", (uintmax_t)a->filesize);
+ "Too much data: Truncating file at %ju bytes",
+ (uintmax_t)a->filesize);
return (ARCHIVE_WARN);
}
#if ARCHIVE_VERSION_NUMBER < 3999000
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);
- /* 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);
- /* 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);
a->todo = 0;
a->deferred = 0;
} else if (r == 0 && a->filesize > 0) {
- a->fd = open(a->name,
- O_WRONLY | O_TRUNC | O_BINARY | O_CLOEXEC | O_NOFOLLOW);
+ a->fd = open(a->name, O_WRONLY | O_TRUNC | O_BINARY
+ | O_CLOEXEC | O_NOFOLLOW);
__archive_ensure_cloexec_flag(a->fd);
if (a->fd < 0)
r = errno;
* ARCHIVE_OK if there are none, otherwise puts an error in errmsg.
*/
static int
-check_symlinks_fsobj(char *path, int *error_number, struct archive_string *error_string, 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. */
* - 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
*/
* 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. */
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. */
- if (error_number) *error_number = errno;
- if (error_string)
+ /*
+ * 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);
+ "Could not stat %s",
+ path);
+ }
res = ARCHIVE_FAILED;
break;
}
if (!last) {
if (chdir(head) != 0) {
tail[0] = c;
- if (error_number) *error_number = errno;
- if (error_string)
- archive_string_sprintf(error_string,
- "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;
}
*/
if (unlink(head)) {
tail[0] = c;
- if (error_number) *error_number = errno;
+ if (error_number)
+ *error_number = errno;
if (error_string)
- archive_string_sprintf(error_string,
- "Could not remove symlink %s",
- path);
+ archive_string_sprintf(
+ error_string,
+ "Could not remove "
+ "symlink %s", path);
res = ARCHIVE_FAILED;
break;
}
* 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)) {
- if (error_number) *error_number = 0;
- if (error_string)
- archive_string_sprintf(error_string,
- "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! */
/* User asked us to remove problems. */
if (unlink(head) != 0) {
tail[0] = c;
- if (error_number) *error_number = 0;
- if (error_string)
- archive_string_sprintf(error_string,
- "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 {
tail[0] = c;
- if (error_number) *error_number = 0;
- if (error_string)
+ if (error_number)
+ *error_number = 0;
+ if (error_string) {
archive_string_sprintf(error_string,
- "Cannot extract through symlink %s",
- path);
+ "Cannot extract through "
+ "symlink %s", path);
+ }
res = ARCHIVE_FAILED;
break;
}
if (restore_pwd >= 0) {
r = fchdir(restore_pwd);
if (r != 0) {
- if(error_number) *error_number = errno;
- if(error_string)
+ if (error_number)
+ *error_number = errno;
+ if (error_string) {
archive_string_sprintf(error_string,
"chdir() failure");
+ }
}
close(restore_pwd);
restore_pwd = -1;
int error_number;
int rc;
archive_string_init(&error_string);
- rc = check_symlinks_fsobj(a->name, &error_number, &error_string, a->flags);
+ 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_set_error(&a->archive, error_number, "%s",
+ error_string.s);
}
archive_string_free(&error_string);
a->pst = NULL; /* to be safe */
* is set) if the path is absolute.
*/
static int
-cleanup_pathname_fsobj(char *path, int *error_number, struct archive_string *error_string, 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') {
- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
- if (error_string)
- archive_string_sprintf(error_string,
+ if (error_number)
+ *error_number = ARCHIVE_ERRNO_MISC;
+ if (error_string) {
+ archive_string_sprintf(error_string,
"Invalid empty pathname");
+ }
return (ARCHIVE_FAILED);
}
/* Skip leading '/'. */
if (*src == '/') {
if (flags & ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS) {
- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
- if (error_string)
- archive_string_sprintf(error_string,
+ if (error_number)
+ *error_number = ARCHIVE_ERRNO_MISC;
+ if (error_string) {
+ archive_string_sprintf(error_string,
"Path is absolute");
+ }
return (ARCHIVE_FAILED);
}
} else if (src[1] == '.') {
if (src[2] == '/' || src[2] == '\0') {
/* Conditionally warn about '..' */
- if (flags & ARCHIVE_EXTRACT_SECURE_NODOTDOT) {
- if (error_number) *error_number = ARCHIVE_ERRNO_MISC;
- if (error_string)
- archive_string_sprintf(error_string,
- "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);
}
}
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;
}
} else if (errno != ENOENT && errno != ENOTDIR) {
/* Stat failed? */
- archive_set_error(&a->archive, errno, "Can't test directory '%s'", path);
+ archive_set_error(&a->archive, errno,
+ "Can't test directory '%s'", path);
return (ARCHIVE_FAILED);
} else if (slash != NULL) {
*slash = '\0';
nochange_flags |= EXT2_IMMUTABLE_FL;
#endif
- return (set_fflags_platform(a, a->fd, a->name, mode, 0, nochange_flags));
+ return (set_fflags_platform(a, a->fd, a->name, mode, 0,
+ nochange_flags));
}
if (errno == ENOTSUP || errno == ENOSYS) {
if (!warning_done) {
warning_done = 1;
- archive_set_error(&a->archive, errno,
+ archive_set_error(&a->archive,
+ errno,
"Cannot restore extended "
"attributes on this file "
"system");
ret = ARCHIVE_WARN;
}
} else {
- archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_FILE_FORMAT,
"Invalid extended attribute encountered");
ret = ARCHIVE_WARN;
}
errno = 0;
#if HAVE_EXTATTR_SET_FD
if (a->fd >= 0)
- e = extattr_set_fd(a->fd, namespace, name, value, size);
+ e = extattr_set_fd(a->fd, namespace, name,
+ value, size);
else
#endif
/* TODO: should we use extattr_set_link() instead? */
{
- e = extattr_set_file(archive_entry_pathname(entry),
- namespace, name, value, size);
+ e = extattr_set_file(
+ archive_entry_pathname(entry), namespace,
+ name, value, size);
}
if (e != (int)size) {
if (errno == ENOTSUP || errno == ENOSYS) {
if (!warning_done) {
warning_done = 1;
- archive_set_error(&a->archive, errno,
+ archive_set_error(&a->archive,
+ errno,
"Cannot restore extended "
"attributes on this file "
"system");