diff options
| author | Paul Eggert | 2019-04-20 09:31:47 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-04-20 09:40:10 -0700 |
| commit | b3a12c62c9085171866256f00dada4326a4a3084 (patch) | |
| tree | f16ec0bf97b7cd85313dd1576e7ec176def06303 /lib-src | |
| parent | a85befa4aa52033bd6d9927144b358529ec2b360 (diff) | |
| download | emacs-b3a12c62c9085171866256f00dada4326a4a3084.tar.gz emacs-b3a12c62c9085171866256f00dada4326a4a3084.zip | |
Improve XDG_RUNTIME_DIR diagnostic
* lib-src/emacsclient.c (set_local_socket):
If there appears to be an XDG runtime directory for the user
but XDG_RUNTIME_DIR is unset, suggest setting it while warning
about potential security issues (Bug#35300).
Diffstat (limited to 'lib-src')
| -rw-r--r-- | lib-src/emacsclient.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index f4768408980..5871a18ce69 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c | |||
| @@ -1357,6 +1357,7 @@ set_local_socket (char const *server_name) | |||
| 1357 | int tmpdirlen = -1; | 1357 | int tmpdirlen = -1; |
| 1358 | int socknamelen = -1; | 1358 | int socknamelen = -1; |
| 1359 | uid_t uid = geteuid (); | 1359 | uid_t uid = geteuid (); |
| 1360 | bool tmpdir_used = false; | ||
| 1360 | 1361 | ||
| 1361 | if (strchr (server_name, '/') | 1362 | if (strchr (server_name, '/') |
| 1362 | || (ISSLASH ('\\') && strchr (server_name, '\\'))) | 1363 | || (ISSLASH ('\\') && strchr (server_name, '\\'))) |
| @@ -1389,6 +1390,7 @@ set_local_socket (char const *server_name) | |||
| 1389 | } | 1390 | } |
| 1390 | socknamelen = local_sockname (sockname, socknamesize, tmpdirlen, | 1391 | socknamelen = local_sockname (sockname, socknamesize, tmpdirlen, |
| 1391 | uid, server_name); | 1392 | uid, server_name); |
| 1393 | tmpdir_used = true; | ||
| 1392 | } | 1394 | } |
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
| @@ -1462,11 +1464,27 @@ set_local_socket (char const *server_name) | |||
| 1462 | if (sock_status < 0) | 1464 | if (sock_status < 0) |
| 1463 | message (true, "%s: Invalid socket owner\n", progname); | 1465 | message (true, "%s: Invalid socket owner\n", progname); |
| 1464 | else if (sock_status == ENOENT) | 1466 | else if (sock_status == ENOENT) |
| 1465 | message (true, | 1467 | { |
| 1466 | ("%s: can't find socket; have you started the server?\n" | 1468 | if (tmpdir_used) |
| 1467 | "%s: To start the server in Emacs," | 1469 | { |
| 1468 | " type \"M-x server-start\".\n"), | 1470 | uintmax_t id = uid; |
| 1469 | progname, progname); | 1471 | char sockdirname[socknamesize]; |
| 1472 | int sockdirnamelen = snprintf (sockdirname, sizeof sockdirname, | ||
| 1473 | "/run/user/%"PRIuMAX, id); | ||
| 1474 | if (0 <= sockdirnamelen && sockdirnamelen < sizeof sockdirname | ||
| 1475 | && euidaccess (sockdirname, X_OK) == 0) | ||
| 1476 | message | ||
| 1477 | (true, | ||
| 1478 | ("%s: Should XDG_RUNTIME_DIR='%s' be in the environment?\n" | ||
| 1479 | "%s: (Be careful: XDG_RUNTIME_DIR is security-related.)\n"), | ||
| 1480 | progname, sockdirname, progname); | ||
| 1481 | } | ||
| 1482 | message (true, | ||
| 1483 | ("%s: can't find socket; have you started the server?\n" | ||
| 1484 | "%s: To start the server in Emacs," | ||
| 1485 | " type \"M-x server-start\".\n"), | ||
| 1486 | progname, progname); | ||
| 1487 | } | ||
| 1470 | else | 1488 | else |
| 1471 | message (true, "%s: can't stat %s: %s\n", | 1489 | message (true, "%s: can't stat %s: %s\n", |
| 1472 | progname, sockname, strerror (sock_status)); | 1490 | progname, sockname, strerror (sock_status)); |