lib/commit: Clean up commit file type handling variables

The variables here were duplicative; we don't need two booleans to distinguish
between symlinks and regular files. What we do need to handle is the "physical"
state versus the "object" state. Symlinks objects are stored as regular files in
`bare-user` and `archive`.

Prep for more cleanup.

Closes: #957
Approved by: jlebon
This commit is contained in:
Colin Walters 2017-06-23 17:13:15 -04:00 committed by Atomic Bot
parent d0d5f54ce2
commit 1147267e4d
1 changed files with 19 additions and 18 deletions

View File

@ -614,30 +614,32 @@ write_content_object (OstreeRepo *self,
cancellable, error)) cancellable, error))
return FALSE; return FALSE;
gboolean temp_file_is_regular = g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR; gboolean phys_object_is_symlink = FALSE;
gboolean temp_file_is_symlink = g_file_info_get_file_type (file_info) == G_FILE_TYPE_SYMBOLIC_LINK; const GFileType object_file_type = g_file_info_get_file_type (file_info);
gboolean object_is_symlink = temp_file_is_symlink; switch (object_file_type)
{
case G_FILE_TYPE_REGULAR:
break;
case G_FILE_TYPE_SYMBOLIC_LINK:
if (self->mode == OSTREE_REPO_MODE_BARE || self->mode == OSTREE_REPO_MODE_BARE_USER_ONLY)
phys_object_is_symlink = TRUE;
break;
default:
return glnx_throw (error, "Unsupported file type %u", object_file_type);
}
if (repo_mode == OSTREE_REPO_MODE_BARE_USER && object_is_symlink) /* For bare-user, convert the symlink target to the input stream */
if (repo_mode == OSTREE_REPO_MODE_BARE_USER && object_file_type == G_FILE_TYPE_SYMBOLIC_LINK)
{ {
const char *target_str = g_file_info_get_symlink_target (file_info); const char *target_str = g_file_info_get_symlink_target (file_info);
g_autoptr(GBytes) target = g_bytes_new (target_str, strlen (target_str) + 1); g_autoptr(GBytes) target = g_bytes_new (target_str, strlen (target_str) + 1);
/* For bare-user we can't store symlinks as symlinks, as symlinks don't
support user xattrs to store the ownership. So, instead store them
as regular files */
temp_file_is_regular = TRUE;
temp_file_is_symlink = FALSE;
if (file_input != NULL) if (file_input != NULL)
g_object_unref (file_input); g_object_unref (file_input);
/* Include the terminating zero so we can e.g. mmap this file */ /* Include the terminating zero so we can e.g. mmap this file */
file_input = g_memory_input_stream_new_from_bytes (target); file_input = g_memory_input_stream_new_from_bytes (target);
} }
if (!(temp_file_is_regular || temp_file_is_symlink))
return glnx_throw (error, "Unsupported file type %u", g_file_info_get_file_type (file_info));
/* For regular files, we create them with default mode, and only /* For regular files, we create them with default mode, and only
* later apply any xattrs and setuid bits. The rationale here * later apply any xattrs and setuid bits. The rationale here
* is that an attacker on the network with the ability to MITM * is that an attacker on the network with the ability to MITM
@ -654,7 +656,7 @@ write_content_object (OstreeRepo *self,
g_autofree char *temp_filename = NULL; g_autofree char *temp_filename = NULL;
gssize unpacked_size = 0; gssize unpacked_size = 0;
gboolean indexable = FALSE; gboolean indexable = FALSE;
if ((_ostree_repo_mode_is_bare (repo_mode)) && temp_file_is_regular) if ((_ostree_repo_mode_is_bare (repo_mode)) && !phys_object_is_symlink)
{ {
guint64 size = g_file_info_get_size (file_info); guint64 size = g_file_info_get_size (file_info);
@ -664,7 +666,7 @@ write_content_object (OstreeRepo *self,
return FALSE; return FALSE;
tmp_unlinker.path = temp_filename; tmp_unlinker.path = temp_filename;
} }
else if (_ostree_repo_mode_is_bare (repo_mode) && temp_file_is_symlink) else if (_ostree_repo_mode_is_bare (repo_mode) && phys_object_is_symlink)
{ {
/* Note: This will not be hit for bare-user mode because its converted to a /* Note: This will not be hit for bare-user mode because its converted to a
regular file and take the branch above */ regular file and take the branch above */
@ -690,7 +692,6 @@ write_content_object (OstreeRepo *self,
error)) error))
return FALSE; return FALSE;
tmp_unlinker.path = temp_filename; tmp_unlinker.path = temp_filename;
temp_file_is_regular = TRUE;
temp_out = g_unix_output_stream_new (temp_fd, FALSE); temp_out = g_unix_output_stream_new (temp_fd, FALSE);
file_meta = _ostree_zlib_file_header_new (file_info, xattrs); file_meta = _ostree_zlib_file_header_new (file_info, xattrs);
@ -758,7 +759,7 @@ write_content_object (OstreeRepo *self,
const guint32 mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode"); const guint32 mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode");
if (!commit_loose_content_object (self, actual_checksum, if (!commit_loose_content_object (self, actual_checksum,
temp_filename, temp_filename,
object_is_symlink, object_file_type == G_FILE_TYPE_SYMBOLIC_LINK,
uid, gid, mode, uid, gid, mode,
xattrs, temp_fd, xattrs, temp_fd,
cancellable, error)) cancellable, error))
@ -768,7 +769,7 @@ write_content_object (OstreeRepo *self,
tmp_unlinker.path = NULL; tmp_unlinker.path = NULL;
/* Update size metadata if configured */ /* Update size metadata if configured */
if (indexable && temp_file_is_regular) if (indexable && object_file_type == G_FILE_TYPE_REGULAR)
{ {
struct stat stbuf; struct stat stbuf;