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)