Jeremy Soller 5 роки тому
батько
коміт
9d7ec9b146
1 змінених файлів з 20 додано та 7 видалено
  1. 20 7
      src/platform/redox/mod.rs

+ 20 - 7
src/platform/redox/mod.rs

@@ -11,7 +11,7 @@ use syscall::{self, Result};
 use c_str::{CStr, CString};
 use fs::File;
 use header::dirent::dirent;
-use header::errno::{EINVAL, EIO, EPERM};
+use header::errno::{EINVAL, EIO, EPERM, ERANGE};
 use header::fcntl;
 use header::sys_mman::MAP_ANON;
 use header::sys_stat::stat;
@@ -413,15 +413,28 @@ impl Pal for Sys {
     }
 
     fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char {
-        let buf_slice = unsafe { slice::from_raw_parts_mut(buf as *mut u8, size as usize - 1) };
-        let read = e(syscall::getcwd(buf_slice));
-        if read == !0 {
-            ptr::null_mut()
+        let buf_slice = unsafe { slice::from_raw_parts_mut(buf as *mut u8, size as usize) };
+        if ! buf_slice.is_empty() {
+            let nonnull_size = buf_slice.len() - 1;
+            let read = e(syscall::getcwd(&mut buf_slice[..nonnull_size]));
+            if read == !0 {
+                ptr::null_mut()
+            } else if read == nonnull_size {
+                unsafe {
+                    errno = ERANGE;
+                }
+                ptr::null_mut()
+            } else {
+                for b in &mut buf_slice[read..] {
+                    *b = 0;
+                }
+                buf
+            }
         } else {
             unsafe {
-                *buf.offset(read as isize + 1) = 0;
+                errno = EINVAL;
             }
-            buf
+            ptr::null_mut()
         }
     }