index-pack: use strip_suffix to avoid magic numbers

We also switch to using strbufs, which lets us avoid the
potentially dangerous combination of a manual malloc
followed by a strcpy.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2014-06-30 12:59:10 -04:00 committed by Junio C Hamano
parent 26936bfd9b
commit 592ce20820

@ -1505,7 +1505,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
const char *curr_index; const char *curr_index;
const char *index_name = NULL, *pack_name = NULL; const char *index_name = NULL, *pack_name = NULL;
const char *keep_name = NULL, *keep_msg = NULL; const char *keep_name = NULL, *keep_msg = NULL;
char *index_name_buf = NULL, *keep_name_buf = NULL; struct strbuf index_name_buf = STRBUF_INIT,
keep_name_buf = STRBUF_INIT;
struct pack_idx_entry **idx_objects; struct pack_idx_entry **idx_objects;
struct pack_idx_option opts; struct pack_idx_option opts;
unsigned char pack_sha1[20]; unsigned char pack_sha1[20];
@ -1602,24 +1603,22 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (fix_thin_pack && !from_stdin) if (fix_thin_pack && !from_stdin)
die(_("--fix-thin cannot be used without --stdin")); die(_("--fix-thin cannot be used without --stdin"));
if (!index_name && pack_name) { if (!index_name && pack_name) {
int len = strlen(pack_name); size_t len;
if (!ends_with(pack_name, ".pack")) if (!strip_suffix(pack_name, ".pack", &len))
die(_("packfile name '%s' does not end with '.pack'"), die(_("packfile name '%s' does not end with '.pack'"),
pack_name); pack_name);
index_name_buf = xmalloc(len); strbuf_add(&index_name_buf, pack_name, len);
memcpy(index_name_buf, pack_name, len - 5); strbuf_addstr(&index_name_buf, ".idx");
strcpy(index_name_buf + len - 5, ".idx"); index_name = index_name_buf.buf;
index_name = index_name_buf;
} }
if (keep_msg && !keep_name && pack_name) { if (keep_msg && !keep_name && pack_name) {
int len = strlen(pack_name); size_t len;
if (!ends_with(pack_name, ".pack")) if (!strip_suffix(pack_name, ".pack", &len))
die(_("packfile name '%s' does not end with '.pack'"), die(_("packfile name '%s' does not end with '.pack'"),
pack_name); pack_name);
keep_name_buf = xmalloc(len); strbuf_add(&keep_name_buf, pack_name, len);
memcpy(keep_name_buf, pack_name, len - 5); strbuf_addstr(&keep_name_buf, ".idx");
strcpy(keep_name_buf + len - 5, ".keep"); keep_name = keep_name_buf.buf;
keep_name = keep_name_buf;
} }
if (verify) { if (verify) {
if (!index_name) if (!index_name)
@ -1667,8 +1666,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
else else
close(input_fd); close(input_fd);
free(objects); free(objects);
free(index_name_buf); strbuf_release(&index_name_buf);
free(keep_name_buf); strbuf_release(&keep_name_buf);
if (pack_name == NULL) if (pack_name == NULL)
free((void *) curr_pack); free((void *) curr_pack);
if (index_name == NULL) if (index_name == NULL)