Add tcsh-6.21.00-sighup-deadlock.patch, port tcsh-6.18.03-history-file-locking.patch now tcsh-6.21.0-history-file-locking.patch

OBS-URL: https://build.opensuse.org/package/show/shells/tcsh?expand=0&rev=80
This commit is contained in:
Dr. Werner Fink 2019-08-22 12:31:22 +00:00 committed by Git OBS Bridge
parent 7225664b5a
commit e9e8ac2fed
4 changed files with 87 additions and 29 deletions

View File

@ -14,18 +14,18 @@ https://bugzilla.redhat.com/show_bug.cgi?id=879371
Changes by Fridolin Pokorny <fpokorny@redhat.com>
---
sh.c | 102 ++++++++++++++++++++++++++++++++++++-------------
sh.decls.h | 4 +
sh.dol.c | 2
sh.err.c | 16 +++++++
sh.h | 18 ++++++++
sh.hist.c | 126 +++++++++++++++++++++++++++++--------------------------------
sh.lex.c | 8 +--
sh.sem.c | 2
8 files changed, 178 insertions(+), 100 deletions(-)
sh.c | 102 +++++++++++++++++++++++++++++++++++++--------------
sh.decls.h | 4 +-
sh.dol.c | 2 -
sh.err.c | 16 ++++++++
sh.h | 18 +++++++++
sh.hist.c | 122 ++++++++++++++++++++++++++++++-------------------------------
sh.lex.c | 8 ++--
sh.sem.c | 2 -
8 files changed, 178 insertions(+), 96 deletions(-)
--- sh.c
+++ sh.c 2019-05-09 08:16:41.673852638 +0000
+++ sh.c 2019-08-22 12:07:57.729632215 +0000
@@ -138,6 +138,7 @@ struct saved_state {
int cantell;
struct Bin B;
@ -245,7 +245,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
/*
--- sh.decls.h
+++ sh.decls.h 2019-05-09 08:16:41.673852638 +0000
+++ sh.decls.h 2019-08-22 12:07:57.729632215 +0000
@@ -37,6 +37,7 @@
*/
extern Char *gethdir (const Char *);
@ -272,7 +272,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
extern void sethistory (int);
--- sh.dol.c
+++ sh.dol.c 2019-05-09 08:16:41.673852638 +0000
+++ sh.dol.c 2019-08-22 12:07:57.729632215 +0000
@@ -1117,6 +1117,6 @@ again:
*obp = 0;
tmp = short2str(obuf);
@ -282,7 +282,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
cleanup_until(&inheredoc);
}
--- sh.err.c
+++ sh.err.c 2019-05-09 08:16:41.677852563 +0000
+++ sh.err.c 2019-08-22 12:07:57.733632140 +0000
@@ -511,6 +511,22 @@ open_cleanup(void *xptr)
}
@ -307,7 +307,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
{
DIR *dir;
--- sh.h
+++ sh.h 2019-05-09 08:16:41.677852563 +0000
+++ sh.h 2019-08-22 12:07:57.733632140 +0000
@@ -49,6 +49,24 @@
# include <inttypes.h>
#endif
@ -334,7 +334,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
typedef unsigned long intptr_t;
#endif
--- sh.hist.c
+++ sh.hist.c 2019-05-09 08:36:00.679789483 +0000
+++ sh.hist.c 2019-08-22 12:24:42.518825681 +0000
@@ -32,6 +32,8 @@
#include "sh.h"
#include <stdio.h> /* for rename(2), grr. */
@ -531,15 +531,15 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
rechist(Char *fname, int ref)
{
- Char *snum, *rs;
- int fp, ftmp, oldidfds;
- int fp, ftmp, oldidfds, phup_disabled_tmp;
+ Char *snum;
+ int fd = -1, ftmp, oldidfds;
+ int fd = -1, ftmp, oldidfds, phup_disabled_tmp;
struct varent *shist;
- char path[MAXPATHLEN];
struct stat st;
static Char *dumphist[] = {STRhistory, STRmhT, 0, 0};
@@ -1290,50 +1283,49 @@ rechist(Char *fname, int ref)
@@ -1294,35 +1287,37 @@ rechist(Char *fname, int ref)
cleanup_push(lockpath, dotlock_cleanup);
#endif
}
@ -561,6 +561,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
- if (fp == -1) {
- didfds = oldidfds;
- cleanup_until(fname);
- phup_disabled = phup_disabled_tmp;
- return;
+ if (fd <= 0) {
+ /* Open .history file for writing (if not open yet). */
@ -593,13 +594,9 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
+ SHOUT = ftmp;
+ }
didfds = oldidfds;
-#ifndef WINNT_NATIVE
- (void)rename(path, short2str(fname));
-#else
- (void)ReplaceFile( short2str(fname),path,NULL,0,NULL,NULL);
-#endif
cleanup_until(fname);
}
#ifndef WINNT_NATIVE
(void)rename(path, short2str(fname));
@@ -1335,11 +1330,12 @@ rechist(Char *fname, int ref)
/* This is the entry point for loading history data from a file. */
@ -615,7 +612,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
if (fname != NULL)
loadhist_cmd[2] = fname;
@@ -1342,17 +1334,19 @@ loadhist(Char *fname, int mflg)
@@ -1348,17 +1344,19 @@ loadhist(Char *fname, int mflg)
else
loadhist_cmd[2] = STRtildothist;
@ -640,7 +637,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
void
--- sh.lex.c
+++ sh.lex.c 2019-05-09 08:16:41.677852563 +0000
+++ sh.lex.c 2019-08-22 12:07:57.733632140 +0000
@@ -1608,7 +1608,7 @@ wide_read(int fildes, Char *buf, size_t
/* Throwing away possible partial multibyte characters on error if the
stream is not seekable */
@ -678,7 +675,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
fbuf = xcalloc(2, sizeof(Char **));
fblocks = 1;
--- sh.sem.c
+++ sh.sem.c 2019-05-09 08:16:41.677852563 +0000
+++ sh.sem.c 2019-08-22 12:07:57.733632140 +0000
@@ -905,7 +905,7 @@ doio(struct command *t, int *pipein, int
fd = xopen(tmp, O_WRONLY|O_APPEND|O_LARGEFILE);
#else /* !O_APPEND */

View File

@ -0,0 +1,50 @@
tcsh can deadlock with itself if savehist is confgured with "merge" and
"lock", and two SIGHUPs are received in rapid succession. The
mechanism of the deadlock is the first SIGHUP triggers a rechist() and
while that rechist() is executing (and after it has created the lock
file), another SIGHUP triggers a another rechist() which then waits
forever for the lock the the first rechist() created to be released
(which will never happen).
---
tcsh-6.21.00/sh.hist.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
--- tcsh-6.21.00/sh.hist.c
+++ tcsh-6.21.00/sh.hist.c 2019-08-22 12:05:25.800474245 +0000
@@ -1219,7 +1219,7 @@ void
rechist(Char *fname, int ref)
{
Char *snum, *rs;
- int fp, ftmp, oldidfds;
+ int fp, ftmp, oldidfds, phup_disabled_tmp;
struct varent *shist;
char path[MAXPATHLEN];
struct stat st;
@@ -1227,6 +1227,10 @@ rechist(Char *fname, int ref)
if (fname == NULL && !ref)
return;
+
+ phup_disabled_tmp = phup_disabled;
+ phup_disabled = 1;
+
/*
* If $savehist is just set, we use the value of $history
* else we use the value in $savehist
@@ -1301,6 +1305,7 @@ rechist(Char *fname, int ref)
if (fp == -1) {
didfds = oldidfds;
cleanup_until(fname);
+ phup_disabled = phup_disabled_tmp;
return;
}
/* Try to preserve ownership and permissions of the original history file */
@@ -1325,6 +1330,7 @@ rechist(Char *fname, int ref)
(void)ReplaceFile( short2str(fname),path,NULL,0,NULL,NULL);
#endif
cleanup_until(fname);
+ phup_disabled = phup_disabled_tmp;
}

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Thu Aug 22 12:27:18 UTC 2019 - Dr. Werner Fink <werner@suse.de>
- Add patch tcsh-6.21.00-sighup-deadlock.patch from upstream list
* Do not (re)run SIGHUP handler during rewrite history
* Port and rename patch tcsh-6.18.03-history-file-locking.patch
which now becomes tcsh-6.21.0-history-file-locking.patch
-------------------------------------------------------------------
Thu May 9 08:50:56 UTC 2019 - Dr. Werner Fink <werner@suse.de>

View File

@ -32,8 +32,10 @@ Patch2: tcsh-6.16.00-norm-cmd.dif
Patch4: tcsh-6.18.03-colorls.dif
Patch5: tcsh-6.17.06-dspmbyte.dif
Patch6: tcsh-6.18.03-catalogs.dif
# PATCH-FIX-UPSTREAM Do not (re)run SIGHUP handler during rewrite history
Patch7: tcsh-6.21.00-sighup-deadlock.patch
# PATCH-FIX-SUSE add history file locking (bsc#901076)
Patch9: tcsh-6.18.03-history-file-locking.patch
Patch9: tcsh-6.21.0-history-file-locking.patch
Patch10: tcsh-6.18.03-history-merge.dif
# PATCH-FIX-SUSE fix history file locking: first unlock then close
Patch11: tcsh-6.19.00-history-file-locking-order.patch
@ -64,6 +66,7 @@ correction, a history mechanism, job control, and a C-like syntax.
%patch4 -b .colorls
%patch5 -b .dspmbyte
%patch6 -b .catalogs
%patch7 -p1 -b .sighup
%patch9 -b .histlock
%patch10 -b .histmerg
%patch11 -b .histlckord