[LTP] [PATCH 3/4] syscalls/mmap02: Rewrite the test using new LTP API

Cyril Hrubis chrubis@suse.cz
Tue Aug 29 11:07:17 CEST 2023


Hi!
>  static void setup(void)
>  {
> -	char *tst_buff;
> -
> -	tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> -	TEST_PAUSE;
> +	char *buf;
>  
>  	page_sz = getpagesize();
> +	buf = SAFE_CALLOC(page_sz, sizeof(char));
                                   ^
				   this is 1 by definition

So we can do just SAFE_MALLOC(page_sz);

> +	memset(buf, 'A', page_sz);
>  
> -	/* Allocate space for the test buffer */
> -	if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) {
> -		tst_brkm(TFAIL, NULL, "calloc failed (tst_buff)");
> -	}
> -
> -	/* Fill the test buffer with the known data */
> -	memset(tst_buff, 'A', page_sz);
> +	fd = SAFE_OPEN(TEMPFILE, O_RDWR | O_CREAT, 0666);
> +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, page_sz);
> +	free(buf);
> +	SAFE_FCHMOD(fd, 0444);
> +	SAFE_CLOSE(fd);
>  
> -	tst_tmpdir();
> -
> -	/* Creat a temporary file used for mapping */
> -	if ((fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666)) < 0) {
> -		free(tst_buff);
> -		tst_brkm(TFAIL | TERRNO, cleanup, "opening %s failed",
> -			 TEMPFILE);
> -	}
> -
> -	/* Write test buffer contents into temporary file */
> -	if (write(fildes, tst_buff, page_sz) < (int)page_sz) {
> -		free(tst_buff);
> -		tst_brkm(TFAIL | TERRNO, cleanup,
> -			 "writing to %s failed", TEMPFILE);
> -	}
> -
> -	/* Free the memory allocated for test buffer */
> -	free(tst_buff);
> -
> -	/* Change Mode permissions on Temporary file */
> -	if (fchmod(fildes, 0444) < 0) {
> -		tst_brkm(TFAIL | TERRNO, cleanup, "fchmod(%s, 0444) failed",
> -			 TEMPFILE);
> -	}
> +	fd = SAFE_OPEN(TEMPFILE, O_RDONLY);
> +	dummy = SAFE_CALLOC(page_sz, sizeof(char));

Why do we allocate second buffer? Cant we just keep the buf? Bonus point
is that the buf was alread filled with data we expect in the file, so we
don't have to read them with read() in the run() function.

> +}
>  
> -	/* Close the temporary file */
> -	if (close(fildes) < 0) {
> -		tst_brkm(TFAIL | TERRNO, cleanup, "closing %s failed",
> -			 TEMPFILE);
> +static void run(void)
> +{
> +	addr = mmap(0, page_sz, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
> +	if (addr == MAP_FAILED) {
> +		tst_res(TFAIL | TERRNO, "mmap() of %s failed", TEMPFILE);
> +		return;
>  	}
>  
> -	/* Open the temporary file again, - Readonly mode */
> -	if ((fildes = open(TEMPFILE, O_RDONLY)) < 0) {
> -		tst_brkm(TFAIL, cleanup, "reopening %s readonly failed",
> -			 TEMPFILE);
> -	}
> +	SAFE_READ(1, fd, dummy, page_sz);
> +	SAFE_LSEEK(fd, 0, SEEK_SET);
>  
> -	/* Allocate and initialize dummy string of system page size bytes */
> -	if ((dummy = calloc(page_sz, sizeof(char))) == NULL) {
> -		tst_brkm(TFAIL, cleanup, "calloc failed (dummy)");
> -	}
> +	if (memcmp(dummy, addr, page_sz) == 0)
> +		tst_res(TPASS, "mmap() functionality successful");
> +	else
> +		tst_res(TFAIL, "mapped memory area contains invalid data");
>  
> +	SAFE_MUNMAP(addr, page_sz);
>  }
>  
>  static void cleanup(void)
>  {
> -	close(fildes);
> -	free(dummy);
> -	tst_rmdir();
> +	if (fd > 0)
> +		SAFE_CLOSE(fd);
> +	if (dummy)
> +		free(dummy);

free(NULL) is no-op so there is no need for the if ().

>  }
> +
> +static struct tst_test test = {
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.test_all = run,
> +	.needs_tmpdir = 1
> +};
> -- 
> 2.41.0
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list