Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

binderfs_test: switch from /dev to a unique per-test mountpoint

Unprivileged users will be able to create directories in there. The
unprivileged test for /dev wouldn't have worked on most systems.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20200313152420.138777-2-christian.brauner@ubuntu.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Christian Brauner and committed by
Greg Kroah-Hartman
ad29ace2 6e29225a

+23 -24
+23 -24
tools/testing/selftests/filesystems/binderfs/binderfs_test.c
··· 139 139 int fd, ret, saved_errno; 140 140 size_t len; 141 141 ssize_t wret; 142 - bool keep = false; 143 142 struct binderfs_device device = { 0 }; 144 143 struct binder_version version = { 0 }; 144 + char binderfs_mntpt[] = P_tmpdir "/binderfs_XXXXXX", 145 + device_path[sizeof(P_tmpdir "/binderfs_XXXXXX/") + BINDERFS_MAX_NAME]; 145 146 146 147 change_to_mountns(); 147 148 148 - ret = mkdir("/dev/binderfs", 0755); 149 - if (ret < 0) { 150 - if (errno != EEXIST) 151 - ksft_exit_fail_msg( 152 - "%s - Failed to create binderfs mountpoint\n", 153 - strerror(errno)); 149 + if (!mkdtemp(binderfs_mntpt)) 150 + ksft_exit_fail_msg( 151 + "%s - Failed to create binderfs mountpoint\n", 152 + strerror(errno)); 154 153 155 - keep = true; 156 - } 157 - 158 - ret = mount(NULL, "/dev/binderfs", "binder", 0, 0); 154 + ret = mount(NULL, binderfs_mntpt, "binder", 0, 0); 159 155 if (ret < 0) { 160 156 if (errno != ENODEV) 161 157 ksft_exit_fail_msg("%s - Failed to mount binderfs\n", 162 158 strerror(errno)); 163 159 164 - keep ? : rmdir_protect_errno("/dev/binderfs"); 160 + rmdir_protect_errno(binderfs_mntpt); 165 161 return 1; 166 162 } 167 163 ··· 166 170 167 171 memcpy(device.name, "my-binder", strlen("my-binder")); 168 172 169 - fd = open("/dev/binderfs/binder-control", O_RDONLY | O_CLOEXEC); 173 + snprintf(device_path, sizeof(device_path), "%s/binder-control", binderfs_mntpt); 174 + fd = open(device_path, O_RDONLY | O_CLOEXEC); 170 175 if (fd < 0) 171 176 ksft_exit_fail_msg( 172 177 "%s - Failed to open binder-control device\n", ··· 178 181 close(fd); 179 182 errno = saved_errno; 180 183 if (ret < 0) { 181 - keep ? : rmdir_protect_errno("/dev/binderfs"); 184 + rmdir_protect_errno(binderfs_mntpt); 182 185 ksft_exit_fail_msg( 183 186 "%s - Failed to allocate new binder device\n", 184 187 strerror(errno)); ··· 191 194 /* binder device allocation test passed */ 192 195 ksft_inc_pass_cnt(); 193 196 194 - fd = open("/dev/binderfs/my-binder", O_CLOEXEC | O_RDONLY); 197 + snprintf(device_path, sizeof(device_path), "%s/my-binder", binderfs_mntpt); 198 + fd = open(device_path, O_CLOEXEC | O_RDONLY); 195 199 if (fd < 0) { 196 - keep ? : rmdir_protect_errno("/dev/binderfs"); 200 + rmdir_protect_errno(binderfs_mntpt); 197 201 ksft_exit_fail_msg("%s - Failed to open my-binder device\n", 198 202 strerror(errno)); 199 203 } ··· 204 206 close(fd); 205 207 errno = saved_errno; 206 208 if (ret < 0) { 207 - keep ? : rmdir_protect_errno("/dev/binderfs"); 209 + rmdir_protect_errno(binderfs_mntpt); 208 210 ksft_exit_fail_msg( 209 211 "%s - Failed to open perform BINDER_VERSION request\n", 210 212 strerror(errno)); ··· 216 218 /* binder transaction with binderfs binder device passed */ 217 219 ksft_inc_pass_cnt(); 218 220 219 - ret = unlink("/dev/binderfs/my-binder"); 221 + ret = unlink(device_path); 220 222 if (ret < 0) { 221 - keep ? : rmdir_protect_errno("/dev/binderfs"); 223 + rmdir_protect_errno(binderfs_mntpt); 222 224 ksft_exit_fail_msg("%s - Failed to delete binder device\n", 223 225 strerror(errno)); 224 226 } ··· 226 228 /* binder device removal passed */ 227 229 ksft_inc_pass_cnt(); 228 230 229 - ret = unlink("/dev/binderfs/binder-control"); 231 + snprintf(device_path, sizeof(device_path), "%s/binder-control", binderfs_mntpt); 232 + ret = unlink(device_path); 230 233 if (!ret) { 231 - keep ? : rmdir_protect_errno("/dev/binderfs"); 234 + rmdir_protect_errno(binderfs_mntpt); 232 235 ksft_exit_fail_msg("Managed to delete binder-control device\n"); 233 236 } else if (errno != EPERM) { 234 - keep ? : rmdir_protect_errno("/dev/binderfs"); 237 + rmdir_protect_errno(binderfs_mntpt); 235 238 ksft_exit_fail_msg( 236 239 "%s - Failed to delete binder-control device but exited with unexpected error code\n", 237 240 strerror(errno)); ··· 242 243 ksft_inc_xfail_cnt(); 243 244 244 245 on_error: 245 - ret = umount2("/dev/binderfs", MNT_DETACH); 246 - keep ?: rmdir_protect_errno("/dev/binderfs"); 246 + ret = umount2(binderfs_mntpt, MNT_DETACH); 247 + rmdir_protect_errno(binderfs_mntpt); 247 248 if (ret < 0) 248 249 ksft_exit_fail_msg("%s - Failed to unmount binderfs\n", 249 250 strerror(errno));