add_packed_git: convert strcpy into xsnprintf
We have the path "foo.idx", and we create a buffer big enough to hold "foo.pack" and "foo.keep", and then strcpy straight into it. This isn't a bug (we have enough space), but it's very hard to tell from the strcpy that this is so. Let's instead use strip_suffix to take off the ".idx", record the size of our allocation, and use xsnprintf to make sure we don't violate our assumptions. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
330c8e2670
commit
48bcc1c3cc
2
cache.h
2
cache.h
|
@ -1309,7 +1309,7 @@ extern void close_pack_windows(struct packed_git *);
|
||||||
extern void unuse_pack(struct pack_window **);
|
extern void unuse_pack(struct pack_window **);
|
||||||
extern void free_pack_by_name(const char *);
|
extern void free_pack_by_name(const char *);
|
||||||
extern void clear_delta_base_cache(void);
|
extern void clear_delta_base_cache(void);
|
||||||
extern struct packed_git *add_packed_git(const char *, int, int);
|
extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the SHA-1 of the nth object within the specified packfile.
|
* Return the SHA-1 of the nth object within the specified packfile.
|
||||||
|
|
21
sha1_file.c
21
sha1_file.c
|
@ -1146,11 +1146,12 @@ static void try_to_free_pack_memory(size_t size)
|
||||||
release_pack_memory(size);
|
release_pack_memory(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct packed_git *add_packed_git(const char *path, int path_len, int local)
|
struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
|
||||||
{
|
{
|
||||||
static int have_set_try_to_free_routine;
|
static int have_set_try_to_free_routine;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct packed_git *p = alloc_packed_git(path_len + 2);
|
size_t alloc;
|
||||||
|
struct packed_git *p;
|
||||||
|
|
||||||
if (!have_set_try_to_free_routine) {
|
if (!have_set_try_to_free_routine) {
|
||||||
have_set_try_to_free_routine = 1;
|
have_set_try_to_free_routine = 1;
|
||||||
|
@ -1161,18 +1162,22 @@ struct packed_git *add_packed_git(const char *path, int path_len, int local)
|
||||||
* Make sure a corresponding .pack file exists and that
|
* Make sure a corresponding .pack file exists and that
|
||||||
* the index looks sane.
|
* the index looks sane.
|
||||||
*/
|
*/
|
||||||
path_len -= strlen(".idx");
|
if (!strip_suffix_mem(path, &path_len, ".idx"))
|
||||||
if (path_len < 1) {
|
|
||||||
free(p);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
/*
|
||||||
|
* ".pack" is long enough to hold any suffix we're adding (and
|
||||||
|
* the use xsnprintf double-checks that)
|
||||||
|
*/
|
||||||
|
alloc = path_len + strlen(".pack") + 1;
|
||||||
|
p = alloc_packed_git(alloc);
|
||||||
memcpy(p->pack_name, path, path_len);
|
memcpy(p->pack_name, path, path_len);
|
||||||
|
|
||||||
strcpy(p->pack_name + path_len, ".keep");
|
xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
|
||||||
if (!access(p->pack_name, F_OK))
|
if (!access(p->pack_name, F_OK))
|
||||||
p->pack_keep = 1;
|
p->pack_keep = 1;
|
||||||
|
|
||||||
strcpy(p->pack_name + path_len, ".pack");
|
xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
|
||||||
if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
|
if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
|
||||||
free(p);
|
free(p);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue