Commit 3ef01e77 by Edward Thomson

git_object__is_valid: use `odb_read_header`

This allows lighter weight validation in `git_object__is_valid` that
does not require reading the entire object.
parent 6ddf533a
...@@ -467,3 +467,27 @@ int git_object_short_id(git_buf *out, const git_object *obj) ...@@ -467,3 +467,27 @@ int git_object_short_id(git_buf *out, const git_object *obj)
return error; return error;
} }
bool git_object__is_valid(
git_repository *repo, const git_oid *id, git_otype expected_type)
{
git_odb *odb;
git_otype actual_type;
size_t len;
int error;
if (!git_object__strict_input_validation)
return true;
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 ||
(error = git_odb_read_header(&len, &actual_type, odb, id)) < 0)
return false;
if (expected_type != GIT_OBJ_ANY && expected_type != actual_type) {
giterr_set(GITERR_INVALID,
"the requested type does not match the type in the ODB");
return false;
}
return true;
}
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#ifndef INCLUDE_object_h__ #ifndef INCLUDE_object_h__
#define INCLUDE_object_h__ #define INCLUDE_object_h__
#include "repository.h"
extern bool git_object__strict_input_validation; extern bool git_object__strict_input_validation;
/** Base git object for inheritance */ /** Base git object for inheritance */
...@@ -30,21 +32,8 @@ int git_oid__parse(git_oid *oid, const char **buffer_out, const char *buffer_end ...@@ -30,21 +32,8 @@ int git_oid__parse(git_oid *oid, const char **buffer_out, const char *buffer_end
void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid); void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid);
GIT_INLINE(bool) git_object__is_valid( bool git_object__is_valid(
git_repository *repo, const git_oid *id, git_otype type) git_repository *repo, const git_oid *id, git_otype expected_type);
{
git_object *obj = NULL;
bool valid = true;
if (git_object__strict_input_validation) {
if (git_object_lookup(&obj, repo, id, type) < 0)
valid = false;
git_object_free(obj);
}
return valid;
}
GIT_INLINE(git_otype) git_object__type_from_filemode(git_filemode_t mode) GIT_INLINE(git_otype) git_object__type_from_filemode(git_filemode_t mode)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment