+ Upstream changes did not account for TZDEFAULT being an

absolute path. Prevent broken symlinks (bsc#1003324),
      add timezone-2016g-absolute-TZDEFAULT.patch
      tzcode-fromname.patch

OBS-URL: https://build.opensuse.org/package/show/Base:System/timezone?expand=0&rev=197
This commit is contained in:
Andreas Stieger 2016-10-06 19:21:34 +00:00 committed by Git OBS Bridge
parent e642c2e332
commit 0603a50597
6 changed files with 121 additions and 80 deletions

View File

@ -0,0 +1,107 @@
From df9991a2186d4236ba1e97e6638fa53b578bc6d7 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Thu, 6 Oct 2016 11:47:17 -0700
Subject: [PATCH] Do not assume TZDEFAULT is relative.
Problem reported by Andreas Stieger in:
http://mm.icann.org/pipermail/tz/2016-October/024280.html
* NEWS: Document this.
* zic.c (relname): New function.
(dolink): Use it.
---
zic.c | 65 ++++++++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 44 insertions(+), 21 deletions(-)
---
Fixes: https://bugzilla.suse.com/show_bug.cgi?id=1003324
diff --git a/zic.c b/zic.c
index 2505c11..eba223c 100644
--- a/zic.c
+++ b/zic.c
@@ -764,6 +764,44 @@ namecheck(const char *name)
return componentcheck(name, component, cp);
}
+/* Create symlink contents suitable for symlinking FROM to TO, as a
+ freshly allocated string. FROM should be a relative file name, and
+ is relative to the global variable DIRECTORY. TO can be either
+ relative or absolute. */
+static char *
+relname(char const *from, char const *to)
+{
+ size_t i, taillen, dotdotetcsize;
+ size_t dir_len = 0, dotdots = 0, linksize = SIZE_MAX;
+ char const *f = from;
+ char *result = NULL;
+ if (*to == '/') {
+ /* Make F absolute too. */
+ size_t len = strlen(directory);
+ bool needslash = len && directory[len - 1] != '/';
+ linksize = len + needslash + strlen(from) + 1;
+ f = result = emalloc(linksize);
+ strcpy(result, directory);
+ result[len] = '/';
+ strcpy(result + len + needslash, from);
+ }
+ for (i = 0; f[i] && f[i] == to[i]; i++)
+ if (f[i] == '/')
+ dir_len = i + 1;
+ for (; f[i]; i++)
+ dotdots += f[i] == '/' && f[i - 1] != '/';
+ taillen = i - dir_len;
+ dotdotetcsize = 3 * dotdots + taillen + 1;
+ if (dotdotetcsize <= linksize) {
+ if (!result)
+ result = emalloc(dotdotetcsize);
+ for (i = 0; i < dotdots; i++)
+ memcpy(result + 3 * i, "../", 3);
+ memmove(result + 3 * dotdots, f + dir_len, taillen + 1);
+ }
+ return result;
+}
+
static void
dolink(char const *fromfield, char const *tofield, bool staysymlink)
{
@@ -800,30 +838,15 @@ dolink(char const *fromfield, char const *tofield, bool staysymlink)
link_errno = link(fromfield, tofield) == 0 ? 0 : errno;
}
if (link_errno != 0) {
- const char *s = fromfield;
- const char *t;
- char *p;
- size_t dotdots = 0;
- char *symlinkcontents;
- int symlink_errno;
-
- do
- t = s;
- while ((s = strchr(s, '/'))
- && strncmp(fromfield, tofield, ++s - fromfield) == 0);
-
- for (s = tofield + (t - fromfield); *s; s++)
- dotdots += *s == '/';
- symlinkcontents = emalloc(3 * dotdots + strlen(t) + 1);
- for (p = symlinkcontents; dotdots-- != 0; p += 3)
- memcpy(p, "../", 3);
- strcpy(p, t);
- symlink_errno = symlink(symlinkcontents, tofield) == 0 ? 0 : errno;
+ bool absolute = *fromfield == '/';
+ char *linkalloc = absolute ? NULL : relname(fromfield, tofield);
+ char const *contents = absolute ? fromfield : linkalloc;
+ int symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
if (symlink_errno == ENOENT && !todirs_made) {
mkdirs(tofield, true);
- symlink_errno = symlink(symlinkcontents, tofield) == 0 ? 0 : errno;
+ symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
}
- free(symlinkcontents);
+ free(linkalloc);
if (symlink_errno == 0) {
if (link_errno != ENOTSUP)
warning(_("symbolic link used because hard link failed: %s"),
--
2.10.1

View File

@ -1,5 +1,5 @@
-------------------------------------------------------------------
Thu Oct 6 13:38:20 UTC 2016 - astieger@suse.com
Thu Oct 6 19:14:45 UTC 2016 - astieger@suse.com
- timezone update 2016g:
* Turkey will remain on UTC+03 after 2016-10-30 bsc#997830
@ -26,8 +26,10 @@ Thu Oct 6 13:38:20 UTC 2016 - astieger@suse.com
tzcode-revert-03-39fd078a6.patch
tzcode-symlink.patch
tzcode-zic.diff
+ tzcode-fromname.patch was updated to continue ensure correct
path exansion, preventing bsc#1003324
tzcode-fromname.patch
+ Upstream changes did not account for TZDEFAULT being an
absolute path. Prevent broken symlinks (bsc#1003324),
add timezone-2016g-absolute-TZDEFAULT.patch
* zdump has a new -i option to generate transitions in a
more-compact but still human-readable format. (experimental)

View File

@ -34,8 +34,8 @@ Source3: https://www.iana.org/time-zones/repository/releases/tzcode%{vers
Source4: %{name}.keyring
Source5: %{name}.changes
Patch0: tzdata-china.diff
Patch2: tzcode-fromname.patch
Patch3: iso3166-uk.diff
Patch4: timezone-2016g-absolute-TZDEFAULT.patch
# COMMON-END
# COMMON-END
Url: http://www.gnu.org/software/libc/libc.html
@ -56,8 +56,8 @@ package is intended for Java Virtual Machine based on OpenJDK.
# COMMON-PREP-BEGIN
# COMMON-PREP-BEGIN
%patch0 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
# COMMON-PREP-END
# COMMON-PREP-END

View File

@ -1,5 +1,5 @@
-------------------------------------------------------------------
Thu Oct 6 13:38:20 UTC 2016 - astieger@suse.com
Thu Oct 6 19:14:45 UTC 2016 - astieger@suse.com
- timezone update 2016g:
* Turkey will remain on UTC+03 after 2016-10-30 bsc#997830
@ -26,8 +26,10 @@ Thu Oct 6 13:38:20 UTC 2016 - astieger@suse.com
tzcode-revert-03-39fd078a6.patch
tzcode-symlink.patch
tzcode-zic.diff
+ tzcode-fromname.patch was updated to continue ensure correct
path exansion, preventing bsc#1003324
tzcode-fromname.patch
+ Upstream changes did not account for TZDEFAULT being an
absolute path. Prevent broken symlinks (bsc#1003324),
add timezone-2016g-absolute-TZDEFAULT.patch
* zdump has a new -i option to generate transitions in a
more-compact but still human-readable format. (experimental)

View File

@ -32,8 +32,8 @@ Source3: https://www.iana.org/time-zones/repository/releases/tzcode%{vers
Source4: %{name}.keyring
Source5: %{name}.changes
Patch0: tzdata-china.diff
Patch2: tzcode-fromname.patch
Patch3: iso3166-uk.diff
Patch4: timezone-2016g-absolute-TZDEFAULT.patch
# COMMON-END
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@ -50,8 +50,8 @@ can select an appropriate time zone for your system with YaST.
%setup -q -c -a 1
# COMMON-PREP-BEGIN
%patch0 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
# COMMON-PREP-END

View File

@ -1,70 +0,0 @@
From: Andreas Stieger <astieger@suse.com>
Date: Thu, 06 Oct 2016 13:26:04 +0000
References: bsc#845530 bsc#1003324
This patch ensures correct path expansion for the local time zone link.
The 2016g release re-worked much of the code, however the problem
with broken symlinks remain.
Brought up on mailing list:
http://mm.icann.org/pipermail/tz/2016-October/024280.html
Index: timezone-2016g/zic.c
===================================================================
--- timezone-2016g.orig/zic.c 2016-09-06 04:39:50.000000000 +0000
+++ timezone-2016g/zic.c 2016-10-06 13:18:13.752297564 +0000
@@ -764,12 +764,32 @@ namecheck(const char *name)
return componentcheck(name, component, cp);
}
+static char *
+relname(char const *dir, char const *base)
+{
+ if (*base == '/')
+ return ecpyalloc(base);
+ else {
+ size_t dir_len = strlen(dir);
+ bool needs_slash = dir_len && dir[dir_len - 1] != '/';
+ char *result = emalloc(dir_len + needs_slash + strlen(base) + 1);
+ result[dir_len] = '/';
+ strcpy(result + dir_len + needs_slash, base);
+ return memcpy(result, dir, dir_len);
+ }
+}
+
static void
dolink(char const *fromfield, char const *tofield, bool staysymlink)
{
register int fromisdir;
bool todirs_made = false;
int link_errno;
+ register char * fromname;
+ register char * toname;
+
+ fromname = relname(directory, fromfield);
+ toname = relname(directory, tofield);
/*
** We get to be careful here since
@@ -800,7 +820,7 @@ dolink(char const *fromfield, char const
link_errno = link(fromfield, tofield) == 0 ? 0 : errno;
}
if (link_errno != 0) {
- const char *s = fromfield;
+ const char *s = fromname;
const char *t;
char *p;
size_t dotdots = 0;
@@ -810,9 +830,9 @@ dolink(char const *fromfield, char const
do
t = s;
while ((s = strchr(s, '/'))
- && strncmp(fromfield, tofield, ++s - fromfield) == 0);
+ && strncmp(fromname, tofield, ++s - fromname) == 0);
- for (s = tofield + (t - fromfield); *s; s++)
+ for (s = tofield + (t - fromname); *s; s++)
dotdots += *s == '/';
symlinkcontents = emalloc(3 * dotdots + strlen(t) + 1);
for (p = symlinkcontents; dotdots-- != 0; p += 3)