+ 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:
parent
e642c2e332
commit
0603a50597
107
timezone-2016g-absolute-TZDEFAULT.patch
Normal file
107
timezone-2016g-absolute-TZDEFAULT.patch
Normal 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
|
||||||
|
|
@ -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:
|
- timezone update 2016g:
|
||||||
* Turkey will remain on UTC+03 after 2016-10-30 bsc#997830
|
* 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-revert-03-39fd078a6.patch
|
||||||
tzcode-symlink.patch
|
tzcode-symlink.patch
|
||||||
tzcode-zic.diff
|
tzcode-zic.diff
|
||||||
+ tzcode-fromname.patch was updated to continue ensure correct
|
tzcode-fromname.patch
|
||||||
path exansion, preventing bsc#1003324
|
+ 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
|
* zdump has a new -i option to generate transitions in a
|
||||||
more-compact but still human-readable format. (experimental)
|
more-compact but still human-readable format. (experimental)
|
||||||
|
|
||||||
|
@ -34,8 +34,8 @@ Source3: https://www.iana.org/time-zones/repository/releases/tzcode%{vers
|
|||||||
Source4: %{name}.keyring
|
Source4: %{name}.keyring
|
||||||
Source5: %{name}.changes
|
Source5: %{name}.changes
|
||||||
Patch0: tzdata-china.diff
|
Patch0: tzdata-china.diff
|
||||||
Patch2: tzcode-fromname.patch
|
|
||||||
Patch3: iso3166-uk.diff
|
Patch3: iso3166-uk.diff
|
||||||
|
Patch4: timezone-2016g-absolute-TZDEFAULT.patch
|
||||||
# COMMON-END
|
# COMMON-END
|
||||||
# COMMON-END
|
# COMMON-END
|
||||||
Url: http://www.gnu.org/software/libc/libc.html
|
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
|
||||||
# COMMON-PREP-BEGIN
|
# COMMON-PREP-BEGIN
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
|
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
|
||||||
# COMMON-PREP-END
|
# COMMON-PREP-END
|
||||||
# COMMON-PREP-END
|
# COMMON-PREP-END
|
||||||
|
@ -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:
|
- timezone update 2016g:
|
||||||
* Turkey will remain on UTC+03 after 2016-10-30 bsc#997830
|
* 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-revert-03-39fd078a6.patch
|
||||||
tzcode-symlink.patch
|
tzcode-symlink.patch
|
||||||
tzcode-zic.diff
|
tzcode-zic.diff
|
||||||
+ tzcode-fromname.patch was updated to continue ensure correct
|
tzcode-fromname.patch
|
||||||
path exansion, preventing bsc#1003324
|
+ 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
|
* zdump has a new -i option to generate transitions in a
|
||||||
more-compact but still human-readable format. (experimental)
|
more-compact but still human-readable format. (experimental)
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ Source3: https://www.iana.org/time-zones/repository/releases/tzcode%{vers
|
|||||||
Source4: %{name}.keyring
|
Source4: %{name}.keyring
|
||||||
Source5: %{name}.changes
|
Source5: %{name}.changes
|
||||||
Patch0: tzdata-china.diff
|
Patch0: tzdata-china.diff
|
||||||
Patch2: tzcode-fromname.patch
|
|
||||||
Patch3: iso3166-uk.diff
|
Patch3: iso3166-uk.diff
|
||||||
|
Patch4: timezone-2016g-absolute-TZDEFAULT.patch
|
||||||
# COMMON-END
|
# COMMON-END
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
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
|
%setup -q -c -a 1
|
||||||
# COMMON-PREP-BEGIN
|
# COMMON-PREP-BEGIN
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
|
sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358]
|
||||||
# COMMON-PREP-END
|
# COMMON-PREP-END
|
||||||
|
|
||||||
|
@ -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)
|
|
Loading…
x
Reference in New Issue
Block a user