From 97ec1372334feff2b6bf0cee8ed37743d7e40bc9f4b7346dc48a0172329c6370 Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Thu, 22 May 2014 18:38:39 +0000 Subject: [PATCH] Accepting request 234890 from Base:System squashed sr234195 and re-submitted - Prevent excessive clock drift calculations (bnc#871698, util-linux-prevent-excessive-clock-drift-calculations.patch), committed by sbrabec@suse.cz (forwarded request 234334 from rudi_m) OBS-URL: https://build.opensuse.org/request/show/234890 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/util-linux?expand=0&rev=186 --- agetty-on-s390-on-dev-3270-tty1-line.patch | 61 +++++-- support-other-tty-lines-not-vconsole.patch | 104 +++++++++++ ...t-excessive-clock-drift-calculations.patch | 162 ++++++++++++++++++ util-linux.changes | 21 +++ util-linux.spec | 6 + 5 files changed, 344 insertions(+), 10 deletions(-) create mode 100644 support-other-tty-lines-not-vconsole.patch create mode 100644 util-linux-prevent-excessive-clock-drift-calculations.patch diff --git a/agetty-on-s390-on-dev-3270-tty1-line.patch b/agetty-on-s390-on-dev-3270-tty1-line.patch index 98997df..36b85e6 100644 --- a/agetty-on-s390-on-dev-3270-tty1-line.patch +++ b/agetty-on-s390-on-dev-3270-tty1-line.patch @@ -1,14 +1,21 @@ -Be aware that on s390 the 3270 terminal line is found at -/dev/3270/tty. That is that the baud speed rate numbers -have to be identified in a unique way. - --- - agetty.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) + login-utils/sulogin.c | 8 +++++++- + term-utils/agetty.c | 15 ++++++++++----- + 2 files changed, 17 insertions(+), 6 deletions(-) --- term-utils/agetty.c -+++ term-utils/agetty.c 2014-02-04 09:33:13.162735763 +0000 -@@ -568,6 +568,8 @@ static void login_options_to_argv(char * ++++ term-utils/agetty.c 2014-05-08 08:08:26.384484940 +0000 +@@ -51,7 +51,8 @@ + # define DEFAULT_VCTERM "linux" + # endif + # if defined (__s390__) || defined (__s390x__) +-# define DEFAULT_TTYS0 "ibm327x" ++# define DEFAULT_TTYS0 "dumb" ++# define DEFAULT_TTY32 "ibm327x" + # define DEFAULT_TTYS1 "vt220" + # endif + # ifndef DEFAULT_STERM +@@ -571,6 +572,8 @@ static void login_options_to_argv(char * *argc = i; } @@ -17,7 +24,7 @@ have to be identified in a unique way. /* Parse command-line arguments. */ static void parse_args(int argc, char **argv, struct options *op) { -@@ -746,7 +748,7 @@ static void parse_args(int argc, char ** +@@ -749,7 +752,7 @@ static void parse_args(int argc, char ** } /* Accept "tty", "baudrate tty", and "tty baudrate". */ @@ -26,7 +33,7 @@ have to be identified in a unique way. /* Assume BSD style speed. */ parse_speeds(op, argv[optind++]); if (argc < optind + 1) { -@@ -758,7 +760,7 @@ static void parse_args(int argc, char ** +@@ -761,7 +764,7 @@ static void parse_args(int argc, char ** op->tty = argv[optind++]; if (argc > optind) { char *v = argv[optind++]; @@ -35,3 +42,37 @@ have to be identified in a unique way. parse_speeds(op, v); else op->speeds[op->numspeed++] = bcode("9600"); +@@ -1071,9 +1074,11 @@ static void open_tty(char *tty, struct t + * higher. Whereas the second serial line on a S/390(x) is + * a real character terminal which is compatible with VT220. + */ +- if (strcmp(op->tty, "ttyS0") == 0) ++ if (strcmp(op->tty, "ttyS0") == 0) /* linux/drivers/s390/char/con3215.c */ + op->term = DEFAULT_TTYS0; +- else if (strcmp(op->tty, "ttyS1") == 0) ++ else if (strncmp(op->tty, "3270/tty", 8) == 0) /* linux/drivers/s390/char/con3270.c */ ++ op->term = DEFAULT_TTY32; ++ else if (strcmp(op->tty, "ttyS1") == 0) /* linux/drivers/s390/char/sclp_vt220.c */ + op->term = DEFAULT_TTYS1; + } + #endif +--- login-utils/sulogin.c ++++ login-utils/sulogin.c 2014-05-08 08:22:38.572781002 +0000 +@@ -189,10 +189,16 @@ static void tcfinal(struct console *con) + setenv("TERM", "linux", 1); + return; + } +- if (con->flags & CON_NOTTY) ++ if (con->flags & CON_NOTTY) { ++ setenv("TERM", "dumb", 1); + return; ++ } + ++#if defined (__s390__) || defined (__s390x__) ++ setenv("TERM", "dumb", 1); ++#else + setenv("TERM", "vt102", 1); ++#endif + tio = &con->tio; + fd = con->fd; + diff --git a/support-other-tty-lines-not-vconsole.patch b/support-other-tty-lines-not-vconsole.patch new file mode 100644 index 0000000..ce31fd0 --- /dev/null +++ b/support-other-tty-lines-not-vconsole.patch @@ -0,0 +1,104 @@ +--- + login-utils/sulogin.c | 17 ++++++++++++----- + term-utils/agetty.c | 23 +++++++++++------------ + 2 files changed, 23 insertions(+), 17 deletions(-) + +--- login-utils/sulogin.c ++++ login-utils/sulogin.c 2014-05-08 08:01:13.102622002 +0000 +@@ -49,6 +49,11 @@ + # include + #endif + ++#ifdef __linux__ ++# include ++# include ++#endif ++ + #include "c.h" + #include "closestream.h" + #include "nls.h" +@@ -142,10 +147,14 @@ static void tcinit(struct console *con) + return; + } + +- /* Handle serial lines here */ +- if (ioctl(fd, TIOCMGET, (char *) &mode) == 0) { ++ /* Handle lines other than virtual consoles here */ ++#if defined(KDGKBMODE) ++ if (ioctl(fd, KDGKBMODE, &mode) < 0) ++#endif ++ { + speed_t ispeed, ospeed; + struct winsize ws; ++ errno = 0; + + /* this is a modem line */ + con->flags |= CON_SERIAL; +@@ -191,9 +200,7 @@ static void tcinit(struct console *con) + goto setattr; + } + #if defined(IUTF8) && defined(KDGKBMODE) +- /* Detect mode of current keyboard setup, e.g. for UTF-8 */ +- if (ioctl(fd, KDGKBMODE, &mode) < 0) +- mode = K_RAW; ++ /* Handle mode of current keyboard setup, e.g. for UTF-8 */ + switch(mode) { + case K_UNICODE: + setlocale(LC_CTYPE, "C.UTF-8"); +--- term-utils/agetty.c ++++ term-utils/agetty.c 2014-05-08 08:02:16.786235584 +0000 +@@ -139,6 +139,7 @@ struct options { + int nice; /* Run login with this priority */ + int numspeed; /* number of baud rates to try */ + int clocal; /* CLOCAL_MODE_* */ ++ int kbmode; /* Keyboard mode if virtual console */ + speed_t speeds[MAX_SPEED]; /* baud rates to be tried */ + }; + +@@ -936,7 +937,7 @@ static void update_utmp(struct options * + static void open_tty(char *tty, struct termios *tp, struct options *op) + { + const pid_t pid = getpid(); +- int serial, closed = 0; ++ int closed = 0; + + /* Set up new standard input, unless we are given an already opened port. */ + +@@ -1080,15 +1081,18 @@ static void open_tty(char *tty, struct t + #endif + /* + * Detect if this is a virtual console or serial/modem line. +- * In case of a virtual console the ioctl TIOCMGET fails and +- * the error number will be set to EINVAL. ++ * In case of a virtual console the ioctl KDGKBMODE succeeds ++ * whereas on other lines it will fails. + */ +- if (ioctl(STDIN_FILENO, TIOCMGET, &serial) < 0 && (errno == EINVAL)) { ++ if (ioctl(STDIN_FILENO, KDGKBMODE, &op->kbmode) == 0) { + op->flags |= F_VCONSOLE; + if (!op->term) + op->term = DEFAULT_VCTERM; +- } else if (!op->term) +- op->term = DEFAULT_STERM; ++ } else { ++ op->kbmode = K_RAW; ++ if (!op->term) ++ op->term = DEFAULT_STERM; ++ } + + setenv("TERM", op->term, 1); + } +@@ -1122,12 +1126,7 @@ static void termio_init(struct options * + + if (op->flags & F_VCONSOLE) { + #if defined(IUTF8) && defined(KDGKBMODE) +- int mode; +- +- /* Detect mode of current keyboard setup, e.g. for UTF-8 */ +- if (ioctl(STDIN_FILENO, KDGKBMODE, &mode) < 0) +- mode = K_RAW; +- switch(mode) { ++ switch(op->kbmode) { + case K_UNICODE: + setlocale(LC_CTYPE, "C.UTF-8"); + op->flags |= F_UTF8; diff --git a/util-linux-prevent-excessive-clock-drift-calculations.patch b/util-linux-prevent-excessive-clock-drift-calculations.patch new file mode 100644 index 0000000..9b7f359 --- /dev/null +++ b/util-linux-prevent-excessive-clock-drift-calculations.patch @@ -0,0 +1,162 @@ +From 654e902731ea15a3494a3831b78d2b9f1cd1408d Mon Sep 17 00:00:00 2001 +From: Ruediger Meier +Date: Fri, 16 May 2014 17:01:43 +0200 +Subject: [PATCH] Prevent excessive clock drift calculations + +Squashed commit of the following: + +commit f55b4b45126b657fe02f5f0d3d7fde740e6a6247 +Author: Karel Zak +Date: Tue May 6 12:51:42 2014 +0200 + + hwclock: fix typo + + Reported-by: Stanislav Brabec + Signed-off-by: Karel Zak + +commit db8fc5f37728810bdd5b865ac420c31714e35def +Author: Stanislav Brabec +Date: Mon May 5 20:49:49 2014 +0200 + + hwclock: Check drift value in /etc/adjtime + + Due to bug in older versions of hwclock, /etc/adjtime can contain + excessive drift value (up to many years per day). Prevent it + from applying. + + Signed-off-by: Stanislav Brabec + +commit f196fd1a5f8fff63635fd88b5a0f0bbc96978df2 +Author: Stanislav Brabec +Date: Mon May 5 20:49:29 2014 +0200 + + hwclock: Prevent excessive drift values + + Failure of CMOS battery can cause writing of excessive drift + values (up to many years per day). + + This causes excessive hwclock adjustment next time, which may lead + to overflow in calculate_adjustment() (and hang before 4a44a54b). + + Prevent this situation, check drift for limits and reset drift to zero + instead. + + Steps to reproduce: + + mv /etc/adjtime /etc/adjtime.backup + + rm /etc/adjtime + hwclock --set --date 2001-01-01\ 01:00:00 + + changing of /etc/adjtime. + mv /etc/adjtime /etc/adjtime.saved + hwclock --set --date 2001-01-02\ 01:00:01 + mv /etc/adjtime.saved /etc/adjtime + + echo "======= The /etc/adjtime has a \"correct\" look:" + cat /etc/adjtime + + hwclock --debug --systohc --utc + echo "======= The /etc/adjtime now has deeply failed drift value:" + cat /etc/adjtime + + mv /etc/adjtime /etc/adjtime.saved + hwclock --set --date 2015-01-01\ 01:00:00 + mv /etc/adjtime.saved /etc/adjtime + + hwclock --debug --adjust + echo "======= And the last /etc/adjtime:" + cat /etc/adjtime + + mv /etc/adjtime.backup /etc/adjtime + hwclock --systohc --utc + + Signed-off-by: Stanislav Brabec + +Signed-off-by: Ruediger Meier +--- + sys-utils/hwclock.c | 47 ++++++++++++++++++++++++++++++++++------------- + 1 file changed, 34 insertions(+), 13 deletions(-) + +diff --git a/sys-utils/hwclock.c b/sys-utils/hwclock.c +index 395b5c3..0abf01f 100644 +--- a/sys-utils/hwclock.c ++++ b/sys-utils/hwclock.c +@@ -91,6 +91,11 @@ struct clock_ops *ur; + + #define FLOOR(arg) ((arg >= 0 ? (int) arg : ((int) arg) - 1)); + ++/* Maximal clock adjustment in seconds per day. ++ (adjtime() glibc call has 2145 seconds limit on i386, so it is good enough for us as well, ++ 43219 is a maximal safe value preventing exact_adjustment overflow.) */ ++#define MAX_DRIFT 2145.0 ++ + const char *adj_file_name = NULL; + + struct adjtime { +@@ -1008,6 +1013,7 @@ adjust_drift_factor(struct adjtime *adjtime_p, + double adj_days, cal_days; + double exp_drift, unc_drift; + double factor_adjust; ++ double drift_factor; + + /* Adjusted time units per hardware time unit */ + atime_per_htime = 1.0 + adjtime_p->drift_factor / sec_per_day; +@@ -1033,16 +1039,28 @@ adjust_drift_factor(struct adjtime *adjtime_p, + /* Amount to add to previous drift factor */ + factor_adjust = unc_drift / cal_days; + +- if (debug) +- printf(_("Clock drifted %.1f seconds in the past " +- "%d seconds in spite of a drift factor of " +- "%f seconds/day.\n" +- "Adjusting drift factor by %f seconds/day\n"), +- unc_drift, +- (int)(nowtime - adjtime_p->last_calib_time), +- adjtime_p->drift_factor, factor_adjust); +- +- adjtime_p->drift_factor += factor_adjust; ++ /* New drift factor */ ++ drift_factor = adjtime_p->drift_factor + factor_adjust; ++ ++ if (abs(drift_factor) > MAX_DRIFT) { ++ if (debug) ++ printf(_("Clock drift factor was calculated as " ++ "%f seconds/day.\n" ++ "It is far too much. Resetting to zero.\n"), ++ drift_factor); ++ drift_factor = 0; ++ } else { ++ if (debug) ++ printf(_("Clock drifted %.1f seconds in the past " ++ "%d seconds in spite of a drift factor of " ++ "%f seconds/day.\n" ++ "Adjusting drift factor by %f seconds/day\n"), ++ unc_drift, ++ (int)(nowtime - adjtime_p->last_calib_time), ++ adjtime_p->drift_factor, factor_adjust); ++ } ++ ++ adjtime_p->drift_factor = drift_factor; + } + adjtime_p->last_calib_time = nowtime; + +@@ -1190,9 +1208,12 @@ do_adjustment(struct adjtime *adjtime_p, + adjtime_p->dirty = TRUE; + } else if (adjtime_p->last_adj_time == 0) { + if (debug) +- printf(_ +- ("Not setting clock because last adjustment time is zero, " +- "so history is bad.")); ++ printf(_("Not setting clock because last adjustment time is zero, " ++ "so history is bad.\n")); ++ } else if (abs(adjtime_p->drift_factor) > MAX_DRIFT) { ++ if (debug) ++ printf(_("Not setting clock because drift factor %f is far too high.\n"), ++ adjtime_p->drift_factor); + } else { + int adjustment; + /* Number of seconds we must insert in the Hardware Clock */ +-- +1.8.4.5 + diff --git a/util-linux.changes b/util-linux.changes index ba298b6..53a1411 100644 --- a/util-linux.changes +++ b/util-linux.changes @@ -1,3 +1,24 @@ +------------------------------------------------------------------- +Fri May 16 15:10:53 UTC 2014 - sweet_f_a@gmx.de + +- Prevent excessive clock drift calculations (bnc#871698, + util-linux-prevent-excessive-clock-drift-calculations.patch), + committed by sbrabec@suse.cz + +------------------------------------------------------------------- +Thu May 8 08:15:04 UTC 2014 - werner@suse.de + +- Modify patch support-other-tty-lines-not-vconsole.patch to + make it work on virtual console +- Modify patch agetty-on-s390-on-dev-3270-tty1-line.patch + to add the missed 3270 support upstream + +------------------------------------------------------------------- +Wed May 7 14:12:32 UTC 2014 - werner@suse.de + +- Add patch support-other-tty-lines-not-vconsole.patch + to be able to support console lines like xvc and hvc + ------------------------------------------------------------------- Thu Apr 24 11:33:36 UTC 2014 - sweet_f_a@gmx.de diff --git a/util-linux.spec b/util-linux.spec index 1df7767..2373d3a 100644 --- a/util-linux.spec +++ b/util-linux.spec @@ -104,6 +104,8 @@ Patch2: util-linux-2.23.1-eject-fpie.patch Patch4: make-sure-sbin-resp-usr-sbin-are-in-PATH.diff # disable encryption Patch12: util-linux-2.23.1-noenc-suse.diff +# PATCH-FIX-SUSE Be aware that there are e.g. xvc/hvc +Patch14: support-other-tty-lines-not-vconsole.patch # PATCH-FIX-SUSE -- Let agetty not be fooled by locked termios srtucture Patch15: agetty-fooled-on-serial-line-due-plymouth.patch # PATCH-FIX-SUSE -- Let agetty detect /dev/3270/tty1 as device not as baud rate @@ -126,6 +128,8 @@ Patch30: blkid-stop-scanning-on-I-O-error.patch Patch31: blkid-convert-superblocks-to-new-calling-convention.patch # PATH-FIX-UPSTREAM util-linux-libblkid-ext-probe.patch bnc864703 sbrabec@suse.cz -- libblkid: Drop the broken ext2/ext3/ext4 discrimination logic. Patch32: util-linux-libblkid-ext-probe.patch +# PATCH-FIX-UPSTREAM bnc871698 sbrabec@suse.cz +Patch33: util-linux-prevent-excessive-clock-drift-calculations.patch ## ## klogconsole @@ -247,6 +251,7 @@ xzcat %{S:0} | %gpg_verify %{S:12} - %patch2 -p1 %patch4 -p1 %patch12 -p1 +%patch14 -p0 %patch15 -p0 %patch16 -p0 %patch17 -p0 @@ -260,6 +265,7 @@ xzcat %{S:0} | %gpg_verify %{S:12} - %patch30 -p1 %patch31 -p1 %patch32 -p1 +%patch33 -p1 # # setctsid cp -p %{S:22} %{S:23} .