- Timestamp:
- Jul 19, 2024, 8:00:03 AM (6 months ago)
- Branches:
- master
- Children:
- b8561fa
- Parents:
- d7b399f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tests/meta/dumpable.cfa
rd7b399f r3ee4a53 9 9 // Author : Thierry Delisle 10 10 // Created On : Wed Jan 05 13:53:22 2022 11 // Last Modified By : 12 // Last Modified On : 13 // Update Count : 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 19 07:58:45 2024 13 // Update Count : 10 14 14 // 15 15 … … 17 17 #include <limits.h> 18 18 #include <string.h> 19 #include <unistd.h> 19 20 20 21 #include <fstream.hfa> … … 22 23 extern "C" { 23 24 #include <fcntl.h> 24 #include <unistd.h>25 25 #include <sys/prctl.h> 26 26 #include <sys/resource.h> … … 32 32 void check_ulimit() { 33 33 struct rlimit rlp; 34 getrlimit( RLIMIT_CORE, &rlp );34 getrlimit( RLIMIT_CORE, &rlp ); 35 35 if ( rlp.rlim_cur < 536870912 ) { 36 36 serr | "Soft core limit is less than ~500Mb: " | rlp.rlim_cur; 37 } 37 } // if 38 38 39 39 if ( rlp.rlim_max < 536870912 ) { 40 40 serr | "Hard core limit is less than ~500Mb: " | rlp.rlim_max; 41 } 41 } // if 42 42 } 43 43 44 44 void check_permission() { 45 { 46 char myExe[PATH_MAX]; 47 ssize_t n = readlink("/proc/self/exe", myExe, sizeof(myExe)); 48 if (n < 0 ) { 49 perror("readlink(/proc/self/exe ) error"); 50 return 1; 51 } 52 myExe[n] = '\0'; 45 char myExe[PATH_MAX]; 46 ssize_t n = readlink( "/proc/self/exe", myExe, sizeof(myExe)); 47 if ( n < 0 ) { 48 perror( "readlink(/proc/self/exe ) error" ); 49 return 1; 50 } // if 51 myExe[n] = '\0'; 53 52 54 if ( int r = access(myExe, F_OK ); r != 0 ) serr | "Expected current executable does not exist!" | r | errno; 55 if ( int r = access(myExe, R_OK ); r != 0 ) serr | "No read access for current executable" | r | errno; 56 } 53 if ( int r = access( myExe, F_OK ); r != 0 ) serr | "Expected current executable does not exist!" | r | errno; 54 if ( int r = access( myExe, R_OK ); r != 0 ) serr | "No read access for current executable" | r | errno; 57 55 58 { 59 char myCwd[PATH_MAX]; 60 if (getcwd(myCwd, sizeof(myCwd )) == 0p ) { 61 perror("getcwd() error"); 62 return; 63 } 56 char myCwd[PATH_MAX]; 57 if ( getcwd( myCwd, sizeof(myCwd ) ) == 0p ) { 58 perror( "getcwd() error" ); 59 return; 60 } // if 64 61 65 if ( access(myCwd, F_OK ) != 0 ) serr | "Expected current working directory does not exist!"; 66 if ( access(myCwd, R_OK ) != 0 ) serr | "No read access for current working directory"; 67 if ( access(myCwd, W_OK ) != 0 ) serr | "No write access for current working directory"; 68 } 62 if ( access( myCwd, F_OK ) != 0 ) serr | "Expected current working directory does not exist!"; 63 if ( access( myCwd, R_OK ) != 0 ) serr | "No read access for current working directory"; 64 if ( access( myCwd, W_OK ) != 0 ) serr | "No write access for current working directory"; 69 65 } 70 66 71 67 void check_free_space() { 72 68 struct statvfs buf; 73 if ( statvfs( ".", &buf ) != 0 ) {74 perror( "statvfs() error");69 if ( statvfs( ".", &buf ) != 0 ) { 70 perror( "statvfs() error" ); 75 71 return; 76 } 72 } // if 77 73 78 74 uint64_t avail = buf.f_bavail; … … 80 76 if ( avail < 536870912_l64u ) { 81 77 serr | "Available diskspace is less than ~500Mb: " | avail; 82 } 78 } // if 83 79 84 80 if ( buf.f_favail < 10 ) { 85 81 serr | "Available inodes is less than 10: " | buf.f_favail; 86 } 82 } // if 87 83 88 84 if ( buf.f_flag & ST_RDONLY ) { 89 85 serr | "Filesystem is read only"; 90 } 86 } // if 91 87 } 92 88 93 89 void check_noconflict() { 94 c har * name = "./core";95 if ( access( "./core", F_OK ) == 0 ) serr | "A file of the core name ('" | name | "')already exists";90 const char * name = "./core"; 91 if ( access( name, F_OK ) == 0 ) serr | "File \"" | name | "\" already exists"; 96 92 } 97 93 98 94 void check_dumpflag() { 99 int r = prctl( PR_GET_DUMPABLE, 0, 0, 0, 0 );95 int r = prctl( PR_GET_DUMPABLE, 0, 0, 0, 0 ); 100 96 if ( r < 0 ) { 101 perror( "prctl(PR_GET_DUMPABLE ) error");97 perror( "prctl( PR_GET_DUMPABLE ) error" ); 102 98 return; 103 } 99 } // if 104 100 105 if ( r != 1 ) serr | "dumpable attribute not set to 1 \"( SUID_DUMP_USER, process is dumpable )\", was" | r;101 if ( r != 1 ) serr | "dumpable attribute not set to 1 \"( SUID_DUMP_USER, process is dumpable )\", was" | r; 106 102 } 107 103 108 104 void check_core_pattern() { 109 105 int ret; 110 int cp = open( "/proc/sys/kernel/core_pattern", 0, O_RDONLY );106 int cp = open( "/proc/sys/kernel/core_pattern", 0, O_RDONLY ); 111 107 112 108 if ( cp < 0 ) { … … 117 113 try { 118 114 const char * expected = "core\n"; 119 const int sz = sizeof( "core\n");115 const int sz = sizeof( "core\n" ); 120 116 char buf[512]; 121 117 ret = read( cp, buf, 512 ); … … 123 119 perror( "core pattern read error" ); 124 120 return; 125 } 121 } // if 122 126 123 ret = strncmp( expected, buf, sz - 1 ); 127 124 if ( ret != 0 ) { 128 serr | "/proc/sys/kernel/core_pattern does not contain 'core', was:" | nl | nl | buf | nl 129 | "Test script expect cores files to be dumped with name 'core' in current working directory." | nl 130 | "Apport is not supported, it should be deactivated in /etc/default/apport for the test suite to work with core dumps."; 131 } 125 serr | "Apport is supported on your system, which means the test-suite core-dump feature does not work." | nl 126 | "This is not a test failure, just a limitation on debugging output should a test fail."; 127 } // if 132 128 } finally { 133 ret = close( cp );134 if ( ret < 0 ) perror( "close(/proc/sys/kernel/core_pattern ) error");135 } 129 ret = close( cp ); 130 if ( ret < 0 ) perror( "close( /proc/sys/kernel/core_pattern ) error" ); 131 } // try 136 132 } 137 133
Note: See TracChangeset
for help on using the changeset viewer.