{"thread":{"id":"59198","subject":"[PATCH] read-cache: use size_t for {base,df}_name_compare()","startedAt":"2023-02-05T10:36:37Z","lastAt":"2023-02-05T21:10:18Z","messageCount":2,"participants":["René Scharfe","Ævar Arnfjörð Bjarmason"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"471518","messageId":"d272fd03-a005-f6ad-3f00-6b1a970a519f@web.de","threadId":"59198","inReplyTo":null,"subject":"[PATCH] read-cache: use size_t for {base,df}_name_compare()","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2023-02-05T10:36:28Z","receivedAt":"2023-02-05T10:36:37Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Support names of any length in base_name_compare() and df_name_compare()\nby using size_t for their length parameters.  They pass the length on to\nmemcmp(3), which also takes it as a size_t.\n\nSigned-off-by: René Scharfe <l.s.r@web.de>\n---\nFormatted with --function-context for easier review.\n\n cache.h      |  6 ++++--\n read-cache.c | 13 +++++++------\n 2 files changed, 11 insertions(+), 8 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex 4bf14e0bd9..52d017335e 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -1623,8 +1623,10 @@ int repo_interpret_branch_name(struct repository *r,\n\n int validate_headref(const char *ref);\n\n-int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);\n-int df_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);\n+int base_name_compare(const char *name1, size_t len1, int mode1,\n+\t\t      const char *name2, size_t len2, int mode2);\n+int df_name_compare(const char *name1, size_t len1, int mode1,\n+\t\t    const char *name2, size_t len2, int mode2);\n int name_compare(const char *name1, size_t len1, const char *name2, size_t len2);\n int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2);\n\ndiff --git a/read-cache.c b/read-cache.c\nindex 7bd12afb38..35e5657877 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -488,56 +488,57 @@ int ie_modified(struct index_state *istate,\n \treturn 0;\n }\n\n-int base_name_compare(const char *name1, int len1, int mode1,\n-\t\t      const char *name2, int len2, int mode2)\n+int base_name_compare(const char *name1, size_t len1, int mode1,\n+\t\t      const char *name2, size_t len2, int mode2)\n {\n \tunsigned char c1, c2;\n-\tint len = len1 < len2 ? len1 : len2;\n+\tsize_t len = len1 < len2 ? len1 : len2;\n \tint cmp;\n\n \tcmp = memcmp(name1, name2, len);\n \tif (cmp)\n \t\treturn cmp;\n \tc1 = name1[len];\n \tc2 = name2[len];\n \tif (!c1 && S_ISDIR(mode1))\n \t\tc1 = '/';\n \tif (!c2 && S_ISDIR(mode2))\n \t\tc2 = '/';\n \treturn (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;\n }\n\n /*\n  * df_name_compare() is identical to base_name_compare(), except it\n  * compares conflicting directory/file entries as equal. Note that\n  * while a directory name compares as equal to a regular file, they\n  * then individually compare _differently_ to a filename that has\n  * a dot after the basename (because '\\0' < '.' < '/').\n  *\n  * This is used by routines that want to traverse the git namespace\n  * but then handle conflicting entries together when possible.\n  */\n-int df_name_compare(const char *name1, int len1, int mode1,\n-\t\t    const char *name2, int len2, int mode2)\n+int df_name_compare(const char *name1, size_t len1, int mode1,\n+\t\t    const char *name2, size_t len2, int mode2)\n {\n-\tint len = len1 < len2 ? len1 : len2, cmp;\n \tunsigned char c1, c2;\n+\tsize_t len = len1 < len2 ? len1 : len2;\n+\tint cmp;\n\n \tcmp = memcmp(name1, name2, len);\n \tif (cmp)\n \t\treturn cmp;\n \t/* Directories and files compare equal (same length, same name) */\n \tif (len1 == len2)\n \t\treturn 0;\n \tc1 = name1[len];\n \tif (!c1 && S_ISDIR(mode1))\n \t\tc1 = '/';\n \tc2 = name2[len];\n \tif (!c2 && S_ISDIR(mode2))\n \t\tc2 = '/';\n \tif (c1 == '/' && !c2)\n \t\treturn 0;\n \tif (c2 == '/' && !c1)\n \t\treturn 0;\n \treturn c1 - c2;\n }\n--\n2.39.1\n"},{"id":"471543","messageId":"230205.86y1pb7r9m.gmgdl@evledraar.gmail.com","threadId":"59198","inReplyTo":"d272fd03-a005-f6ad-3f00-6b1a970a519f@web.de","subject":"Re: [PATCH] read-cache: use size_t for {base,df}_name_compare()","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2023-02-05T21:09:18Z","receivedAt":"2023-02-05T21:10:18Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"\nOn Sun, Feb 05 2023, René Scharfe wrote:\n\n> Support names of any length in base_name_compare() and df_name_compare()\n> by using size_t for their length parameters.  They pass the length on to\n> memcmp(3), which also takes it as a size_t.\n\nThis looks good, and it's nice to see changes that slowly address the\ngreater topic of our outstanding -Werror=sign-compare issues.\n"}]}