From 1f36fee699926dbd04d4b97ca19fad29a847c3ae Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 17 Nov 2024 22:58:13 -0800 Subject: [PATCH] savewd: set errnum for FINAL_STATE too Problem reported by Grisha Levit in: https://lists.gnu.org/r/bug-gnulib/2024-11/msg00137.html * lib/savewd.c (savewd_finish): Set errnum to 0 unless we were in an error state. * lib/savewd.h (savewd_errno): Report final state errnum too. --- ChangeLog | 9 +++++++++ lib/savewd.c | 5 ++++- lib/savewd.h | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 117c4eb345..1c62948b6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2024-11-17 Paul Eggert + + savewd: set errnum for FINAL_STATE too + Problem reported by Grisha Levit in: + https://lists.gnu.org/r/bug-gnulib/2024-11/msg00137.html + * lib/savewd.c (savewd_finish): + Set errnum to 0 unless we were in an error state. + * lib/savewd.h (savewd_errno): Report final state errnum too. + 2024-11-17 Collin Funk doc: Prefer https urls where possible. diff --git a/lib/savewd.c b/lib/savewd.c index dee8524abe..debf9e9041 100644 --- a/lib/savewd.c +++ b/lib/savewd.c @@ -240,17 +240,20 @@ savewd_finish (struct savewd *wd) { switch (wd->state) { - case INITIAL_STATE: case ERROR_STATE: break; case FD_STATE: case FD_POST_CHDIR_STATE: close (wd->val.fd); + FALLTHROUGH; + case INITIAL_STATE: + wd->val.errnum = 0; break; case FORKING_STATE: assure (wd->val.child < 0); + wd->val.errnum = 0; break; default: diff --git a/lib/savewd.h b/lib/savewd.h index e74ba82d94..2cadbb6228 100644 --- a/lib/savewd.h +++ b/lib/savewd.h @@ -67,7 +67,8 @@ struct savewd /* savewd_finish has been called, so the application no longer cares whether the working directory is saved, and there is no - more work to do. */ + more work to do. val.errnum contains the error number if + there was a serious problem, 0 otherwise. */ FINAL_STATE } state; @@ -129,7 +130,7 @@ int savewd_restore (struct savewd *wd, int status); SAVEWD_INLINE int _GL_ATTRIBUTE_PURE savewd_errno (struct savewd const *wd) { - return (wd->state == ERROR_STATE ? wd->val.errnum : 0); + return wd->state < ERROR_STATE ? 0 : wd->val.errnum; } /* Deallocate any resources associated with WD. A program that chdirs -- 2.39.5