cap getdents length argument to INT_MAX
authorRich Felker <dalias@aerifal.cx>
Fri, 28 Jun 2019 21:58:03 +0000 (17:58 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 28 Jun 2019 21:58:03 +0000 (17:58 -0400)
the linux syscall treats this argument as having type int, so passing
extremely long buffer sizes would be misinterpreted by the kernel.
since "short reads" are always acceptable, just cap it down.

patch based on report and suggested change by Florian Weimer.

src/linux/getdents.c

index de6de3b425bcc23063d2198762ff42e80edeec4e..796c1e5c92499a1b0b914e3e6d5d865272026e7c 100644 (file)
@@ -1,9 +1,11 @@
 #define _BSD_SOURCE
 #include <dirent.h>
+#include <limits.h>
 #include "syscall.h"
 
 int getdents(int fd, struct dirent *buf, size_t len)
 {
+       if (len>INT_MAX) len = INT_MAX;
        return syscall(SYS_getdents, fd, buf, len);
 }