diff options
| author | Craig Jennings <c@cjennings.net> | 2026-07-24 17:51:53 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-07-24 17:51:53 -0500 |
| commit | 0989858ed1182c978d1f40a1fab6850e46ff5d06 (patch) | |
| tree | 3b71a793fd85faaf767da448ce6af75b12de356f /modules/system-defaults.el | |
| parent | 01e1793831ee2a80a20e266ac3b0b950b71df240 (diff) | |
| download | dotemacs-0989858ed1182c978d1f40a1fab6850e46ff5d06.tar.gz dotemacs-0989858ed1182c978d1f40a1fab6850e46ff5d06.zip | |
fix(system-defaults): guard and cap the native-comp warning log
- cj/log-comp-warning is :before-until advice on display-warning.
- Its append-to-file was unguarded, so an unwritable log path signalled.
- That signal propagated out and broke warning display for every comp notice.
- Wrapped the write so a failure is swallowed and the warning stays suppressed.
- The log also grew without bound; added a 512KB cap that resets it on overflow.
Diffstat (limited to 'modules/system-defaults.el')
| -rw-r--r-- | modules/system-defaults.el | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/modules/system-defaults.el b/modules/system-defaults.el index 7f369a5e..9b4652e8 100644 --- a/modules/system-defaults.el +++ b/modules/system-defaults.el @@ -55,6 +55,10 @@ (expand-file-name "comp-warnings.log" user-emacs-directory) "File where native-comp warnings will be appended.") +(defvar cj/comp-warnings-log-max-bytes (* 512 1024) + "Cap on `comp-warnings-log' size. Once it exceeds this, the log is reset +before the next write, so native-comp warnings can't grow it without bound.") + (defun cj/log-comp-warning (type message &rest args) "Log native-comp warnings of TYPE with MESSAGE & ARGS. Log to buffer `comp-warnings-log'. Suppress warnings from appearing in the @@ -62,13 +66,24 @@ Log to buffer `comp-warnings-log'. Suppress warnings from appearing in the timestamp to the file specified by `comp-warnings-log'. Return non-nil to indicate the warning was handled." (when (memq 'comp (if (listp type) type (list type))) - (with-temp-buffer - (insert (format-time-string "[%Y-%m-%d %H:%M:%S] ")) - (insert (if (stringp message) - (apply #'format message args) - (format "%S %S" message args))) - (insert "\n") - (append-to-file (point-min) (point-max) comp-warnings-log)) + ;; Reset the log if it has grown past the cap, so async comp warnings can't + ;; grow it without bound. + (when (ignore-errors + (> (or (file-attribute-size (file-attributes comp-warnings-log)) 0) + cj/comp-warnings-log-max-bytes)) + (ignore-errors (delete-file comp-warnings-log))) + ;; Guard the write: this runs as `:before-until' advice on `display-warning', + ;; so a signal here (an unwritable log path) would propagate out and break + ;; warning display for every async comp notice. Swallow the failure; the + ;; warning stays suppressed either way. + (ignore-errors + (with-temp-buffer + (insert (format-time-string "[%Y-%m-%d %H:%M:%S] ")) + (insert (if (stringp message) + (apply #'format message args) + (format "%S %S" message args))) + (insert "\n") + (append-to-file (point-min) (point-max) comp-warnings-log))) ;; Return non-nil to tell `display-warning' “we handled it.” t)) |
