Index: native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
index 8e45a35ce29e83c8eea62fc91b3c81e274d7bdf3..2a305827b6c0d4bd54d61dbafec2db9e8810539c 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
@@ -532,15 +532,16 @@ int _real_fstat(int fd, struct stat* buf) { |
return 0; |
} |
-int _real_getdents(int fd, void* buf, size_t count, size_t* nread) { |
+int _real_getdents(int fd, struct dirent* buf, size_t count, size_t* nread) { |
// "buf" contains dirent(s); "nacl_buf" contains nacl_abi_dirent(s). |
// See WRAP(getdents) above. |
+ |
char* nacl_buf = (char*)alloca(count); |
size_t offset = 0; |
size_t nacl_offset = 0; |
size_t nacl_nread; |
CHECK_REAL(getdents); |
- int err = REAL(getdents)(fd, (dirent*)nacl_buf, count, &nacl_nread); |
+ int err = REAL(getdents)(fd, (struct dirent*)nacl_buf, count, &nacl_nread); |
if (err) |
return err; |
@@ -550,12 +551,12 @@ int _real_getdents(int fd, void* buf, size_t count, size_t* nread) { |
d->d_ino = nacl_d->nacl_abi_d_ino; |
d->d_off = nacl_d->nacl_abi_d_off; |
d->d_reclen = nacl_d->nacl_abi_d_reclen + d_name_shift; |
- size_t d_name_len = |
+ size_t name_len = |
nacl_d->nacl_abi_d_reclen - offsetof(nacl_abi_dirent, nacl_abi_d_name); |
- memcpy(d->d_name, nacl_d->nacl_abi_d_name, d_name_len); |
+ memcpy(d->d_name, nacl_d->nacl_abi_d_name, name_len); |
offset += d->d_reclen; |
- offset += nacl_d->nacl_abi_d_reclen; |
+ nacl_offset += nacl_d->nacl_abi_d_reclen; |
binji
2015/09/08 19:18:57
ooh, nasty.
|
} |
*nread = offset; |