mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 12:24:11 +00:00
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.
This commit is contained in:
parent
6ddf533afc
commit
3ef01e7727
24
src/object.c
24
src/object.c
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
19
src/object.h
19
src/object.h
@ -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
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user