SHA256
1
0
forked from pool/tcsh

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> Changes by Fridolin Pokorny <fpokorny@redhat.com>
--- ---
sh.c | 102 ++++++++++++++++++++++++++++++++++++------------- sh.c | 102 +++++++++++++++++++++++++++++++++++++--------------
sh.decls.h | 4 + sh.decls.h | 4 +-
sh.dol.c | 2 sh.dol.c | 2 -
sh.err.c | 16 +++++++ sh.err.c | 16 ++++++++
sh.h | 18 ++++++++ sh.h | 18 +++++++++
sh.hist.c | 126 +++++++++++++++++++++++++++++-------------------------------- sh.hist.c | 122 ++++++++++++++++++++++++++++++-------------------------------
sh.lex.c | 8 +-- sh.lex.c | 8 ++--
sh.sem.c | 2 sh.sem.c | 2 -
8 files changed, 178 insertions(+), 100 deletions(-) 8 files changed, 178 insertions(+), 96 deletions(-)
--- sh.c --- 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 { @@ -138,6 +138,7 @@ struct saved_state {
int cantell; int cantell;
struct Bin B; struct Bin B;
@ -245,7 +245,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
/* /*
--- sh.decls.h --- 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 @@ @@ -37,6 +37,7 @@
*/ */
extern Char *gethdir (const Char *); extern Char *gethdir (const Char *);
@ -272,7 +272,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
extern void sethistory (int); extern void sethistory (int);
--- sh.dol.c --- 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: @@ -1117,6 +1117,6 @@ again:
*obp = 0; *obp = 0;
tmp = short2str(obuf); tmp = short2str(obuf);
@ -282,7 +282,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
cleanup_until(&inheredoc); cleanup_until(&inheredoc);
} }
--- sh.err.c --- 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) @@ -511,6 +511,22 @@ open_cleanup(void *xptr)
} }
@ -307,7 +307,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
{ {
DIR *dir; DIR *dir;
--- sh.h --- 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 @@ @@ -49,6 +49,24 @@
# include <inttypes.h> # include <inttypes.h>
#endif #endif
@ -334,7 +334,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
typedef unsigned long intptr_t; typedef unsigned long intptr_t;
#endif #endif
--- sh.hist.c --- 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 @@ @@ -32,6 +32,8 @@
#include "sh.h" #include "sh.h"
#include <stdio.h> /* for rename(2), grr. */ #include <stdio.h> /* for rename(2), grr. */
@ -531,15 +531,15 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
rechist(Char *fname, int ref) rechist(Char *fname, int ref)
{ {
- Char *snum, *rs; - Char *snum, *rs;
- int fp, ftmp, oldidfds; - int fp, ftmp, oldidfds, phup_disabled_tmp;
+ Char *snum; + Char *snum;
+ int fd = -1, ftmp, oldidfds; + int fd = -1, ftmp, oldidfds, phup_disabled_tmp;
struct varent *shist; struct varent *shist;
- char path[MAXPATHLEN]; - char path[MAXPATHLEN];
struct stat st; struct stat st;
static Char *dumphist[] = {STRhistory, STRmhT, 0, 0}; 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); cleanup_push(lockpath, dotlock_cleanup);
#endif #endif
} }
@ -561,6 +561,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
- if (fp == -1) { - if (fp == -1) {
- didfds = oldidfds; - didfds = oldidfds;
- cleanup_until(fname); - cleanup_until(fname);
- phup_disabled = phup_disabled_tmp;
- return; - return;
+ if (fd <= 0) { + if (fd <= 0) {
+ /* Open .history file for writing (if not open yet). */ + /* Open .history file for writing (if not open yet). */
@ -593,13 +594,9 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
+ SHOUT = ftmp; + SHOUT = ftmp;
+ } + }
didfds = oldidfds; didfds = oldidfds;
-#ifndef WINNT_NATIVE #ifndef WINNT_NATIVE
- (void)rename(path, short2str(fname)); (void)rename(path, short2str(fname));
-#else @@ -1335,11 +1330,12 @@ rechist(Char *fname, int ref)
- (void)ReplaceFile( short2str(fname),path,NULL,0,NULL,NULL);
-#endif
cleanup_until(fname);
}
/* This is the entry point for loading history data from a file. */ /* 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) if (fname != NULL)
loadhist_cmd[2] = fname; loadhist_cmd[2] = fname;
@@ -1342,17 +1334,19 @@ loadhist(Char *fname, int mflg) @@ -1348,17 +1344,19 @@ loadhist(Char *fname, int mflg)
else else
loadhist_cmd[2] = STRtildothist; loadhist_cmd[2] = STRtildothist;
@ -640,7 +637,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
void void
--- sh.lex.c --- 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 @@ -1608,7 +1608,7 @@ wide_read(int fildes, Char *buf, size_t
/* Throwing away possible partial multibyte characters on error if the /* Throwing away possible partial multibyte characters on error if the
stream is not seekable */ stream is not seekable */
@ -678,7 +675,7 @@ Changes by Fridolin Pokorny <fpokorny@redhat.com>
fbuf = xcalloc(2, sizeof(Char **)); fbuf = xcalloc(2, sizeof(Char **));
fblocks = 1; fblocks = 1;
--- sh.sem.c --- 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 @@ -905,7 +905,7 @@ doio(struct command *t, int *pipein, int
fd = xopen(tmp, O_WRONLY|O_APPEND|O_LARGEFILE); fd = xopen(tmp, O_WRONLY|O_APPEND|O_LARGEFILE);
#else /* !O_APPEND */ #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> 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 Patch4: tcsh-6.18.03-colorls.dif
Patch5: tcsh-6.17.06-dspmbyte.dif Patch5: tcsh-6.17.06-dspmbyte.dif
Patch6: tcsh-6.18.03-catalogs.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) # 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 Patch10: tcsh-6.18.03-history-merge.dif
# PATCH-FIX-SUSE fix history file locking: first unlock then close # PATCH-FIX-SUSE fix history file locking: first unlock then close
Patch11: tcsh-6.19.00-history-file-locking-order.patch 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 %patch4 -b .colorls
%patch5 -b .dspmbyte %patch5 -b .dspmbyte
%patch6 -b .catalogs %patch6 -b .catalogs
%patch7 -p1 -b .sighup
%patch9 -b .histlock %patch9 -b .histlock
%patch10 -b .histmerg %patch10 -b .histmerg
%patch11 -b .histlckord %patch11 -b .histlckord