If you are going to be excruciatingly, painfully correct, free() is
going to be unhappy about freeing a static string in the event getcwd()
fails for some inexplicable reason. I'd replace the free() + return with
a call to exit. Maybe even:
if (VERY_UNLIKELY (access (pz_curr_file, R_OK) != 0)) abort()
On 11/11/21 8:33 AM, Xi Ruoyao wrote:
---
fixincludes/fixincl.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/fixincludes/fixincl.c b/fixincludes/fixincl.c
index 6dba2f6e830..1580c67efec 100644
--- a/fixincludes/fixincl.c
+++ b/fixincludes/fixincl.c
@@ -1353,9 +1353,18 @@ process (void)
if (access (pz_curr_file, R_OK) != 0)
{
int erno = errno;
+ char *buf = NULL;
+ const char *cwd = NULL;
+ for (size_t size = 256; !cwd; size += size)
+ {
+ buf = xrealloc (buf, size);
+ cwd = getcwd (buf, size);
+ if (!cwd && errno != ERANGE)
+ cwd = "the working directory";
+ }
fprintf (stderr, "Cannot access %s from %s\n\terror %d (%s)\n",
- pz_curr_file, getcwd ((char *) NULL, MAXPATHLEN),
- erno, xstrerror (erno));
+ pz_curr_file, cwd, erno, xstrerror (erno));
+ free (buf); return;
}