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
This commit is contained in:
Benoît Dejean
2009-02-16 22:57:05 +00:00
parent 391377ccf8
commit 35a0ac4f2c

View File

@@ -67,14 +67,18 @@ enum TRY_FILE_TO_BUFFER
TRY_FILE_TO_BUFFER_READ = -2 TRY_FILE_TO_BUFFER_READ = -2
}; };
/*
* Doesn't handle bufsiz == 0
*/
int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...) int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...)
{ {
char path[4096]; char path[4096];
int fd; int fd;
ssize_t len; size_t len = 0;
ssize_t nread = 0;
va_list pa; va_list pa;
if (bufsiz <= sizeof(char*)) if (G_UNLIKELY(bufsiz <= sizeof(char*)))
g_warning("Huhu, bufsiz of %lu looks bad", (gulong)bufsiz); g_warning("Huhu, bufsiz of %lu looks bad", (gulong)bufsiz);
va_start(pa, format); va_start(pa, format);
@@ -84,15 +88,31 @@ int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...)
va_end(pa); va_end(pa);
bufsiz--; /* reserve 1 for trailing NUL */
buffer [0] = '\0'; buffer [0] = '\0';
if((fd = open (path, O_RDONLY)) < 0) if((fd = open (path, O_RDONLY)) < 0)
return TRY_FILE_TO_BUFFER_OPEN; 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); close (fd);
if (len < 0) if (nread < 0)
return TRY_FILE_TO_BUFFER_READ; return TRY_FILE_TO_BUFFER_READ;
buffer [len] = '\0'; buffer [len] = '\0';