Revision 6d8684161ee9c03bed5cb69ae76dfdddb85a0003 authored by Johannes Schindelin on 13 September 2019, 14:32:43 UTC, committed by Johannes Schindelin on 05 December 2019, 14:36:51 UTC
We need to be careful to follow proper quoting rules. For example, if an
argument contains spaces, we have to quote them. Double-quotes need to
be escaped. Backslashes need to be escaped, but only if they are
followed by a double-quote character.

We need to be _extra_ careful to consider the case where an argument
ends in a backslash _and_ needs to be quoted: in this case, we append a
double-quote character, i.e. the backslash now has to be escaped!

The current code, however, fails to recognize that, and therefore can
turn an argument that ends in a single backslash into a quoted argument
that now ends in an escaped double-quote character. This allows
subsequent command-line parameters to be split and part of them being
mistaken for command-line options, e.g. through a maliciously-crafted
submodule URL during a recursive clone.

Technically, we would not need to quote _all_ arguments which end in a
backslash _unless_ the argument needs to be quoted anyway. For example,
`test\` would not need to be quoted, while `test \` would need to be.

To keep the code simple, however, and therefore easier to reason about
and ensure its correctness, we now _always_ quote an argument that ends
in a backslash.

This addresses CVE-2019-1350.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent a8dee3c
Raw File
notes-cache.h
#ifndef NOTES_CACHE_H
#define NOTES_CACHE_H

#include "notes.h"

struct notes_cache {
	struct notes_tree tree;
	char *validity;
};

void notes_cache_init(struct notes_cache *c, const char *name,
		     const char *validity);
int notes_cache_write(struct notes_cache *c);

char *notes_cache_get(struct notes_cache *c, struct object_id *oid, size_t
		      *outsize);
int notes_cache_put(struct notes_cache *c, struct object_id *oid,
		    const char *data, size_t size);

#endif /* NOTES_CACHE_H */
back to top