Revision 8db1e8743c0f1ed241f6a1b8bf55b6fef07d6751 authored by Johannes Schindelin on 28 March 2024, 18:21:06 UTC, committed by Johannes Schindelin on 19 April 2024, 10:38:23 UTC
Critical security issues typically combine relatively common
vulnerabilities such as case confusion in file paths with other
weaknesses in order to raise the severity of the attack.

One such weakness that has haunted the Git project in many a
submodule-related CVE is that any hooks that are found are executed
during a clone operation. Examples are the `post-checkout` and
`fsmonitor` hooks.

However, Git's design calls for hooks to be disabled by default, as only
disabled example hooks are copied over from the templates in
`<prefix>/share/git-core/templates/`.

As a defense-in-depth measure, let's prevent those hooks from running.

Obviously, administrators can choose to drop enabled hooks into the
template directory, though, _and_ it is also possible to override
`core.hooksPath`, in which case the new check needs to be disabled.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 584de0b
Raw File
cbtree.h
/*
 * crit-bit tree implementation, does no allocations internally
 * For more information on crit-bit trees: https://cr.yp.to/critbit.html
 * Based on Adam Langley's adaptation of Dan Bernstein's public domain code
 * git clone https://github.com/agl/critbit.git
 *
 * This is adapted to store arbitrary data (not just NUL-terminated C strings
 * and allocates no memory internally.  The user needs to allocate
 * "struct cb_node" and fill cb_node.k[] with arbitrary match data
 * for memcmp.
 * If "klen" is variable, then it should be embedded into "c_node.k[]"
 * Recursion is bound by the maximum value of "klen" used.
 */
#ifndef CBTREE_H
#define CBTREE_H

#include "git-compat-util.h"

struct cb_node;
struct cb_node {
	struct cb_node *child[2];
	/*
	 * n.b. uint32_t for `byte' is excessive for OIDs,
	 * we may consider shorter variants if nothing else gets stored.
	 */
	uint32_t byte;
	uint8_t otherbits;
	uint8_t k[FLEX_ARRAY]; /* arbitrary data, unaligned */
};

struct cb_tree {
	struct cb_node *root;
};

enum cb_next {
	CB_CONTINUE = 0,
	CB_BREAK = 1
};

#define CBTREE_INIT { 0 }

static inline void cb_init(struct cb_tree *t)
{
	struct cb_tree blank = CBTREE_INIT;
	memcpy(t, &blank, sizeof(*t));
}

struct cb_node *cb_lookup(struct cb_tree *, const uint8_t *k, size_t klen);
struct cb_node *cb_insert(struct cb_tree *, struct cb_node *, size_t klen);

typedef enum cb_next (*cb_iter)(struct cb_node *, void *arg);

void cb_each(struct cb_tree *, const uint8_t *kpfx, size_t klen,
		cb_iter, void *arg);

#endif /* CBTREE_H */
back to top