aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/os-Linux
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2006-06-30 04:55:54 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-30 14:25:37 -0400
commitc2b7a4bb30008dc256d63802e02b6fb950958443 (patch)
tree355e20a2295099dad5878c2034d39739e984d9d1 /arch/um/os-Linux
parentdd673bca474a199fb8d1b6a311832592977ecb5f (diff)
[PATCH] uml: fix /proc/mounts parsing boundary condition
When parsing /proc/mounts looking for a tmpfs mount on /dev/shm, if a string that we are looking for if split across reads, then it won't be recognized. Fix this by refilling the buffer whenever we advance the cursor. Signed-off-by: Jeff Dike <jdike@addtoit.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r--arch/um/os-Linux/mem.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/um/os-Linux/mem.c b/arch/um/os-Linux/mem.c
index c6432e729241..d24d1a960523 100644
--- a/arch/um/os-Linux/mem.c
+++ b/arch/um/os-Linux/mem.c
@@ -55,7 +55,7 @@ static void __init find_tempdir(void)
55 */ 55 */
56static int next(int fd, char *buf, int size, char c) 56static int next(int fd, char *buf, int size, char c)
57{ 57{
58 int n; 58 int n, len;
59 char *ptr; 59 char *ptr;
60 60
61 while((ptr = strchr(buf, c)) == NULL){ 61 while((ptr = strchr(buf, c)) == NULL){
@@ -69,7 +69,17 @@ static int next(int fd, char *buf, int size, char c)
69 } 69 }
70 70
71 ptr++; 71 ptr++;
72 memmove(buf, ptr, strlen(ptr) + 1); 72 len = strlen(ptr);
73 memmove(buf, ptr, len + 1);
74
75 /* Refill the buffer so that if there's a partial string that we care
76 * about, it will be completed, and we can recognize it.
77 */
78 n = read(fd, &buf[len], size - len - 1);
79 if(n < 0)
80 return -errno;
81
82 buf[len + n] = '\0';
73 return 1; 83 return 1;
74} 84}
75 85