rugged 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdadf8b383ef039632471f05491d5d1ce9d7613c3816b788451dc3432e808872
4
- data.tar.gz: afa9183f788f45364a39f5ff7b33213379660a60513187810a6c41bca4bae241
3
+ metadata.gz: 0d3a62d428f320d5ee63e21ce25ffc00ac84912e9980b782e4663b9c339f32f6
4
+ data.tar.gz: '09e9ef581a5ce5248505535edcef74dcf3e52cb0f1019285c258bd03f4b48471'
5
5
  SHA512:
6
- metadata.gz: 440cabc3060d848e30782a4eadccb25a49a1530364e3110fae516a2d16d4728a5e8e81d12cdf880d182d4ea699caaedd60beb394ccb13288fb45a7ec13187caf
7
- data.tar.gz: 48ac1d84850dbc798d05f4012cbf5d6a9706ffa8676df8a4e7a33d7bc0d7b5404eb1d4a8fed976c034fe83c56b4e2425ce564075cf51cb3651e277d25129fcc1
6
+ metadata.gz: 21505d114417de7410ea8f34f05bb4347f6610f64e219d4687f33b89b8b52fccc9c6d99f2ee581a92080033ad40e81572310c6d0b2cf6f64c0359f3e976d088e
7
+ data.tar.gz: d3aeea031ffb9598fc2b8b313eefc2927d1a7b1fe3b594c6010d06d8c1c557791fdb68134b2ac3c6573290d46eb8c38c6d502f098d43986e1abc7c3fda20c97a
@@ -98,7 +98,7 @@ else
98
98
  end
99
99
 
100
100
  Dir.chdir(LIBGIT2_DIR) do
101
- Dir.mkdir("build") if !Dir.exist?("build")
101
+ Dir.mkdir("build") if !Dir.exists?("build")
102
102
 
103
103
  Dir.chdir("build") do
104
104
  # On Windows, Ruby-DevKit is MSYS-based, so ensure to use MSYS Makefiles.
@@ -4,5 +4,5 @@
4
4
  # For full terms see the included LICENSE file.
5
5
 
6
6
  module Rugged
7
- Version = VERSION = '1.3.1'
7
+ Version = VERSION = '1.3.2'
8
8
  end
@@ -13,7 +13,7 @@
13
13
 
14
14
  CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1)
15
15
 
16
- project(libgit2 VERSION "1.3.0" LANGUAGES C)
16
+ project(libgit2 VERSION "1.3.1" LANGUAGES C)
17
17
 
18
18
  # Add find modules to the path
19
19
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${libgit2_SOURCE_DIR}/cmake/")
@@ -211,7 +211,9 @@ typedef enum {
211
211
  GIT_OPT_SET_ODB_PACKED_PRIORITY,
212
212
  GIT_OPT_SET_ODB_LOOSE_PRIORITY,
213
213
  GIT_OPT_GET_EXTENSIONS,
214
- GIT_OPT_SET_EXTENSIONS
214
+ GIT_OPT_SET_EXTENSIONS,
215
+ GIT_OPT_GET_OWNER_VALIDATION,
216
+ GIT_OPT_SET_OWNER_VALIDATION
215
217
  } git_libgit2_opt_t;
216
218
 
217
219
  /**
@@ -449,6 +451,14 @@ typedef enum {
449
451
  * > to support repositories with the `noop` extension but does want
450
452
  * > to support repositories with the `newext` extension.
451
453
  *
454
+ * opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled)
455
+ * > Gets the owner validation setting for repository
456
+ * > directories.
457
+ *
458
+ * opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled)
459
+ * > Set that repository directories should be owned by the current
460
+ * > user. The default is to validate ownership.
461
+ *
452
462
  * @param option Option key
453
463
  * @param ... value to set the option
454
464
  * @return 0 on success, <0 on failure
@@ -58,6 +58,7 @@ typedef enum {
58
58
  GIT_EMISMATCH = -33, /**< Hashsum mismatch in object */
59
59
  GIT_EINDEXDIRTY = -34, /**< Unsaved changes in the index would be overwritten */
60
60
  GIT_EAPPLYFAIL = -35, /**< Patch application failed */
61
+ GIT_EOWNER = -36 /**< The object is not owned by the current user */
61
62
  } git_error_code;
62
63
 
63
64
  /**
@@ -7,10 +7,10 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "1.3.0"
10
+ #define LIBGIT2_VERSION "1.3.1"
11
11
  #define LIBGIT2_VER_MAJOR 1
12
12
  #define LIBGIT2_VER_MINOR 3
13
- #define LIBGIT2_VER_REVISION 0
13
+ #define LIBGIT2_VER_REVISION 1
14
14
  #define LIBGIT2_VER_PATCH 0
15
15
 
16
16
  #define LIBGIT2_SOVERSION "1.3"
@@ -1118,16 +1118,20 @@ int git_config_find_system(git_buf *path)
1118
1118
  int git_config_find_programdata(git_buf *path)
1119
1119
  {
1120
1120
  int ret;
1121
+ bool is_safe;
1121
1122
 
1122
- if ((ret = git_buf_sanitize(path)) < 0)
1123
+ if ((ret = git_buf_sanitize(path)) < 0 ||
1124
+ (ret = git_sysdir_find_programdata_file(path,
1125
+ GIT_CONFIG_FILENAME_PROGRAMDATA)) < 0 ||
1126
+ (ret = git_path_owner_is_system_or_current_user(&is_safe, path->ptr)) < 0)
1123
1127
  return ret;
1124
1128
 
1125
- ret = git_sysdir_find_programdata_file(path,
1126
- GIT_CONFIG_FILENAME_PROGRAMDATA);
1127
- if (ret != GIT_OK)
1128
- return ret;
1129
+ if (!is_safe) {
1130
+ git_error_set(GIT_ERROR_CONFIG, "programdata path has invalid ownership");
1131
+ return -1;
1132
+ }
1129
1133
 
1130
- return git_path_validate_system_file_ownership(path->ptr);
1134
+ return 0;
1131
1135
  }
1132
1136
 
1133
1137
  int git_config__global_location(git_buf *buf)
@@ -390,6 +390,14 @@ int git_libgit2_opts(int key, ...)
390
390
  }
391
391
  break;
392
392
 
393
+ case GIT_OPT_GET_OWNER_VALIDATION:
394
+ *(va_arg(ap, int *)) = git_repository__validate_ownership;
395
+ break;
396
+
397
+ case GIT_OPT_SET_OWNER_VALIDATION:
398
+ git_repository__validate_ownership = (va_arg(ap, int) != 0);
399
+ break;
400
+
393
401
  default:
394
402
  git_error_set(GIT_ERROR_INVALID, "invalid option key");
395
403
  error = -1;
@@ -2024,78 +2024,237 @@ done:
2024
2024
  return supported;
2025
2025
  }
2026
2026
 
2027
- int git_path_validate_system_file_ownership(const char *path)
2027
+ static git_path__mock_owner_t mock_owner = GIT_PATH_MOCK_OWNER_NONE;
2028
+
2029
+ void git_path__set_owner(git_path__mock_owner_t owner)
2030
+ {
2031
+ mock_owner = owner;
2032
+ }
2033
+
2034
+ #ifdef GIT_WIN32
2035
+ static PSID *sid_dup(PSID sid)
2036
+ {
2037
+ DWORD len;
2038
+ PSID dup;
2039
+
2040
+ len = GetLengthSid(sid);
2041
+
2042
+ if ((dup = git__malloc(len)) == NULL)
2043
+ return NULL;
2044
+
2045
+ if (!CopySid(len, dup, sid)) {
2046
+ git_error_set(GIT_ERROR_OS, "could not duplicate sid");
2047
+ git__free(dup);
2048
+ return NULL;
2049
+ }
2050
+
2051
+ return dup;
2052
+ }
2053
+
2054
+ static int current_user_sid(PSID *out)
2028
2055
  {
2029
- #ifndef GIT_WIN32
2030
- GIT_UNUSED(path);
2031
- return GIT_OK;
2032
- #else
2033
- git_win32_path buf;
2034
- PSID owner_sid;
2035
- PSECURITY_DESCRIPTOR descriptor = NULL;
2036
- HANDLE token;
2037
2056
  TOKEN_USER *info = NULL;
2038
- DWORD err, len;
2039
- int ret;
2057
+ HANDLE token = NULL;
2058
+ DWORD len = 0;
2059
+ int error = -1;
2040
2060
 
2041
- if (git_win32_path_from_utf8(buf, path) < 0)
2042
- return -1;
2061
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
2062
+ git_error_set(GIT_ERROR_OS, "could not lookup process information");
2063
+ goto done;
2064
+ }
2065
+
2066
+ if (GetTokenInformation(token, TokenUser, NULL, 0, &len) ||
2067
+ GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
2068
+ git_error_set(GIT_ERROR_OS, "could not lookup token metadata");
2069
+ goto done;
2070
+ }
2043
2071
 
2044
- err = GetNamedSecurityInfoW(buf, SE_FILE_OBJECT,
2045
- OWNER_SECURITY_INFORMATION |
2046
- DACL_SECURITY_INFORMATION,
2047
- &owner_sid, NULL, NULL, NULL, &descriptor);
2072
+ info = git__malloc(len);
2073
+ GIT_ERROR_CHECK_ALLOC(info);
2048
2074
 
2049
- if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) {
2050
- ret = GIT_ENOTFOUND;
2051
- goto cleanup;
2075
+ if (!GetTokenInformation(token, TokenUser, info, len, &len)) {
2076
+ git_error_set(GIT_ERROR_OS, "could not lookup current user");
2077
+ goto done;
2052
2078
  }
2053
2079
 
2054
- if (err != ERROR_SUCCESS) {
2080
+ if ((*out = sid_dup(info->User.Sid)))
2081
+ error = 0;
2082
+
2083
+ done:
2084
+ if (token)
2085
+ CloseHandle(token);
2086
+
2087
+ git__free(info);
2088
+ return error;
2089
+ }
2090
+
2091
+ static int file_owner_sid(PSID *out, const char *path)
2092
+ {
2093
+ git_win32_path path_w32;
2094
+ PSECURITY_DESCRIPTOR descriptor = NULL;
2095
+ PSID owner_sid;
2096
+ DWORD ret;
2097
+ int error = -1;
2098
+
2099
+ if (git_win32_path_from_utf8(path_w32, path) < 0)
2100
+ return -1;
2101
+
2102
+ ret = GetNamedSecurityInfoW(path_w32, SE_FILE_OBJECT,
2103
+ OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
2104
+ &owner_sid, NULL, NULL, NULL, &descriptor);
2105
+
2106
+ if (ret == ERROR_FILE_NOT_FOUND || ret == ERROR_PATH_NOT_FOUND)
2107
+ error = GIT_ENOTFOUND;
2108
+ else if (ret != ERROR_SUCCESS)
2055
2109
  git_error_set(GIT_ERROR_OS, "failed to get security information");
2056
- ret = GIT_ERROR;
2057
- goto cleanup;
2110
+ else if (!IsValidSid(owner_sid))
2111
+ git_error_set(GIT_ERROR_OS, "file owner is not valid");
2112
+ else if ((*out = sid_dup(owner_sid)))
2113
+ error = 0;
2114
+
2115
+ if (descriptor)
2116
+ LocalFree(descriptor);
2117
+
2118
+ return error;
2119
+ }
2120
+
2121
+ int git_path_owner_is_current_user(bool *out, const char *path)
2122
+ {
2123
+ PSID owner_sid = NULL, user_sid = NULL;
2124
+ int error = -1;
2125
+
2126
+ if (mock_owner) {
2127
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_CURRENT_USER);
2128
+ return 0;
2129
+ }
2130
+
2131
+ if ((error = file_owner_sid(&owner_sid, path)) < 0 ||
2132
+ (error = current_user_sid(&user_sid)) < 0)
2133
+ goto done;
2134
+
2135
+ *out = EqualSid(owner_sid, user_sid);
2136
+ error = 0;
2137
+
2138
+ done:
2139
+ git__free(owner_sid);
2140
+ git__free(user_sid);
2141
+ return error;
2142
+ }
2143
+
2144
+ int git_path_owner_is_system(bool *out, const char *path)
2145
+ {
2146
+ PSID owner_sid;
2147
+
2148
+ if (mock_owner) {
2149
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_SYSTEM);
2150
+ return 0;
2058
2151
  }
2059
2152
 
2060
- if (!IsValidSid(owner_sid)) {
2061
- git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is unknown");
2062
- ret = GIT_ERROR;
2063
- goto cleanup;
2153
+ if (file_owner_sid(&owner_sid, path) < 0)
2154
+ return -1;
2155
+
2156
+ *out = IsWellKnownSid(owner_sid, WinBuiltinAdministratorsSid) ||
2157
+ IsWellKnownSid(owner_sid, WinLocalSystemSid);
2158
+
2159
+ git__free(owner_sid);
2160
+ return 0;
2161
+ }
2162
+
2163
+ int git_path_owner_is_system_or_current_user(bool *out, const char *path)
2164
+ {
2165
+ PSID owner_sid = NULL, user_sid = NULL;
2166
+ int error = -1;
2167
+
2168
+ if (mock_owner) {
2169
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_SYSTEM ||
2170
+ mock_owner == GIT_PATH_MOCK_OWNER_CURRENT_USER);
2171
+ return 0;
2064
2172
  }
2065
2173
 
2174
+ if (file_owner_sid(&owner_sid, path) < 0)
2175
+ goto done;
2176
+
2066
2177
  if (IsWellKnownSid(owner_sid, WinBuiltinAdministratorsSid) ||
2067
2178
  IsWellKnownSid(owner_sid, WinLocalSystemSid)) {
2068
- ret = GIT_OK;
2069
- goto cleanup;
2070
- }
2071
-
2072
- /* Obtain current user's SID */
2073
- if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) &&
2074
- !GetTokenInformation(token, TokenUser, NULL, 0, &len)) {
2075
- info = git__malloc(len);
2076
- GIT_ERROR_CHECK_ALLOC(info);
2077
- if (!GetTokenInformation(token, TokenUser, info, len, &len)) {
2078
- git__free(info);
2079
- info = NULL;
2179
+ *out = 1;
2180
+ error = 0;
2181
+ goto done;
2182
+ }
2183
+
2184
+ if (current_user_sid(&user_sid) < 0)
2185
+ goto done;
2186
+
2187
+ *out = EqualSid(owner_sid, user_sid);
2188
+ error = 0;
2189
+
2190
+ done:
2191
+ git__free(owner_sid);
2192
+ git__free(user_sid);
2193
+ return error;
2194
+ }
2195
+
2196
+ #else
2197
+
2198
+ static int path_owner_is(bool *out, const char *path, uid_t *uids, size_t uids_len)
2199
+ {
2200
+ struct stat st;
2201
+ size_t i;
2202
+
2203
+ *out = false;
2204
+
2205
+ if (p_lstat(path, &st) != 0) {
2206
+ if (errno == ENOENT)
2207
+ return GIT_ENOTFOUND;
2208
+
2209
+ git_error_set(GIT_ERROR_OS, "could not stat '%s'", path);
2210
+ return -1;
2211
+ }
2212
+
2213
+ for (i = 0; i < uids_len; i++) {
2214
+ if (uids[i] == st.st_uid) {
2215
+ *out = true;
2216
+ break;
2080
2217
  }
2081
2218
  }
2082
2219
 
2083
- /*
2084
- * If the file is owned by the same account that is running the current
2085
- * process, it's okay to read from that file.
2086
- */
2087
- if (info && EqualSid(owner_sid, info->User.Sid))
2088
- ret = GIT_OK;
2089
- else {
2090
- git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is not valid");
2091
- ret = GIT_ERROR;
2220
+ return 0;
2221
+ }
2222
+
2223
+ int git_path_owner_is_current_user(bool *out, const char *path)
2224
+ {
2225
+ uid_t userid = geteuid();
2226
+
2227
+ if (mock_owner) {
2228
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_CURRENT_USER);
2229
+ return 0;
2092
2230
  }
2093
- git__free(info);
2094
2231
 
2095
- cleanup:
2096
- if (descriptor)
2097
- LocalFree(descriptor);
2232
+ return path_owner_is(out, path, &userid, 1);
2233
+ }
2098
2234
 
2099
- return ret;
2100
- #endif
2235
+ int git_path_owner_is_system(bool *out, const char *path)
2236
+ {
2237
+ uid_t userid = 0;
2238
+
2239
+ if (mock_owner) {
2240
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_SYSTEM);
2241
+ return 0;
2242
+ }
2243
+
2244
+ return path_owner_is(out, path, &userid, 1);
2245
+ }
2246
+
2247
+ int git_path_owner_is_system_or_current_user(bool *out, const char *path)
2248
+ {
2249
+ uid_t userids[2] = { geteuid(), 0 };
2250
+
2251
+ if (mock_owner) {
2252
+ *out = (mock_owner == GIT_PATH_MOCK_OWNER_SYSTEM ||
2253
+ mock_owner == GIT_PATH_MOCK_OWNER_CURRENT_USER);
2254
+ return 0;
2255
+ }
2256
+
2257
+ return path_owner_is(out, path, userids, 2);
2101
2258
  }
2259
+
2260
+ #endif
@@ -722,16 +722,36 @@ int git_path_normalize_slashes(git_buf *out, const char *path);
722
722
 
723
723
  bool git_path_supports_symlinks(const char *dir);
724
724
 
725
+ typedef enum {
726
+ GIT_PATH_MOCK_OWNER_NONE = 0, /* do filesystem lookups as normal */
727
+ GIT_PATH_MOCK_OWNER_SYSTEM = 1,
728
+ GIT_PATH_MOCK_OWNER_CURRENT_USER = 2,
729
+ GIT_PATH_MOCK_OWNER_OTHER = 3
730
+ } git_path__mock_owner_t;
731
+
732
+ /**
733
+ * Sets the mock ownership for files; subsequent calls to
734
+ * `git_path_owner_is_*` functions will return this data until cleared
735
+ * with `GIT_PATH_MOCK_OWNER_NONE`.
736
+ */
737
+ void git_path__set_owner(git_path__mock_owner_t owner);
738
+
725
739
  /**
726
- * Validate a system file's ownership
727
- *
728
740
  * Verify that the file in question is owned by an administrator or system
729
- * account, or at least by the current user.
730
- *
731
- * This function returns 0 if successful. If the file is not owned by any of
732
- * these, or any other if there have been problems determining the file
733
- * ownership, it returns -1.
741
+ * account.
742
+ */
743
+ int git_path_owner_is_system(bool *out, const char *path);
744
+
745
+ /**
746
+ * Verify that the file in question is owned by the current user;
747
+ */
748
+
749
+ int git_path_owner_is_current_user(bool *out, const char *path);
750
+
751
+ /**
752
+ * Verify that the file in question is owned by an administrator or system
753
+ * account _or_ the current user;
734
754
  */
735
- int git_path_validate_system_file_ownership(const char *path);
755
+ int git_path_owner_is_system_or_current_user(bool *out, const char *path);
736
756
 
737
757
  #endif
@@ -38,6 +38,7 @@
38
38
  # include "win32/w32_util.h"
39
39
  #endif
40
40
 
41
+ bool git_repository__validate_ownership = true;
41
42
  bool git_repository__fsync_gitdir = false;
42
43
 
43
44
  static const struct {
@@ -64,6 +65,7 @@ static const struct {
64
65
 
65
66
  static int check_repositoryformatversion(int *version, git_config *config);
66
67
  static int check_extensions(git_config *config, int version);
68
+ static int load_global_config(git_config **config);
67
69
 
68
70
  #define GIT_COMMONDIR_FILE "commondir"
69
71
  #define GIT_GITDIR_FILE "gitdir"
@@ -482,6 +484,63 @@ static int read_gitfile(git_buf *path_out, const char *file_path)
482
484
  return error;
483
485
  }
484
486
 
487
+ typedef struct {
488
+ const char *repo_path;
489
+ git_buf tmp;
490
+ bool is_safe;
491
+ } validate_ownership_data;
492
+
493
+ static int validate_ownership_cb(const git_config_entry *entry, void *payload)
494
+ {
495
+ validate_ownership_data *data = payload;
496
+
497
+ if (strcmp(entry->value, "") == 0)
498
+ data->is_safe = false;
499
+
500
+ if (git_path_prettify_dir(&data->tmp, entry->value, NULL) == 0 &&
501
+ strcmp(data->tmp.ptr, data->repo_path) == 0)
502
+ data->is_safe = true;
503
+
504
+ return 0;
505
+ }
506
+
507
+ static int validate_ownership(const char *repo_path)
508
+ {
509
+ git_config *config = NULL;
510
+ validate_ownership_data data = { repo_path, GIT_BUF_INIT, false };
511
+ bool is_safe;
512
+ int error;
513
+
514
+ if ((error = git_path_owner_is_current_user(&is_safe, repo_path)) < 0) {
515
+ if (error == GIT_ENOTFOUND)
516
+ error = 0;
517
+
518
+ goto done;
519
+ }
520
+
521
+ if (is_safe) {
522
+ error = 0;
523
+ goto done;
524
+ }
525
+
526
+ if (load_global_config(&config) == 0) {
527
+ error = git_config_get_multivar_foreach(config, "safe.directory", NULL, validate_ownership_cb, &data);
528
+
529
+ if (!error && data.is_safe)
530
+ goto done;
531
+ }
532
+
533
+ git_error_set(GIT_ERROR_CONFIG,
534
+ "repository path '%s' is not owned by current user",
535
+ repo_path);
536
+ error = GIT_EOWNER;
537
+
538
+ done:
539
+ git_config_free(config);
540
+ git_buf_dispose(&data.tmp);
541
+ return error;
542
+ }
543
+
485
544
  static int find_repo(
486
545
  git_buf *gitdir_path,
487
546
  git_buf *workdir_path,
@@ -855,6 +914,7 @@ int git_repository_open_ext(
855
914
  gitlink = GIT_BUF_INIT, commondir = GIT_BUF_INIT;
856
915
  git_repository *repo = NULL;
857
916
  git_config *config = NULL;
917
+ const char *validation_path;
858
918
  int version = 0;
859
919
 
860
920
  if (flags & GIT_REPOSITORY_OPEN_FROM_ENV)
@@ -903,16 +963,24 @@ int git_repository_open_ext(
903
963
  if ((error = check_extensions(config, version)) < 0)
904
964
  goto cleanup;
905
965
 
906
- if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0)
966
+ if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0) {
907
967
  repo->is_bare = 1;
908
- else {
909
-
968
+ } else {
910
969
  if (config &&
911
970
  ((error = load_config_data(repo, config)) < 0 ||
912
971
  (error = load_workdir(repo, config, &workdir)) < 0))
913
972
  goto cleanup;
914
973
  }
915
974
 
975
+ /*
976
+ * Ensure that the git directory is owned by the current user.
977
+ */
978
+ validation_path = repo->is_bare ? repo->gitdir : repo->workdir;
979
+
980
+ if (git_repository__validate_ownership &&
981
+ (error = validate_ownership(validation_path)) < 0)
982
+ goto cleanup;
983
+
916
984
  cleanup:
917
985
  git_buf_dispose(&gitdir);
918
986
  git_buf_dispose(&workdir);
@@ -1609,13 +1677,40 @@ static bool is_filesystem_case_insensitive(const char *gitdir_path)
1609
1677
  return is_insensitive;
1610
1678
  }
1611
1679
 
1612
- static bool are_symlinks_supported(const char *wd_path)
1680
+ /*
1681
+ * Return a configuration object with only the global and system
1682
+ * configurations; no repository-level configuration.
1683
+ */
1684
+ static int load_global_config(git_config **config)
1613
1685
  {
1614
- git_config *config = NULL;
1615
1686
  git_buf global_buf = GIT_BUF_INIT;
1616
1687
  git_buf xdg_buf = GIT_BUF_INIT;
1617
1688
  git_buf system_buf = GIT_BUF_INIT;
1618
1689
  git_buf programdata_buf = GIT_BUF_INIT;
1690
+ int error;
1691
+
1692
+ git_config_find_global(&global_buf);
1693
+ git_config_find_xdg(&xdg_buf);
1694
+ git_config_find_system(&system_buf);
1695
+ git_config_find_programdata(&programdata_buf);
1696
+
1697
+ error = load_config(config, NULL,
1698
+ path_unless_empty(&global_buf),
1699
+ path_unless_empty(&xdg_buf),
1700
+ path_unless_empty(&system_buf),
1701
+ path_unless_empty(&programdata_buf));
1702
+
1703
+ git_buf_dispose(&global_buf);
1704
+ git_buf_dispose(&xdg_buf);
1705
+ git_buf_dispose(&system_buf);
1706
+ git_buf_dispose(&programdata_buf);
1707
+
1708
+ return error;
1709
+ }
1710
+
1711
+ static bool are_symlinks_supported(const char *wd_path)
1712
+ {
1713
+ git_config *config = NULL;
1619
1714
  int symlinks = 0;
1620
1715
 
1621
1716
  /*
@@ -1626,19 +1721,9 @@ static bool are_symlinks_supported(const char *wd_path)
1626
1721
  * _not_ set, then we do not test or enable symlink support.
1627
1722
  */
1628
1723
  #ifdef GIT_WIN32
1629
- git_config_find_global(&global_buf);
1630
- git_config_find_xdg(&xdg_buf);
1631
- git_config_find_system(&system_buf);
1632
- git_config_find_programdata(&programdata_buf);
1633
-
1634
- if (load_config(&config, NULL,
1635
- path_unless_empty(&global_buf),
1636
- path_unless_empty(&xdg_buf),
1637
- path_unless_empty(&system_buf),
1638
- path_unless_empty(&programdata_buf)) < 0)
1639
- goto done;
1640
-
1641
- if (git_config_get_bool(&symlinks, config, "core.symlinks") < 0 || !symlinks)
1724
+ if (load_global_config(&config) < 0 ||
1725
+ git_config_get_bool(&symlinks, config, "core.symlinks") < 0 ||
1726
+ !symlinks)
1642
1727
  goto done;
1643
1728
  #endif
1644
1729
 
@@ -1646,10 +1731,6 @@ static bool are_symlinks_supported(const char *wd_path)
1646
1731
  goto done;
1647
1732
 
1648
1733
  done:
1649
- git_buf_dispose(&global_buf);
1650
- git_buf_dispose(&xdg_buf);
1651
- git_buf_dispose(&system_buf);
1652
- git_buf_dispose(&programdata_buf);
1653
1734
  git_config_free(config);
1654
1735
  return symlinks != 0;
1655
1736
  }
@@ -34,6 +34,7 @@
34
34
  #define GIT_DIR_SHORTNAME "GIT~1"
35
35
 
36
36
  extern bool git_repository__fsync_gitdir;
37
+ extern bool git_repository__validate_ownership;
37
38
 
38
39
  /** Cvar cache identifiers */
39
40
  typedef enum {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rugged
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-01-28 00:00:00.000000000 Z
12
+ date: 2022-04-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake-compiler
@@ -697,7 +697,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
697
697
  - !ruby/object:Gem::Version
698
698
  version: '0'
699
699
  requirements: []
700
- rubygems_version: 3.4.0.dev
700
+ rubygems_version: 3.2.33
701
701
  signing_key:
702
702
  specification_version: 4
703
703
  summary: Rugged is a Ruby binding to the libgit2 linkable library