浏览代码

Merge branch 'getpagesize_check' into 'master'

Use try_from in getpagesize(), add test

See merge request redox-os/relibc!225
jD91mZM2 5 年之前
父节点
当前提交
bf13674e11
共有 3 个文件被更改,包括 31 次插入1 次删除
  1. 16 1
      src/header/unistd/mod.rs
  2. 1 0
      tests/Makefile
  3. 14 0
      tests/unistd/getpagesize.c

+ 16 - 1
src/header/unistd/mod.rs

@@ -1,5 +1,6 @@
 //! unistd implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html
 
+use core::convert::TryFrom;
 use core::{mem, ptr, slice};
 
 use alloc::collections::LinkedList;
@@ -360,7 +361,21 @@ pub extern "C" fn getlogin_r(name: *mut c_char, namesize: size_t) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn getpagesize() -> c_int {
-    sysconf(_SC_PAGESIZE) as c_int
+    match c_int::try_from(sysconf(_SC_PAGESIZE)) {
+        Ok(page_size) => page_size,
+        Err(_) => {
+            /* Behavior not specified by POSIX for this case. The -1
+             * value mimics sysconf()'s behavior, though.
+             *
+             * As specified for the limits.h header, the minimum
+             * acceptable value for {PAGESIZE} is 1. The -1 value thus
+             * cannot be mistaken for an acceptable value.
+             *
+             * POSIX does not specify any possible errors for this
+             * function, hence no errno setting. */
+            -1
+        }
+    }
 }
 
 // #[no_mangle]

+ 1 - 0
tests/Makefile

@@ -114,6 +114,7 @@ NAMES=\
 	unistd/getcwd \
 	unistd/gethostname \
 	unistd/getid \
+	unistd/getpagesize \
 	unistd/link \
 	unistd/pathconf \
 	unistd/setid \

+ 14 - 0
tests/unistd/getpagesize.c

@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "test_helpers.h"
+
+int main(void) {
+    errno = 0;
+    int getpagesize_result = getpagesize();
+    int getpagesize_errno = errno;
+    
+    printf("getpagesize(): %d, errno: %d = %s\n", getpagesize_result,
+        getpagesize_errno, strerror(getpagesize_errno));
+}