submodule--helper: check repo{_submodule,}_init() return values
Fix code added ince125d431a
(submodule: extract path to submodule gitdir func, 2021-09-15) anda77c3fcb5e
(submodule--helper: get remote names from any repository, 2022-03-04) which failed to check the return values of repo_init() and repo_submodule_init(). If we failed to initialize the repository or submodule we could segfault when trying to access the invalid repository structs. Let's also check that these were the only such logic errors in the codebase by making use of the "warn_unused_result" attribute. This is valid as of GCC 3.4.0 (and clang will catch it via its faking of __GNUC__ ). As the comment being added to git-compat-util.h we're piggy-backing on the LAST_ARG_MUST_BE_NULL version check out of lazyness. See9fe3edc47f
(Add the LAST_ARG_MUST_BE_NULL macro, 2013-07-18) for its addition. The marginal benefit of covering gcc 3.4.0..4.0.0 is near-zero (or zero) at this point. It mostly matters that we catch this somewhere. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Reviewed-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ac350155de
commit
1e8697b5c4
@ -63,7 +63,10 @@ static char *get_default_remote_submodule(const char *module_path)
|
|||||||
{
|
{
|
||||||
struct repository subrepo;
|
struct repository subrepo;
|
||||||
|
|
||||||
repo_submodule_init(&subrepo, the_repository, module_path, null_oid());
|
if (repo_submodule_init(&subrepo, the_repository, module_path,
|
||||||
|
null_oid()) < 0)
|
||||||
|
die(_("could not get a repository handle for submodule '%s'"),
|
||||||
|
module_path);
|
||||||
return repo_get_default_remote(&subrepo);
|
return repo_get_default_remote(&subrepo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1480,7 +1483,9 @@ static int add_possible_reference_from_superproject(
|
|||||||
struct strbuf err = STRBUF_INIT;
|
struct strbuf err = STRBUF_INIT;
|
||||||
strbuf_add(&sb, odb->path, len);
|
strbuf_add(&sb, odb->path, len);
|
||||||
|
|
||||||
repo_init(&alternate, sb.buf, NULL);
|
if (repo_init(&alternate, sb.buf, NULL) < 0)
|
||||||
|
die(_("could not get a repository handle for gitdir '%s'"),
|
||||||
|
sb.buf);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to end the new path with '/' to mark it as a dir,
|
* We need to end the new path with '/' to mark it as a dir,
|
||||||
|
@ -565,8 +565,11 @@ static inline int git_has_dir_sep(const char *path)
|
|||||||
/* The sentinel attribute is valid from gcc version 4.0 */
|
/* The sentinel attribute is valid from gcc version 4.0 */
|
||||||
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
||||||
#define LAST_ARG_MUST_BE_NULL __attribute__((sentinel))
|
#define LAST_ARG_MUST_BE_NULL __attribute__((sentinel))
|
||||||
|
/* warn_unused_result exists as of gcc 3.4.0, but be lazy and check 4.0 */
|
||||||
|
#define RESULT_MUST_BE_USED __attribute__ ((warn_unused_result))
|
||||||
#else
|
#else
|
||||||
#define LAST_ARG_MUST_BE_NULL
|
#define LAST_ARG_MUST_BE_NULL
|
||||||
|
#define RESULT_MUST_BE_USED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAYBE_UNUSED __attribute__((__unused__))
|
#define MAYBE_UNUSED __attribute__((__unused__))
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef REPOSITORY_H
|
#ifndef REPOSITORY_H
|
||||||
#define REPOSITORY_H
|
#define REPOSITORY_H
|
||||||
|
|
||||||
|
#include "git-compat-util.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
|
||||||
struct config_set;
|
struct config_set;
|
||||||
@ -185,6 +186,7 @@ void repo_set_gitdir(struct repository *repo, const char *root,
|
|||||||
void repo_set_worktree(struct repository *repo, const char *path);
|
void repo_set_worktree(struct repository *repo, const char *path);
|
||||||
void repo_set_hash_algo(struct repository *repo, int algo);
|
void repo_set_hash_algo(struct repository *repo, int algo);
|
||||||
void initialize_the_repository(void);
|
void initialize_the_repository(void);
|
||||||
|
RESULT_MUST_BE_USED
|
||||||
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
|
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -196,6 +198,7 @@ int repo_init(struct repository *r, const char *gitdir, const char *worktree);
|
|||||||
* Return 0 upon success and a non-zero value upon failure.
|
* Return 0 upon success and a non-zero value upon failure.
|
||||||
*/
|
*/
|
||||||
struct object_id;
|
struct object_id;
|
||||||
|
RESULT_MUST_BE_USED
|
||||||
int repo_submodule_init(struct repository *subrepo,
|
int repo_submodule_init(struct repository *subrepo,
|
||||||
struct repository *superproject,
|
struct repository *superproject,
|
||||||
const char *path,
|
const char *path,
|
||||||
|
Loading…
Reference in New Issue
Block a user