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
This commit is contained in:
Colin Guthrie 2012-03-14 01:41:48 +00:00
parent 5e9e0d5086
commit 664985b7c2

View file

@ -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;