summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorColin Guthrie <colin@mageia.org>2012-03-14 01:41:48 +0000
committerColin Guthrie <colin@mageia.org>2012-03-28 11:17:29 +0100
commit664985b7c2fdcc218b4c649f8b52f5047d778659 (patch)
treef7bef2988817c3a47f107e2a0bd6bce97039bed7 /src
parent5e9e0d50863b60c329cfc8ab85164fe7f7111532 (diff)
downloadpulseaudio-664985b7c2fdcc218b4c649f8b52f5047d778659.tar.gz
core-util: Attempt to make runtime paths smaller to avoid 108 char limit.
When the runtime path gets long (which can happen on some NFS mounts where $HOME is not just /home/$USER), it can grow longer the 108 char limit imposed by sockaddr_un.sun_path. This just calls realpath which should ultimately point into /tmp in most cases and result in a much smaller path. Only do this when we are adding on a name component to the runtime path so creating the actual symlink will still get the original, long name, but this shouldn't be a problem as it never goes into the sockaddr_un.sun_path. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=44680
Diffstat (limited to 'src')
-rw-r--r--src/pulsecore/core-util.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 1aa5a9a6e..61f980e7d 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1980,7 +1980,7 @@ static char *get_path(const char *fn, pa_bool_t prependmid, pa_bool_t rt) {
rtp = rt ? pa_get_runtime_dir() : pa_get_state_dir();
if (fn) {
- char *r;
+ char *r, *canonical_rtp;
if (pa_is_path_absolute(fn)) {
pa_xfree(rtp);
@@ -1990,20 +1990,31 @@ static char *get_path(const char *fn, pa_bool_t prependmid, pa_bool_t rt) {
if (!rtp)
return NULL;
+ /* Hopefully make the path smaller to avoid 108 char limit (fdo#44680) */
+ if ((canonical_rtp = pa_realpath(rtp))) {
+ if (strlen(rtp) >= strlen(canonical_rtp))
+ pa_xfree(rtp);
+ else {
+ pa_xfree(canonical_rtp);
+ canonical_rtp = rtp;
+ }
+ } else
+ canonical_rtp = rtp;
+
if (prependmid) {
char *mid;
if (!(mid = pa_machine_id())) {
- pa_xfree(rtp);
+ pa_xfree(canonical_rtp);
return NULL;
}
- r = pa_sprintf_malloc("%s" PA_PATH_SEP "%s-%s", rtp, mid, fn);
+ r = pa_sprintf_malloc("%s" PA_PATH_SEP "%s-%s", canonical_rtp, mid, fn);
pa_xfree(mid);
} else
- r = pa_sprintf_malloc("%s" PA_PATH_SEP "%s", rtp, fn);
+ r = pa_sprintf_malloc("%s" PA_PATH_SEP "%s", canonical_rtp, fn);
- pa_xfree(rtp);
+ pa_xfree(canonical_rtp);
return r;
} else
return rtp;