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>
Jeff King committed
Jun 30, 2014 at 12:59 UTC
592ce20820ac36dd868dfd1e61b1aeb3cd3f902a
1 file changed
+14
-15
builtin/index-pack.c
+14
-15
@@ -1505,7 +1505,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1505
const char *curr_index;
1506
const char *index_name = NULL, *pack_name = NULL;
1507
const char *keep_name = NULL, *keep_msg = NULL;
1508
- char *index_name_buf = NULL, *keep_name_buf = NULL;
1508
+ struct strbuf index_name_buf = STRBUF_INIT,
1509
+ keep_name_buf = STRBUF_INIT;
1510
struct pack_idx_entry **idx_objects;
1511
struct pack_idx_option opts;
1512
unsigned char pack_sha1[20];
@@ -1602,24 +1603,22 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1603
if (fix_thin_pack && !from_stdin)
1604
die(_("--fix-thin cannot be used without --stdin"));
1605
if (!index_name && pack_name) {
1605
- int len = strlen(pack_name);
1606
- if (!ends_with(pack_name, ".pack"))
1606
+ size_t len;
1607
+ if (!strip_suffix(pack_name, ".pack", &len))
1608
die(_("packfile name '%s' does not end with '.pack'"),
1609
pack_name);
1609
- index_name_buf = xmalloc(len);
1610
- memcpy(index_name_buf, pack_name, len - 5);
1611
- strcpy(index_name_buf + len - 5, ".idx");
1612
- index_name = index_name_buf;
1610
+ strbuf_add(&index_name_buf, pack_name, len);
1611
+ strbuf_addstr(&index_name_buf, ".idx");
1612
+ index_name = index_name_buf.buf;
1613
}
1614
if (keep_msg && !keep_name && pack_name) {
1615
- int len = strlen(pack_name);
1616
- if (!ends_with(pack_name, ".pack"))
1615
+ size_t len;
1616
+ if (!strip_suffix(pack_name, ".pack", &len))
1617
die(_("packfile name '%s' does not end with '.pack'"),
1618
pack_name);
1619
- keep_name_buf = xmalloc(len);
1620
- memcpy(keep_name_buf, pack_name, len - 5);
1621
- strcpy(keep_name_buf + len - 5, ".keep");
1622
- keep_name = keep_name_buf;
1619
+ strbuf_add(&keep_name_buf, pack_name, len);
1620
+ strbuf_addstr(&keep_name_buf, ".idx");
1621
+ keep_name = keep_name_buf.buf;
1622
}
1623
if (verify) {
1624
if (!index_name)
@@ -1667,8 +1666,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1666
else
1667
close(input_fd);
1668
free(objects);
1670
- free(index_name_buf);
1671
- free(keep_name_buf);
1669
+ strbuf_release(&index_name_buf);
1670
+ strbuf_release(&keep_name_buf);
1671
if (pack_name == NULL)
1672
free((void *) curr_pack);
1673
if (index_name == NULL)