(resend, looks like I missed the confirmation mail on first attempt) Hi, attached is a patch that reduces the memory in use on all systems where BROKEN_ONE_BYTE_DIRENT_D_NAME is not defined. It would be good if there was a ac_something variable that could be given to configure to tell it if this workaround is needed or not when cross compiling. We currently do it another way after running configure: ==== cat >>conftest.c <<EOF #include <sys/types.h> #include <dirent.h> #include <assert.h> int main() { struct dirent d; static_assert(sizeof(d.d_name) > sizeof(char), "struct to small"); return 0; } EOF ${target_platform}-gcc ${optflags} conftest.c && \ sed -ri 's/#define (BROKEN_ONE_BYTE_DIRENT_D_NAME) 1/#undef \1/' config.h ==== Of course that only works when one has a compiler that is new enough (what we can guarantee). Greetings, Eike -- Rolf Eike Beer, emlix GmbH, http://www.emlix.com Fon +49 551 30664-0, Fax +49 551 30664-11 Bertha-von-Suttner-Str. 9, 37085 Göttingen, Germany Sitz der Gesellschaft: Göttingen, Amtsgericht Göttingen HR B 3160 Geschaeftsfuehrung: Heike Jordan, Dr. Uwe Kracke – Ust-IdNr.: DE 205 198 055 emlix – smart embedded open source
From=2097add42e11edbc113c6c49e9c8535747b7b7c88f Mon Sep 17 00:00:00 2001 From: Rolf Eike Beer <eb@xxxxxxxxx> Date: Wed, 6 Jul 2016 09:11:22 +0200 Subject: [PATCH 1/2] apply the struct dirent penalty only when needed Many systems have a struct dirent that already has enough space to hold the entries names, others like Solaris have not. For the latter extra space needs to be allocated, but this was also done for the former systems leading to needlessly reserved memory. --- sftp-glob.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sftp-glob.c b/sftp-glob.c index 43a1beb..8edd28a 100644 --- a/sftp-glob.c +++ b/sftp-glob.c @@ -64,9 +64,14 @@ fudge_opendir(const char *path) static struct dirent * fudge_readdir(struct SFTP_OPENDIR *od) { +#ifdef BROKEN_ONE_BYTE_DIRENT_D_NAME /* Solaris needs sizeof(dirent) + path length (see below) */ static char buf[sizeof(struct dirent) + MAXPATHLEN]; struct dirent *ret = (struct dirent *)buf; +#else + static struct dirent buf; + struct dirent *ret = &buf; +#endif #ifdef __GNU_LIBRARY__ static int inum = 1; #endif /* __GNU_LIBRARY__ */ @@ -74,7 +79,7 @@ fudge_readdir(struct SFTP_OPENDIR *od) if (od->dir[od->offset] == NULL) return(NULL); - memset(buf, 0, sizeof(buf)); + memset(ret, 0, sizeof(buf)); /* * Solaris defines dirent->d_name as a one byte array and expects -- 2.8.3
Attachment:
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ openssh-unix-dev mailing list openssh-unix-dev@xxxxxxxxxxx https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev