]> git.ipfire.org Git - thirdparty/git.git/commitdiff
symlinks: use unsigned int for flags
authorTian Yuchen <a3205153416@gmail.com>
Mon, 16 Feb 2026 17:20:28 +0000 (01:20 +0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Feb 2026 23:03:42 +0000 (15:03 -0800)
The 'flags' and 'track_flags' fields in symlinks.c are used
strictly as a collection of bits (using bitwise operators including
&, |, ~). Using a signed integer for bitmasks may lead to undefined
behavior with shift operations and logic errors if the MSB is touched.

Change these fields from 'int' to 'unsigned int' to match our usage
patterns.

Signed-off-by: Tian Yuchen <a3205153416@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
symlinks.c
symlinks.h

index 9cc090d42c089f82178de90514d592cf70a5822f..9e01ab3bc86c5b8d17db38592dc63e5cc761f0ac 100644 (file)
@@ -74,11 +74,12 @@ static inline void reset_lstat_cache(struct cache_def *cache)
  */
 static int lstat_cache_matchlen(struct cache_def *cache,
                                const char *name, int len,
-                               int *ret_flags, int track_flags,
+                               unsigned int *ret_flags, unsigned int track_flags,
                                int prefix_len_stat_func)
 {
        int match_len, last_slash, last_slash_dir, previous_slash;
-       int save_flags, ret, saved_errno = 0;
+       unsigned int save_flags;
+       int ret, saved_errno = 0;
        struct stat st;
 
        if (cache->track_flags != track_flags ||
@@ -192,10 +193,10 @@ static int lstat_cache_matchlen(struct cache_def *cache,
        return match_len;
 }
 
-static int lstat_cache(struct cache_def *cache, const char *name, int len,
-                      int track_flags, int prefix_len_stat_func)
+static unsigned int lstat_cache(struct cache_def *cache, const char *name, int len,
+                      unsigned int track_flags, int prefix_len_stat_func)
 {
-       int flags;
+       unsigned int flags;
        (void)lstat_cache_matchlen(cache, name, len, &flags, track_flags,
                        prefix_len_stat_func);
        return flags;
@@ -234,7 +235,7 @@ int check_leading_path(const char *name, int len, int warn_on_lstat_err)
 static int threaded_check_leading_path(struct cache_def *cache, const char *name,
                                       int len, int warn_on_lstat_err)
 {
-       int flags;
+       unsigned int flags;
        int match_len = lstat_cache_matchlen(cache, name, len, &flags,
                           FL_SYMLINK|FL_NOENT|FL_DIR, USE_ONLY_LSTAT);
        int saved_errno = errno;
index 7ae3d5b85695fbd015dd3a023a8f442779f3f5d0..25bf04f54fbee0fc61ccf5bd0c7b2416b1bd5920 100644 (file)
@@ -5,8 +5,8 @@
 
 struct cache_def {
        struct strbuf path;
-       int flags;
-       int track_flags;
+       unsigned int flags;
+       unsigned int track_flags;
        int prefix_len_stat_func;
 };
 #define CACHE_DEF_INIT { \