summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/texk/xdvik/ChangeLog10
-rw-r--r--Build/source/texk/xdvik/dvi-init.c23
-rw-r--r--Build/source/texk/xdvik/util.c16
-rw-r--r--Build/source/texk/xdvik/util.h3
4 files changed, 46 insertions, 6 deletions
diff --git a/Build/source/texk/xdvik/ChangeLog b/Build/source/texk/xdvik/ChangeLog
index 76c0cf33b17..6e0f29740a7 100644
--- a/Build/source/texk/xdvik/ChangeLog
+++ b/Build/source/texk/xdvik/ChangeLog
@@ -1,3 +1,13 @@
+2022-02-13 Paul Vojta <vojta@math.berkeley.edu>
+
+ * dvi-init.c (make_backup_fp): call new try_dup, and existing
+ try_fdopen, before fseek.
+ * util.c (try_dup): define new fn.
+ * util.h (try_dup): declare it.
+ This resolves xdvi crashing under MacOS after hitting `R' in some
+ situations (the preceding change did as well, in a clunkier way).
+ https://tug.org/pipermail/tlbuild/2022q1/005140.html ff.
+
2022-02-01 John Hawkinson <jhawk@alum.mit.edu>
* dvi-init.c (make_backup_fp): check returns from fseeks,
diff --git a/Build/source/texk/xdvik/dvi-init.c b/Build/source/texk/xdvik/dvi-init.c
index 829bd58080b..52d5a3ecfa9 100644
--- a/Build/source/texk/xdvik/dvi-init.c
+++ b/Build/source/texk/xdvik/dvi-init.c
@@ -1,6 +1,6 @@
/*========================================================================*\
-Copyright (c) 1990-2013 Paul Vojta
+Copyright (c) 1990-2022 Paul Vojta
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
@@ -1185,18 +1185,33 @@ make_backup_fp(FILE *source_fp, FILE *target_fp)
ASSERT(target_fp != NULL, "");
ASSERT(source_fp != NULL, "");
- if (fseek(target_fp, 0L, SEEK_SET)) {
+ tmp_fd = try_dup(fileno(target_fp));
+ if (tmp_fd == -1) {
+ XDVI_ERROR((stderr, "Couldn't duplicate descriptor of file %s: %s - disabling `useTempFp'; target_fp: %p.",
+ m_tmp_dvi_name, strerror(errno), target_fp));
+ goto fclose_and_fail;
+ }
+
+ fclose(target_fp);
+
+ if (lseek(tmp_fd, 0L, SEEK_SET) == -1) {
XDVI_ERROR((stderr, "Couldn't seek to start of file %s: %s - disabling `useTempFp'; target_fp: %p.",
m_tmp_dvi_name, strerror(errno), target_fp));
- goto fclose_and_fail;
+ goto fail;
}
#if HAVE_FTRUNCATE
if (ftruncate(tmp_fd, 0) < 0) {
XDVI_ERROR((stderr, "Couldn't truncate file %s: %s - disabling `useTempFp'; target_fp: %p.",
m_tmp_dvi_name, strerror(errno), target_fp));
- goto fclose_and_fail;
+ goto fail;
}
#endif
+
+ if ((target_fp = try_fdopen(tmp_fd, "wb+")) == NULL) {
+ XDVI_ERROR((stderr, "error opening temporary file (%s) - disabling `useTempFp'.", strerror(errno)));
+ goto fail;
+ }
+
if (fseek(source_fp, 0L, SEEK_SET)) {
perror("fseek of source_fp");
goto fclose_and_fail;
diff --git a/Build/source/texk/xdvik/util.c b/Build/source/texk/xdvik/util.c
index 958a99c4788..7a7bd687786 100644
--- a/Build/source/texk/xdvik/util.c
+++ b/Build/source/texk/xdvik/util.c
@@ -1,6 +1,6 @@
/*========================================================================*\
-Copyright (c) 1990-2015 Paul Vojta and others
+Copyright (c) 1990-2022 Paul Vojta and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
@@ -281,6 +281,20 @@ try_open_mode(const char *fname, int flags, mode_t mode)
return fd;
}
+/*
+ * Like try_fopen(), for dup().
+ */
+int
+try_dup(int oldfd)
+{
+ int fd = dup(oldfd);
+ if (fd < 0 && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ fd = dup(oldfd);
+ }
+ return fd;
+}
+
/*
* invoked on SIGSEGV: try to stop gs before aborting, to prevent gs
diff --git a/Build/source/texk/xdvik/util.h b/Build/source/texk/xdvik/util.h
index 09a14fde460..cbebe8c7fcb 100644
--- a/Build/source/texk/xdvik/util.h
+++ b/Build/source/texk/xdvik/util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002-2015 the xdvik development team
+ * Copyright (c) 2002-2022 the xdvik development team
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
@@ -51,6 +51,7 @@ FILE *try_fopen(const char *fname, const char *mode);
FILE *try_fdopen(int fd, const char *mode);
int try_open(const char *fname, int flags);
int try_open_mode(const char *fname, int flags, mode_t mode);
+int try_dup(int oldfd);
extern int xdvi_temp_fd(char **tempfilename);
extern void xdvi_assert(const char *version,