diff options
author | Colin Guthrie <colin@mageia.org> | 2012-03-14 01:41:48 +0000 |
---|---|---|
committer | Colin Guthrie <colin@mageia.org> | 2012-03-28 11:17:29 +0100 |
commit | 664985b7c2fdcc218b4c649f8b52f5047d778659 (patch) | |
tree | f7bef2988817c3a47f107e2a0bd6bce97039bed7 | |
parent | 5e9e0d50863b60c329cfc8ab85164fe7f7111532 (diff) |
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
-rw-r--r-- | src/pulsecore/core-util.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 1aa5a9a6..61f980e7 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; |