From 35a0ac4f2c7016b2db717a3100942b4156b3ac64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dejean?= Date: Mon, 16 Feb 2009 22:57:05 +0000 Subject: [PATCH] r2790 | bdejean | 2009-01-12 19:39:44 +0100 (lun 12 jan 2009) | 3 lines Fixed read(2) usage. Closes #468495. svn path=/trunk/; revision=2801 --- sysdeps/linux/glibtop_private.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/sysdeps/linux/glibtop_private.c b/sysdeps/linux/glibtop_private.c index 02077fc9..041624c7 100644 --- a/sysdeps/linux/glibtop_private.c +++ b/sysdeps/linux/glibtop_private.c @@ -67,14 +67,18 @@ enum TRY_FILE_TO_BUFFER TRY_FILE_TO_BUFFER_READ = -2 }; +/* + * Doesn't handle bufsiz == 0 + */ int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...) { char path[4096]; int fd; - ssize_t len; + size_t len = 0; + ssize_t nread = 0; va_list pa; - if (bufsiz <= sizeof(char*)) + if (G_UNLIKELY(bufsiz <= sizeof(char*))) g_warning("Huhu, bufsiz of %lu looks bad", (gulong)bufsiz); va_start(pa, format); @@ -84,15 +88,31 @@ int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...) va_end(pa); + bufsiz--; /* reserve 1 for trailing NUL */ buffer [0] = '\0'; if((fd = open (path, O_RDONLY)) < 0) return TRY_FILE_TO_BUFFER_OPEN; - len = read (fd, buffer, bufsiz - 1); + while (len < bufsiz) { + nread = read (fd, buffer + len, bufsiz - len); + + if (G_UNLIKELY(nread < 0)) { + if (errno == EINTR) + continue; + else + break; + } + + len += nread; + + if (nread == 0) + break; + } + close (fd); - if (len < 0) + if (nread < 0) return TRY_FILE_TO_BUFFER_READ; buffer [len] = '\0';