From eaf8d94fac5ab4ddfd6a5966a55a4178656d4011 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Wed, 22 Jan 1997 09:54:48 +0100
Subject: [PATCH] Fixed even more bugs in get_dir.

Rev: src/modules/files/efuns.c:1.8
---
 src/modules/files/efuns.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c
index 0b9fb3d8f9..a70dc95e61 100644
--- a/src/modules/files/efuns.c
+++ b/src/modules/files/efuns.c
@@ -186,13 +186,24 @@ void f_get_dir(INT32 args)
     while(1)
     {
       int e;
-      struct dirent tmp;
+      struct dirent *tmp;
       int num_files=0;
       char *bufptr=buffer;
       THREADS_ALLOW();
+
+      if (!(tmp = alloca(pathconf(path, _PC_NAME_MAX) + 1))) {
+	error("get_dir(): Out of memory!\n");
+      }
+
       while(1)
       {
-	d=readdir_r(dir, &tmp);
+	/* Should have code for the POSIX variant here also */
+	do {
+	  d=readdir_r(dir, tmp);
+	} while ((!d) && ((errno == EAGAIN)||(errno == EINTR)));
+	if (!d) {
+	  error("get_dir(): readdir_r() failed: %d\n", errno);
+	}
 	if(d->d_name[0]=='.')
 	{
 	  if(!d->d_name[1]) continue;
-- 
GitLab