It appears to me that io_read requires a malloced buffer.  According
to store semantics, only a pointer to a pointer to a buffer is passed.
Thus, those programs using libstore and the file class crash violently.
The attached patch fixes this problem, however, I do not know if this
is the correct place for it (where is io_read?  In libc -- I failed to
find it).

Thanks.

diff -Nur hurd-20010115-snapshot/libstore/ChangeLog hurd-20010115/libstore/ChangeLog
--- hurd-20010115-snapshot/libstore/ChangeLog   Sun Jan 14 22:59:21 2001
+++ hurd-20010115/libstore/ChangeLog    Wed Mar  7 00:15:48 2001
@@ -1,3 +1,9 @@
+2001-03-07  Neal H Walfield <[EMAIL PROTECTED]>
+
+       * file.c: Include mach.h
+       (file_read): vm_allocate the buffer.
+       (file_byte_read): Likewise.
+
 2001-01-14  Roland McGrath  <[EMAIL PROTECTED]>
 
        * encode.c (too_big): New static function.
diff -Nur hurd-20010115-snapshot/libstore/file.c hurd-20010115/libstore/file.c
--- hurd-20010115-snapshot/libstore/file.c      Mon Jan  8 23:33:11 2001
+++ hurd-20010115/libstore/file.c       Tue Mar  6 19:04:43 2001
@@ -23,6 +23,7 @@
 #include <fcntl.h>
 #include <hurd.h>
 
+#include <mach.h>
 #include <hurd/io.h>
 
 #include "store.h"
@@ -33,6 +34,11 @@
           size_t *len)
 {
   size_t bsize = store->block_size;
+  error_t err;
+
+  err = vm_allocate (mach_task_self (), buf, amount, 1);
+  if (err)
+    return err;
   return io_read (store->port, (char **)buf, len, addr * bsize, amount);
 }
 
@@ -202,6 +208,11 @@
                store_offset_t addr, size_t index, size_t amount,
                void **buf, size_t *len)
 {
+  error_t err;
+
+  err = vm_allocate (mach_task_self (), buf, amount, 1);
+  if (err)
+    return err;
   return io_read (store->port, (char **)buf, len, addr, amount);
 }
 

PGP signature

Reply via email to