aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0018-use-dynamic-buffer-for-getmntent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0018-use-dynamic-buffer-for-getmntent.patch')
-rw-r--r--main/musl/0018-use-dynamic-buffer-for-getmntent.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/main/musl/0018-use-dynamic-buffer-for-getmntent.patch b/main/musl/0018-use-dynamic-buffer-for-getmntent.patch
new file mode 100644
index 0000000000..7178a00a4a
--- /dev/null
+++ b/main/musl/0018-use-dynamic-buffer-for-getmntent.patch
@@ -0,0 +1,67 @@
+From 05973dc3bbc1aca9b3c8347de6879ed72147ab3b Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Thu, 8 Sep 2016 19:07:31 +0200
+Subject: [PATCH 18/18] use dynamic buffer for getmntent
+
+overlayfs may have fairly long lines so we use getline to allocate a
+buffer dynamically. The buffer will be allocated on first use, expand as
+needed, but will never be free'ed.
+
+Downstream bug: http://bugs.alpinelinux.org/issues/5703
+
+Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
+---
+ src/misc/mntent.c | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/src/misc/mntent.c b/src/misc/mntent.c
+index a16d652..eabb820 100644
+--- a/src/misc/mntent.c
++++ b/src/misc/mntent.c
+@@ -3,6 +3,11 @@
+ #include <mntent.h>
+ #include <errno.h>
+
++static char *internal_buf;
++static size_t internal_bufsize;
++
++#define SENTINEL (char *)&internal_buf
++
+ FILE *setmntent(const char *name, const char *mode)
+ {
+ return fopen(name, mode);
+@@ -16,13 +21,18 @@ int endmntent(FILE *f)
+
+ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen)
+ {
+- int cnt, n[8];
++ int cnt, n[8], use_internal = (linebuf == SENTINEL);
+
+ mnt->mnt_freq = 0;
+ mnt->mnt_passno = 0;
+
+ do {
+- fgets(linebuf, buflen, f);
++ if (use_internal) {
++ getline(&internal_buf, &internal_bufsize, f);
++ linebuf = internal_buf;
++ } else {
++ fgets(linebuf, buflen, f);
++ }
+ if (feof(f) || ferror(f)) return 0;
+ if (!strchr(linebuf, '\n')) {
+ fscanf(f, "%*[^\n]%*[\n]");
+@@ -49,9 +59,8 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle
+
+ struct mntent *getmntent(FILE *f)
+ {
+- static char linebuf[256];
+ static struct mntent mnt;
+- return getmntent_r(f, &mnt, linebuf, sizeof linebuf);
++ return getmntent_r(f, &mnt, SENTINEL, 0);
+ }
+
+ int addmntent(FILE *f, const struct mntent *mnt)
+--
+2.10.1
+