public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: Li Wang <liwang@redhat.com>
Cc: ltp-list@lists.sourceforge.net
Subject: Re: [LTP] [PATCH] /vm/hugepage/thp/thp05: cleanup should not use safe macros
Date: Wed, 3 Dec 2014 11:50:24 +0100	[thread overview]
Message-ID: <20141203105024.GA11624@rei.suse.de> (raw)
In-Reply-To: <373996084.5962831.1417596425167.JavaMail.zimbra@redhat.com>

Hi!
> Hi, after thinking over, I feel there is no need to create a static function 
> file_vscanf() and file_vprintf().
> 
> I'd love to create FILE_PRINTF() macro that is not calling the tst_brkm() 
> and issues only a warning. Then we can use FILE_PRINTF() to replace all 
> the safe macros in cleanup().
> 
> So, new patch like this:
> 
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>  include/safe_file_ops.h                            | 10 ++++
>  lib/safe_file_ops.c                                | 59 ++++++++++++++++++++++
>  .../kernel/device-drivers/acpi/ltp_acpi_cpufreq.c  |  4 +-
>  .../kernel/mem/hugetlb/hugeshmget/hugeshmget03.c   |  2 +-
>  testcases/kernel/mem/ksm/ksm01.c                   |  2 +-
>  testcases/kernel/mem/ksm/ksm02.c                   |  2 +-
>  testcases/kernel/mem/ksm/ksm03.c                   |  2 +-
>  testcases/kernel/mem/ksm/ksm04.c                   |  2 +-
>  testcases/kernel/mem/ksm/ksm06.c                   |  6 +--
>  testcases/kernel/mem/thp/thp04.c                   | 10 ++--
>  testcases/kernel/mem/thp/thp05.c                   | 10 ++--
>  testcases/kernel/syscalls/fork/fork13.c            |  2 +-
>  12 files changed, 90 insertions(+), 21 deletions(-)
> 
> diff --git a/include/safe_file_ops.h b/include/safe_file_ops.h
> index 1815984..865575a 100644
> --- a/include/safe_file_ops.h
> +++ b/include/safe_file_ops.h
> @@ -42,6 +42,11 @@
>  /*
>   * All-in-one function to scanf value(s) from a file.
>   */
> +void file_scanf(const char *file, const char *fmt, ...);
> +

In this case we should return some exit value. Simple 0 == ok, 1 ==
failed, would suffice. Otherwise we cannot say if the values were read or
not.

> +#define FILE_SCANF(file, fmt, ...) \
> +	file_scanf((file), (fmt), ## __VA_ARGS__)

The whole point of the macro indirection is to include the file and
lineno parameter in the tst_ messages. Please do that.

>  void safe_file_scanf(const char *file, const int lineno,
>                       void (*cleanup_fn)(void),
>  		     const char *path, const char *fmt, ...)
> @@ -54,6 +59,11 @@ void safe_file_scanf(const char *file, const int lineno,
>  /*
>   * All-in-one function that lets you printf directly into a file.
>   */
> +void file_printf(const char *file, const char *fmt, ...);
> +
> +#define FILE_PRINTF(file, fmt, ...) \
> +	file_printf((file), (fmt), ## __VA_ARGS__)

It would be better to return exit value here as well.

>  void safe_file_printf(const char *file, const int lineno,
>                        void (*cleanup_fn)(void),
>                        const char *path, const char *fmt, ...)
> diff --git a/lib/safe_file_ops.c b/lib/safe_file_ops.c
> index 0325ce2..6c25ea5 100644
> --- a/lib/safe_file_ops.c
> +++ b/lib/safe_file_ops.c
> @@ -73,6 +73,37 @@ static int count_scanf_conversions(const char *fmt)
>  	return cnt;
>  }
>  
> +void file_scanf(const char *file, const char *fmt, ...)
> +{
> +	va_list va;
> +	FILE *f;
> +	int exp_convs, ret;
> +
> +	f = fopen(file, "r");
> +
> +	if (f == NULL) {
> +		tst_resm(TWARN,
> +			"Failed to open FILE '%s' for reading", file);

You have to do a return here otherwise we will continue the execution
till the vfscanf() below and segfault.

> +	}
> +
> +	exp_convs = count_scanf_conversions(fmt);
> +
> +	va_start(va, fmt);
> +	ret = vfscanf(f, fmt, va);
> +	va_end(va);
> +
> +	if (ret == EOF)
> +		tst_resm(TWARN, "The FILE '%s' ended prematurely", file);
> +
> +	if (ret != exp_convs) {
> +		tst_resm(TWARN, "Expected %i conversions got %i FILE '%s'",
> +			 exp_convs, ret, file);
> +	}
> +
> +	if (fclose(f))
> +		tst_resm(TWARN, "Failed to close FILE '%s'", file);

Missing returns here as well, but do not forget to close the file. I.e. do

	if (ret == EOF) {
		tst_resm(TWARN, ...);
		goto err;
	}

	...

	return 0;
err:
	fclose(f)
	return 1;

> +}
> +
>  void safe_file_scanf(const char *file, const int lineno,
>  		     void (*cleanup_fn) (void),
>  		     const char *path, const char *fmt, ...)
> @@ -107,6 +138,34 @@ void safe_file_scanf(const char *file, const int lineno,
>  			 exp_convs, ret, path, file, lineno);
>  	}
>  
> +	if (fclose(f)) {
> +		tst_brkm(TBROK | TERRNO, cleanup_fn,
> +			 "Failed to close FILE '%s' at %s:%d",
> +			 path, file, lineno);
> +	}
> +}
> +
> +void file_printf(const char *file, const char *fmt, ...)
> +{
> +	va_list va;
> +	FILE *f;
> +
> +	f = fopen(file, "w");
> +
> +	if (f == NULL) {
> +		tst_resm(TWARN,
> +			"Failed to open FILE '%s' for writing", file);
> +	}
> +
> +	va_start(va, fmt);
> +
> +	if (vfprintf(f, fmt, va) < 0)
> +		tst_resm(TWARN, "Failed to print to FILE '%s'", file);
> +
> +	va_end(va);
> +
> +	if (fclose(f))
> +		tst_resm(TWARN, "Failed to close FILE '%s'", file);
>  }

Missing return statements here as well.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

       reply	other threads:[~2014-12-03 10:50 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1417596291-8540-1-git-send-email-liwang@redhat.com>
     [not found] ` <373996084.5962831.1417596425167.JavaMail.zimbra@redhat.com>
2014-12-03 10:50   ` Cyril Hrubis [this message]
     [not found] <1417612136-10890-1-git-send-email-liwang@redhat.com>
     [not found] ` <152932834.6076324.1417612296820.JavaMail.zimbra@redhat.com>
2014-12-16 14:47   ` [LTP] [PATCH] /vm/hugepage/thp/thp05: cleanup should not use safe macros Cyril Hrubis
     [not found] <1417512939-6435-1-git-send-email-liwang@redhat.com>
     [not found] ` <2046852420.5414979.1417513768451.JavaMail.zimbra@redhat.com>
2014-12-02 12:00   ` Cyril Hrubis
2014-10-23  3:31 Li Wang
2014-11-06 10:22 ` Cyril Hrubis
     [not found]   ` <857789373.5490769.1415284744752.JavaMail.zimbra@redhat.com>
2014-11-26 14:50     ` Cyril Hrubis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141203105024.GA11624@rei.suse.de \
    --to=chrubis@suse.cz \
    --cc=liwang@redhat.com \
    --cc=ltp-list@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox