Skip to content

Commit 3fad508

Browse files
committed
Sync with 2.46.3
* maint-2.46: Git 2.46.3 Git 2.45.3 Git 2.44.3 Git 2.43.6 Git 2.42.4 Git 2.41.3 Git 2.40.4 credential: disallow Carriage Returns in the protocol by default credential: sanitize the user prompt credential_format(): also encode <host>[:<port>] t7300: work around platform-specific behaviour with long paths on MinGW compat/regex: fix argument order to calloc(3) mingw: drop bogus (and unneeded) declaration of `_pgmptr` ci: remove 'Upload failed tests' directories' step from linux32 jobs
2 parents 92999a4 + 5c21db3 commit 3fad508

17 files changed

+163
-41
lines changed

Documentation/RelNotes/2.40.4.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Git v2.40.4 Release Notes
2+
=========================
3+
4+
This release lets Git refuse to accept URLs that contain control
5+
sequences. This addresses CVE-2024-50349 and CVE-2024-52006.

Documentation/RelNotes/2.41.3.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Git v2.41.3 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.40.4 to address
5+
the security issues CVE-2024-50349 and CVE-2024-52006; see the
6+
release notes for that version for details.

Documentation/RelNotes/2.42.4.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Git v2.42.4 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.40.4 and v2.41.3
5+
to address the security issues CVE-2024-50349 and CVE-2024-52006;
6+
see the release notes for these versions for details.

Documentation/RelNotes/2.43.6.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.43.6 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.40.4, v2.41.3
5+
and v2.42.4 to address the security issues CVE-2024-50349 and
6+
CVE-2024-52006; see the release notes for these versions for
7+
details.

Documentation/RelNotes/2.44.3.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.44.3 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.40.4, v2.41.3,
5+
v2.42.4 and v2.43.6 to address the security issues CVE-2024-50349
6+
and CVE-2024-52006; see the release notes for these versions
7+
for details.

Documentation/RelNotes/2.45.3.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
Git v2.45.3 Release Notes
22
=========================
33

4-
This primarily is to backport various small fixes accumulated on the
4+
This release merges up the fix that appears in v2.40.4, v2.41.3,
5+
v2.42.4, v2.43.6 and v2.44.3 to address the security issues
6+
CVE-2024-50349 and CVE-2024-52006; see the release notes for
7+
these versions for details.
8+
9+
This version also backports various small fixes accumulated on the
510
'master' front during the development towards Git 2.46, the next
611
feature release.
712

Documentation/RelNotes/2.46.3.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Git v2.46.3 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4,
5+
v2.43.6, v2.44.3 and v2.45.3 to address the security issues CVE-2024-50349 and
6+
CVE-2024-52006; see the release notes for these versions for details.

Documentation/config/credential.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ credential.useHttpPath::
2222
or https URL to be important. Defaults to false. See
2323
linkgit:gitcredentials[7] for more information.
2424

25+
credential.sanitizePrompt::
26+
By default, user names and hosts that are shown as part of the
27+
password prompt are not allowed to contain control characters (they
28+
will be URL-encoded by default). Configure this setting to `false` to
29+
override that behavior.
30+
31+
credential.protectProtocol::
32+
By default, Carriage Return characters are not allowed in the protocol
33+
that is used when Git talks to a credential helper. This setting allows
34+
users to override this default.
35+
2536
credential.username::
2637
If no username is set for a network authentication, use this username
2738
by default. See credential.<context>.* below, and

credential.c

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "sigchain.h"
1313
#include "strbuf.h"
1414
#include "urlmatch.h"
15-
#include "git-compat-util.h"
15+
#include "environment.h"
1616
#include "trace2.h"
1717
#include "repository.h"
1818

@@ -129,6 +129,10 @@ static int credential_config_callback(const char *var, const char *value,
129129
}
130130
else if (!strcmp(key, "usehttppath"))
131131
c->use_http_path = git_config_bool(var, value);
132+
else if (!strcmp(key, "sanitizeprompt"))
133+
c->sanitize_prompt = git_config_bool(var, value);
134+
else if (!strcmp(key, "protectprotocol"))
135+
c->protect_protocol = git_config_bool(var, value);
132136

133137
return 0;
134138
}
@@ -226,7 +230,8 @@ static void credential_format(struct credential *c, struct strbuf *out)
226230
strbuf_addch(out, '@');
227231
}
228232
if (c->host)
229-
strbuf_addstr(out, c->host);
233+
strbuf_add_percentencode(out, c->host,
234+
STRBUF_ENCODE_HOST_AND_PORT);
230235
if (c->path) {
231236
strbuf_addch(out, '/');
232237
strbuf_add_percentencode(out, c->path, 0);
@@ -240,7 +245,10 @@ static char *credential_ask_one(const char *what, struct credential *c,
240245
struct strbuf prompt = STRBUF_INIT;
241246
char *r;
242247

243-
credential_describe(c, &desc);
248+
if (c->sanitize_prompt)
249+
credential_format(c, &desc);
250+
else
251+
credential_describe(c, &desc);
244252
if (desc.len)
245253
strbuf_addf(&prompt, "%s for '%s': ", what, desc.buf);
246254
else
@@ -381,7 +389,8 @@ int credential_read(struct credential *c, FILE *fp,
381389
return 0;
382390
}
383391

384-
static void credential_write_item(FILE *fp, const char *key, const char *value,
392+
static void credential_write_item(const struct credential *c,
393+
FILE *fp, const char *key, const char *value,
385394
int required)
386395
{
387396
if (!value && required)
@@ -390,41 +399,45 @@ static void credential_write_item(FILE *fp, const char *key, const char *value,
390399
return;
391400
if (strchr(value, '\n'))
392401
die("credential value for %s contains newline", key);
402+
if (c->protect_protocol && strchr(value, '\r'))
403+
die("credential value for %s contains carriage return\n"
404+
"If this is intended, set `credential.protectProtocol=false`",
405+
key);
393406
fprintf(fp, "%s=%s\n", key, value);
394407
}
395408

396409
void credential_write(const struct credential *c, FILE *fp,
397410
enum credential_op_type op_type)
398411
{
399412
if (credential_has_capability(&c->capa_authtype, op_type))
400-
credential_write_item(fp, "capability[]", "authtype", 0);
413+
credential_write_item(c, fp, "capability[]", "authtype", 0);
401414
if (credential_has_capability(&c->capa_state, op_type))
402-
credential_write_item(fp, "capability[]", "state", 0);
415+
credential_write_item(c, fp, "capability[]", "state", 0);
403416

404417
if (credential_has_capability(&c->capa_authtype, op_type)) {
405-
credential_write_item(fp, "authtype", c->authtype, 0);
406-
credential_write_item(fp, "credential", c->credential, 0);
418+
credential_write_item(c, fp, "authtype", c->authtype, 0);
419+
credential_write_item(c, fp, "credential", c->credential, 0);
407420
if (c->ephemeral)
408-
credential_write_item(fp, "ephemeral", "1", 0);
421+
credential_write_item(c, fp, "ephemeral", "1", 0);
409422
}
410-
credential_write_item(fp, "protocol", c->protocol, 1);
411-
credential_write_item(fp, "host", c->host, 1);
412-
credential_write_item(fp, "path", c->path, 0);
413-
credential_write_item(fp, "username", c->username, 0);
414-
credential_write_item(fp, "password", c->password, 0);
415-
credential_write_item(fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
423+
credential_write_item(c, fp, "protocol", c->protocol, 1);
424+
credential_write_item(c, fp, "host", c->host, 1);
425+
credential_write_item(c, fp, "path", c->path, 0);
426+
credential_write_item(c, fp, "username", c->username, 0);
427+
credential_write_item(c, fp, "password", c->password, 0);
428+
credential_write_item(c, fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
416429
if (c->password_expiry_utc != TIME_MAX) {
417430
char *s = xstrfmt("%"PRItime, c->password_expiry_utc);
418-
credential_write_item(fp, "password_expiry_utc", s, 0);
431+
credential_write_item(c, fp, "password_expiry_utc", s, 0);
419432
free(s);
420433
}
421434
for (size_t i = 0; i < c->wwwauth_headers.nr; i++)
422-
credential_write_item(fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
435+
credential_write_item(c, fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
423436
if (credential_has_capability(&c->capa_state, op_type)) {
424437
if (c->multistage)
425-
credential_write_item(fp, "continue", "1", 0);
438+
credential_write_item(c, fp, "continue", "1", 0);
426439
for (size_t i = 0; i < c->state_headers_to_send.nr; i++)
427-
credential_write_item(fp, "state[]", c->state_headers_to_send.v[i], 0);
440+
credential_write_item(c, fp, "state[]", c->state_headers_to_send.v[i], 0);
428441
}
429442
}
430443

credential.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ struct credential {
168168
multistage: 1,
169169
quit:1,
170170
use_http_path:1,
171-
username_from_proto:1;
171+
username_from_proto:1,
172+
sanitize_prompt:1,
173+
protect_protocol:1;
172174

173175
struct credential_capability capa_authtype;
174176
struct credential_capability capa_state;
@@ -195,6 +197,8 @@ struct credential {
195197
.wwwauth_headers = STRVEC_INIT, \
196198
.state_headers = STRVEC_INIT, \
197199
.state_headers_to_send = STRVEC_INIT, \
200+
.sanitize_prompt = 1, \
201+
.protect_protocol = 1, \
198202
}
199203

200204
/* Initialize a credential structure, setting all fields to empty. */

0 commit comments

Comments
 (0)