--- libeio/eio.c 2008/05/11 19:11:05 1.6 +++ libeio/eio.c 2008/05/11 19:19:05 1.7 @@ -770,15 +770,18 @@ /*****************************************************************************/ #define ALLOC(len) \ - X_LOCK (wrklock); \ - req->flags |= EIO_FLAG_PTR2_FREE; \ - X_UNLOCK (wrklock); \ - req->ptr2 = malloc (len); \ if (!req->ptr2) \ { \ - errno = ENOMEM; \ - req->result = -1; \ - break; \ + X_LOCK (wrklock); \ + req->flags |= EIO_FLAG_PTR2_FREE; \ + X_UNLOCK (wrklock); \ + req->ptr2 = malloc (len); \ + if (!req->ptr2) \ + { \ + errno = ENOMEM; \ + req->result = -1; \ + break; \ + } \ } X_THREAD_PROC (eio_proc) @@ -834,7 +837,8 @@ if (!EIO_CANCELLED (req)) switch (req->type) { - case EIO_READ: req->result = req->offs >= 0 + case EIO_READ: ALLOC (req->size); + req->result = req->offs >= 0 ? pread (req->int1, req->ptr2, req->size, req->offs) : read (req->int1, req->ptr2, req->size); break; case EIO_WRITE: req->result = req->offs >= 0 @@ -868,6 +872,7 @@ case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; + case EIO_READLINK: ALLOC (NAME_MAX); req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break;