Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision 47f7adfcb0fc78bf4b84e9af95a9d8028da013e3)
+++ uspace/srv/devman/devman.c	(revision dc87f3fdd986aaa5448f59cf1d5f5b01447860c6)
@@ -266,9 +266,10 @@
 	}
 	
-	if (read(fd, buf, len) <= 0) {
+	ssize_t read_bytes = safe_read(fd, buf, len);
+	if (read_bytes <= 0) {
 		printf(NAME ": unable to read file '%s'.\n", conf_path);
 		goto cleanup;
 	}
-	buf[len] = 0;
+	buf[read_bytes] = 0;
 	
 	suc = parse_match_ids(buf, ids);
Index: uspace/srv/devman/util.c
===================================================================
--- uspace/srv/devman/util.c	(revision 47f7adfcb0fc78bf4b84e9af95a9d8028da013e3)
+++ uspace/srv/devman/util.c	(revision dc87f3fdd986aaa5448f59cf1d5f5b01447860c6)
@@ -111,4 +111,31 @@
 }
 
+ssize_t safe_read(int fd, void *buffer, size_t size)
+{
+	if (size == 0) {
+		return 0;
+	}
+
+	uint8_t *buf_ptr = (uint8_t *) buffer;
+
+	size_t total_read = 0;
+	while (total_read < size) {
+		ssize_t bytes_read = read(fd, buf_ptr, size - total_read);
+		if (bytes_read < 0) {
+			/* Error. */
+			return bytes_read;
+		} else if (bytes_read == 0) {
+			/* Possibly end of file. */
+			break;
+		} else {
+			/* Read at least something. */
+			buf_ptr += bytes_read;
+			total_read += bytes_read;
+		}
+	}
+
+	return (ssize_t) total_read;
+}
+
 /** @}
  */
Index: uspace/srv/devman/util.h
===================================================================
--- uspace/srv/devman/util.h	(revision 47f7adfcb0fc78bf4b84e9af95a9d8028da013e3)
+++ uspace/srv/devman/util.h	(revision dc87f3fdd986aaa5448f59cf1d5f5b01447860c6)
@@ -47,4 +47,6 @@
 extern void replace_char(char *, char, char);
 
+extern ssize_t safe_read(int, void *, size_t);
+
 #endif
 
