Re: [PATCH ulogd2 v3 1/2] pcap: simplify opening of output file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 16, 2023 at 11:07:53AM +0000, Jeremy Sowden wrote:
> Instead of statting the file, and choosing the mode with which to open
> it and whether to write the PCAP header based on the result, always open
> it with mode "a" and _then_ stat it.  This simplifies the flow-control
> and avoids a race between statting and opening.
> 
> Signed-off-by: Jeremy Sowden <jeremy@xxxxxxxxxx>
> ---
>  output/pcap/ulogd_output_PCAP.c | 42 ++++++++++++---------------------
>  1 file changed, 15 insertions(+), 27 deletions(-)
> 
> diff --git a/output/pcap/ulogd_output_PCAP.c b/output/pcap/ulogd_output_PCAP.c
> index e7798f20c8fc..220fc6dec5fe 100644
> --- a/output/pcap/ulogd_output_PCAP.c
> +++ b/output/pcap/ulogd_output_PCAP.c
> @@ -220,33 +220,21 @@ static int append_create_outfile(struct ulogd_pluginstance *upi)
>  {
>  	struct pcap_instance *pi = (struct pcap_instance *) &upi->private;
>  	char *filename = upi->config_kset->ces[0].u.string;
> -	struct stat st_dummy;
> -	int exist = 0;
> -
> -	if (stat(filename, &st_dummy) == 0 && st_dummy.st_size > 0)
> -		exist = 1;
> -
> -	if (!exist) {
> -		pi->of = fopen(filename, "w");
> -		if (!pi->of) {
> -			ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n",
> -				  filename,
> -				  strerror(errno));
> -			return -EPERM;
> -		}
> -		if (!write_pcap_header(pi)) {
> -			ulogd_log(ULOGD_ERROR, "can't write pcap header: %s\n",
> -				  strerror(errno));
> -			return -ENOSPC;
> -		}
> -	} else {
> -		pi->of = fopen(filename, "a");
> -		if (!pi->of) {
> -			ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n", 
> -				filename,
> -				strerror(errno));
> -			return -EPERM;
> -		}		
> +	struct stat st_of;
> +
> +	pi->of = fopen(filename, "a");
> +	if (!pi->of) {
> +		ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n",
> +			  filename,
> +			  strerror(errno));
> +		return -EPERM;
> +	}
> +	if (fstat(fileno(pi->of), &st_of) == 0 && st_of.st_size == 0) {
> +	    if (!write_pcap_header(pi)) {
        ^^^^
coding style nitpick, it can be fixed before applying it.

> +		    ulogd_log(ULOGD_ERROR, "can't write pcap header: %s\n",
> +			      strerror(errno));
> +		    return -ENOSPC;
> +	    }
>  	}
>  
>  	return 0;
> -- 
> 2.39.2
> 



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux