cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

proc-loadavg-001.c (1962B)


      1/*
      2 * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com>
      3 *
      4 * Permission to use, copy, modify, and distribute this software for any
      5 * purpose with or without fee is hereby granted, provided that the above
      6 * copyright notice and this permission notice appear in all copies.
      7 *
      8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15 */
     16/* Test that /proc/loadavg correctly reports last pid in pid namespace. */
     17#include <errno.h>
     18#include <sched.h>
     19#include <sys/types.h>
     20#include <sys/stat.h>
     21#include <fcntl.h>
     22#include <unistd.h>
     23#include <sys/wait.h>
     24
     25int main(void)
     26{
     27	pid_t pid;
     28	int wstatus;
     29
     30	if (unshare(CLONE_NEWPID) == -1) {
     31		if (errno == ENOSYS || errno == EPERM)
     32			return 4;
     33		return 1;
     34	}
     35
     36	pid = fork();
     37	if (pid == -1)
     38		return 1;
     39	if (pid == 0) {
     40		char buf[128], *p;
     41		int fd;
     42		ssize_t rv;
     43
     44		fd = open("/proc/loadavg" , O_RDONLY);
     45		if (fd == -1)
     46			return 1;
     47		rv = read(fd, buf, sizeof(buf));
     48		if (rv < 3)
     49			return 1;
     50		p = buf + rv;
     51
     52		/* pid 1 */
     53		if (!(p[-3] == ' ' && p[-2] == '1' && p[-1] == '\n'))
     54			return 1;
     55
     56		pid = fork();
     57		if (pid == -1)
     58			return 1;
     59		if (pid == 0)
     60			return 0;
     61		if (waitpid(pid, NULL, 0) == -1)
     62			return 1;
     63
     64		lseek(fd, 0, SEEK_SET);
     65		rv = read(fd, buf, sizeof(buf));
     66		if (rv < 3)
     67			return 1;
     68		p = buf + rv;
     69
     70		/* pid 2 */
     71		if (!(p[-3] == ' ' && p[-2] == '2' && p[-1] == '\n'))
     72			return 1;
     73
     74		return 0;
     75	}
     76
     77	if (waitpid(pid, &wstatus, 0) == -1)
     78		return 1;
     79	if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)
     80		return 0;
     81	return 1;
     82}