27
27
#include <sys/syscall.h>
28
28
#include <sys/sysmacros.h>
29
29
#include <sys/time.h>
30
+ #include <sys/utsname.h>
30
31
#include <sys/wait.h>
31
32
#include <dirent.h>
32
33
#include <errno.h>
@@ -600,6 +601,25 @@ int expect_strne(const char *expr, int llen, const char *cmp)
600
601
return ret ;
601
602
}
602
603
604
+ #define EXPECT_STRBUFEQ (cond , expr , buf , val , cmp ) \
605
+ do { if (!(cond)) result(llen, SKIPPED); else ret += expect_str_buf_eq(expr, buf, val, llen, cmp); } while (0)
606
+
607
+ static __attribute__((unused ))
608
+ int expect_str_buf_eq (size_t expr , const char * buf , size_t val , int llen , const char * cmp )
609
+ {
610
+ llen += printf (" = %lu <%s> " , expr , buf );
611
+ if (strcmp (buf , cmp ) != 0 ) {
612
+ result (llen , FAIL );
613
+ return 1 ;
614
+ }
615
+ if (expr != val ) {
616
+ result (llen , FAIL );
617
+ return 1 ;
618
+ }
619
+
620
+ result (llen , OK );
621
+ return 0 ;
622
+ }
603
623
604
624
/* declare tests based on line numbers. There must be exactly one test per line. */
605
625
#define CASE_TEST (name ) \
@@ -761,6 +781,45 @@ int test_stat_timestamps(void)
761
781
return 0 ;
762
782
}
763
783
784
+ int test_uname (void )
785
+ {
786
+ struct utsname buf ;
787
+ char osrelease [sizeof (buf .release )];
788
+ ssize_t r ;
789
+ int fd ;
790
+
791
+ memset (& buf .domainname , 'P' , sizeof (buf .domainname ));
792
+
793
+ if (uname (& buf ))
794
+ return 1 ;
795
+
796
+ if (strncmp ("Linux" , buf .sysname , sizeof (buf .sysname )))
797
+ return 1 ;
798
+
799
+ fd = open ("/proc/sys/kernel/osrelease" , O_RDONLY );
800
+ if (fd == -1 )
801
+ return 1 ;
802
+
803
+ r = read (fd , osrelease , sizeof (osrelease ));
804
+ if (r == -1 )
805
+ return 1 ;
806
+
807
+ close (fd );
808
+
809
+ if (osrelease [r - 1 ] == '\n' )
810
+ r -- ;
811
+
812
+ /* Validate one of the later fields to ensure field sizes are correct */
813
+ if (strncmp (osrelease , buf .release , r ))
814
+ return 1 ;
815
+
816
+ /* Ensure the field domainname is set, it is missing from struct old_utsname */
817
+ if (strnlen (buf .domainname , sizeof (buf .domainname )) == sizeof (buf .domainname ))
818
+ return 1 ;
819
+
820
+ return 0 ;
821
+ }
822
+
764
823
int test_mmap_munmap (void )
765
824
{
766
825
int ret , fd , i , page_size ;
@@ -966,6 +1025,8 @@ int run_syscall(int min, int max)
966
1025
CASE_TEST (stat_fault ); EXPECT_SYSER (1 , stat (NULL , & stat_buf ), -1 , EFAULT ); break ;
967
1026
CASE_TEST (stat_timestamps ); EXPECT_SYSZR (1 , test_stat_timestamps ()); break ;
968
1027
CASE_TEST (symlink_root ); EXPECT_SYSER (1 , symlink ("/" , "/" ), -1 , EEXIST ); break ;
1028
+ CASE_TEST (uname ); EXPECT_SYSZR (proc , test_uname ()); break ;
1029
+ CASE_TEST (uname_fault ); EXPECT_SYSER (1 , uname (NULL ), -1 , EFAULT ); break ;
969
1030
CASE_TEST (unlink_root ); EXPECT_SYSER (1 , unlink ("/" ), -1 , EISDIR ); break ;
970
1031
CASE_TEST (unlink_blah ); EXPECT_SYSER (1 , unlink ("/proc/self/blah" ), -1 , ENOENT ); break ;
971
1032
CASE_TEST (wait_child ); EXPECT_SYSER (1 , wait (& tmp ), -1 , ECHILD ); break ;
@@ -991,6 +1052,14 @@ int run_stdlib(int min, int max)
991
1052
for (test = min ; test >= 0 && test <= max ; test ++ ) {
992
1053
int llen = 0 ; /* line length */
993
1054
1055
+ /* For functions that take a long buffer, like strlcat()
1056
+ * Add some more chars after the \0, to test functions that overwrite the buffer set
1057
+ * the \0 at the exact right position.
1058
+ */
1059
+ char buf [10 ] = "test123456" ;
1060
+ buf [4 ] = '\0' ;
1061
+
1062
+
994
1063
/* avoid leaving empty lines below, this will insert holes into
995
1064
* test numbers.
996
1065
*/
@@ -1007,6 +1076,19 @@ int run_stdlib(int min, int max)
1007
1076
CASE_TEST (strchr_foobar_z ); EXPECT_STRZR (1 , strchr ("foobar" , 'z' )); break ;
1008
1077
CASE_TEST (strrchr_foobar_o ); EXPECT_STREQ (1 , strrchr ("foobar" , 'o' ), "obar" ); break ;
1009
1078
CASE_TEST (strrchr_foobar_z ); EXPECT_STRZR (1 , strrchr ("foobar" , 'z' )); break ;
1079
+ #ifdef NOLIBC
1080
+ CASE_TEST (strlcat_0 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1081
+ CASE_TEST (strlcat_1 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 1 ), buf , 4 , "test" ); break ;
1082
+ CASE_TEST (strlcat_5 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 5 ), buf , 7 , "test" ); break ;
1083
+ CASE_TEST (strlcat_6 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 6 ), buf , 7 , "testb" ); break ;
1084
+ CASE_TEST (strlcat_7 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 7 ), buf , 7 , "testba" ); break ;
1085
+ CASE_TEST (strlcat_8 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 8 ), buf , 7 , "testbar" ); break ;
1086
+ CASE_TEST (strlcpy_0 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1087
+ CASE_TEST (strlcpy_1 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 1 ), buf , 3 , "" ); break ;
1088
+ CASE_TEST (strlcpy_2 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 2 ), buf , 3 , "b" ); break ;
1089
+ CASE_TEST (strlcpy_3 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 3 ), buf , 3 , "ba" ); break ;
1090
+ CASE_TEST (strlcpy_4 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 4 ), buf , 3 , "bar" ); break ;
1091
+ #endif
1010
1092
CASE_TEST (memcmp_20_20 ); EXPECT_EQ (1 , memcmp ("aaa\x20" , "aaa\x20" , 4 ), 0 ); break ;
1011
1093
CASE_TEST (memcmp_20_60 ); EXPECT_LT (1 , memcmp ("aaa\x20" , "aaa\x60" , 4 ), 0 ); break ;
1012
1094
CASE_TEST (memcmp_60_20 ); EXPECT_GT (1 , memcmp ("aaa\x60" , "aaa\x20" , 4 ), 0 ); break ;
0 commit comments