Ethereal-dev: Re: [Ethereal-dev] File overwriting still possible (preliminary patch)

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Richard Sharpe <rsharpe@xxxxxxxxxx>
Date: Thu, 18 Jul 2002 01:54:12 +0930 (CST)
On Wed, 17 Jul 2002, Joerg Mayer wrote:

> The problem with file.c still persists when I enter the filename from
> the command line and then "save to" via the gui. This is caused by the
> file requester always returning an absolute path. I've created a very
> preliminary patch that resolves this. I don't know whether this has any
> chance of working with Windows too, or if I should put a #ifdef Unix
> around the new code. Please let me know how to improve this patch. I'm
> also planning to handle the error case differently: Create a temporary
> file, write to that and after that unlink the old one and rename the
> temp file.  As this replaces Ethereal's input file, I guess I have to
> take care of that. Is this more than closing and reopening the file?
> 
>  ciao
>  Jörg
> 
> 
> 
> Index: ethereal/file.c
> ===================================================================
> RCS file: /cvsroot/ethereal/file.c,v
> retrieving revision 1.282
> diff -u -r1.282 file.c
> --- file.c	2002/07/16 07:15:04	1.282
> +++ file.c	2002/07/17 07:48:24
> @@ -1725,6 +1725,9 @@
>    struct wtap_pkthdr hdr;
>    union wtap_pseudo_header pseudo_header;
>    guint8        pd[65536];
> +#if 1
> +  struct stat	infile, outfile;
> +#endif
>  
>    name_ptr = get_basename(fname);
>    msg_len = strlen(name_ptr) + strlen(save_fmt) + 2;
> @@ -1737,12 +1740,30 @@
>     * Check that the from file is not the same as to file 
>     * We do it here so we catch all cases ...
>     */
> +#if 0
>    if (strcmp(cf->filename, fname) == 0) {
>      simple_dialog(ESD_TYPE_CRIT, NULL, 
>  		      "Can't save over current capture file: %s!",
>  		      cf->filename);
>      goto fail;
>    }
> +#else
> +  /*
> +   * Unfortunately, the file requester gives us an absolute file
> +   * name and the read file name may be relative (if supplied on
> +   * the command line).
> +   */
> +  infile.st_ino = 1;
> +  outfile.st_ino = 2;
> +  stat(cf->filename, &infile);
> +  stat(fname, &outfile);

That stat is going to fail if fname does not exist, and, while you have 
handled that case above by setting the st_ino fields correctly, it looks 
ugly.

> +  if (infile.st_ino == outfile.st_ino) {
> +    simple_dialog(ESD_TYPE_CRIT, NULL, 
> +		      "Can't save over current capture file: %s!",
> +		      cf->filename);
> +    goto fail;
> +  }
> +#endif
>  
>    if (!save_filtered && !save_marked && save_format == cf->cd_t) {
>      /* We're not filtering packets, and we're saving it in the format
> 
> --
> Joerg Mayer                                          <jmayer@xxxxxxxxx>
> I found out that "pro" means "instead of" (as in proconsul). Now I know
> what proactive means.
> 
> _______________________________________________
> Ethereal-dev mailing list
> Ethereal-dev@xxxxxxxxxxxx
> http://www.ethereal.com/mailman/listinfo/ethereal-dev
> 

-- 
Regards
-----
Richard Sharpe, rsharpe@xxxxxxxxxx, rsharpe@xxxxxxxxx, 
sharpe@xxxxxxxxxxxx