diff mbox

[1/3] fuzz/x86emul: avoid race in link farm rune

Message ID 20170216185651.30110-2-wei.liu2@citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wei Liu Feb. 16, 2017, 6:56 p.m. UTC
Several `ln -sf` can race with each other and cause error like:

14:43:56 00:07:06 O: ln: cannot remove 'asm': No such file or directory

Provide dedicated targets for soft-linking directories.

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
---
 tools/fuzz/x86_instruction_emulator/Makefile | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Andrew Cooper Feb. 16, 2017, 7:10 p.m. UTC | #1
On 16/02/17 18:56, Wei Liu wrote:
> Several `ln -sf` can race with each other and cause error like:
>
> 14:43:56 00:07:06 O: ln: cannot remove 'asm': No such file or directory
>
> Provide dedicated targets for soft-linking directories.
>
> Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Signed-off-by: Wei Liu <wei.liu2@citrix.com>
> ---
>  tools/fuzz/x86_instruction_emulator/Makefile | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/tools/fuzz/x86_instruction_emulator/Makefile b/tools/fuzz/x86_instruction_emulator/Makefile
> index fede7e9afd..0cd49753cf 100644
> --- a/tools/fuzz/x86_instruction_emulator/Makefile
> +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> @@ -8,12 +8,16 @@ else
>  x86-instruction-emulator-fuzzer-all:
>  endif
>  
> -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> +x86_emulate:
>  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
>  
> -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate

You should be able to do this:

x86_emulate/%: x86_emulate

> +
> +asm:
>  	[ -L asm ] || ln -sf $(XEN_ROOT)/xen/include/asm-x86 asm
>  
> +asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h: asm

And this:

asm/%: asm

Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>

> +
>  x86_emulate.c x86_emulate.h: %:
>  	[ -L $* ] || ln -sf $(XEN_ROOT)/tools/tests/x86_emulator/$*
>
Jan Beulich Feb. 17, 2017, 9:24 a.m. UTC | #2
>>> On 16.02.17 at 19:56, <wei.liu2@citrix.com> wrote:
> --- a/tools/fuzz/x86_instruction_emulator/Makefile
> +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> @@ -8,12 +8,16 @@ else
>  x86-instruction-emulator-fuzzer-all:
>  endif
>  
> -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> +x86_emulate:
>  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .

In addition to what Andrew has asked for, I would then also appreciate
if you used $@ here and ...

> -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
> +
> +asm:
>  	[ -L asm ] || ln -sf $(XEN_ROOT)/xen/include/asm-x86 asm

... here along the lines of ...

> +asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h: asm
> +
>  x86_emulate.c x86_emulate.h: %:
>  	[ -L $* ] || ln -sf $(XEN_ROOT)/tools/tests/x86_emulator/$*

the use of $* here. Looking at this last one makes me notice, btw,
that the second argument to ln is missing? Is it portable to assume
that it'll use . in that case?

Jan
Wei Liu Feb. 17, 2017, 10:12 a.m. UTC | #3
On Thu, Feb 16, 2017 at 07:10:41PM +0000, Andrew Cooper wrote:
> On 16/02/17 18:56, Wei Liu wrote:
> > Several `ln -sf` can race with each other and cause error like:
> >
> > 14:43:56 00:07:06 O: ln: cannot remove 'asm': No such file or directory
> >
> > Provide dedicated targets for soft-linking directories.
> >
> > Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
> > Signed-off-by: Wei Liu <wei.liu2@citrix.com>
> > ---
> >  tools/fuzz/x86_instruction_emulator/Makefile | 8 ++++++--
> >  1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/fuzz/x86_instruction_emulator/Makefile b/tools/fuzz/x86_instruction_emulator/Makefile
> > index fede7e9afd..0cd49753cf 100644
> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> > @@ -8,12 +8,16 @@ else
> >  x86-instruction-emulator-fuzzer-all:
> >  endif
> >  
> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> > +x86_emulate:
> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
> >  
> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
> 
> You should be able to do this:
> 
> x86_emulate/%: x86_emulate
> 

Using % won't work. Jan made a similar comment during the first
iteration of the fuzzer series. It turned out that we needed to list
explicitly every file because of the other rules explicitly listed
those files.


> > +
> > +asm:
> >  	[ -L asm ] || ln -sf $(XEN_ROOT)/xen/include/asm-x86 asm
> >  
> > +asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h: asm
> 
> And this:
> 
> asm/%: asm
> 

This can be made work by eliminating the explicit listing of individual
files because we're linking asm-x86 wholesale.

Wei.

> Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
> 
> > +
> >  x86_emulate.c x86_emulate.h: %:
> >  	[ -L $* ] || ln -sf $(XEN_ROOT)/tools/tests/x86_emulator/$*
> >  
>
Wei Liu Feb. 17, 2017, 10:12 a.m. UTC | #4
On Fri, Feb 17, 2017 at 02:24:15AM -0700, Jan Beulich wrote:
> >>> On 16.02.17 at 19:56, <wei.liu2@citrix.com> wrote:
> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> > @@ -8,12 +8,16 @@ else
> >  x86-instruction-emulator-fuzzer-all:
> >  endif
> >  
> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> > +x86_emulate:
> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
> 
> In addition to what Andrew has asked for, I would then also appreciate
> if you used $@ here and ...
> 

Using $@ is OK.

> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
> > +
> > +asm:
> >  	[ -L asm ] || ln -sf $(XEN_ROOT)/xen/include/asm-x86 asm
> 
> ... here along the lines of ...
> 
> > +asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h: asm
> > +
> >  x86_emulate.c x86_emulate.h: %:
> >  	[ -L $* ] || ln -sf $(XEN_ROOT)/tools/tests/x86_emulator/$*
> 
> the use of $* here. Looking at this last one makes me notice, btw,
> that the second argument to ln is missing? Is it portable to assume
> that it'll use . in that case?
> 

Yes. From manpage:

ln [OPTION]... TARGET                  (2nd form)
... in the 2nd form, create a link to TARGET in the current directory.

Wei.

> Jan
>
Jan Beulich Feb. 17, 2017, 10:33 a.m. UTC | #5
>>> On 17.02.17 at 11:12, <wei.liu2@citrix.com> wrote:
> On Thu, Feb 16, 2017 at 07:10:41PM +0000, Andrew Cooper wrote:
>> On 16/02/17 18:56, Wei Liu wrote:
>> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
>> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
>> > @@ -8,12 +8,16 @@ else
>> >  x86-instruction-emulator-fuzzer-all:
>> >  endif
>> >  
>> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
>> > +x86_emulate:
>> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
>> >  
>> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
>> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
>> 
>> You should be able to do this:
>> 
>> x86_emulate/%: x86_emulate
>> 
> 
> Using % won't work. Jan made a similar comment during the first
> iteration of the fuzzer series. It turned out that we needed to list
> explicitly every file because of the other rules explicitly listed
> those files.

There was something in that area, but explicitly mentioning files
elsewhere should not prevent this dependency to work as long as
the files don't exist without the rule's commands having run.

Jan
Wei Liu Feb. 17, 2017, 11:36 a.m. UTC | #6
On Fri, Feb 17, 2017 at 03:33:26AM -0700, Jan Beulich wrote:
> >>> On 17.02.17 at 11:12, <wei.liu2@citrix.com> wrote:
> > On Thu, Feb 16, 2017 at 07:10:41PM +0000, Andrew Cooper wrote:
> >> On 16/02/17 18:56, Wei Liu wrote:
> >> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
> >> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> >> > @@ -8,12 +8,16 @@ else
> >> >  x86-instruction-emulator-fuzzer-all:
> >> >  endif
> >> >  
> >> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> >> > +x86_emulate:
> >> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
> >> >  
> >> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> >> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
> >> 
> >> You should be able to do this:
> >> 
> >> x86_emulate/%: x86_emulate
> >> 
> > 
> > Using % won't work. Jan made a similar comment during the first
> > iteration of the fuzzer series. It turned out that we needed to list
> > explicitly every file because of the other rules explicitly listed
> > those files.
> 
> There was something in that area, but explicitly mentioning files
> elsewhere should not prevent this dependency to work as long as
> the files don't exist without the rule's commands having run.
> 

I didn't dig out the old email so the description of the cause might be
inaccurate.

Do you want me to do anything other than explicitly listing every file
as we did before? I'm not sure I get your request.

Wei.

> Jan
>
Jan Beulich Feb. 17, 2017, 11:44 a.m. UTC | #7
>>> On 17.02.17 at 12:36, <wei.liu2@citrix.com> wrote:
> On Fri, Feb 17, 2017 at 03:33:26AM -0700, Jan Beulich wrote:
>> >>> On 17.02.17 at 11:12, <wei.liu2@citrix.com> wrote:
>> > On Thu, Feb 16, 2017 at 07:10:41PM +0000, Andrew Cooper wrote:
>> >> On 16/02/17 18:56, Wei Liu wrote:
>> >> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
>> >> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
>> >> > @@ -8,12 +8,16 @@ else
>> >> >  x86-instruction-emulator-fuzzer-all:
>> >> >  endif
>> >> >  
>> >> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
>> >> > +x86_emulate:
>> >> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
>> >> >  
>> >> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
>> >> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
>> >> 
>> >> You should be able to do this:
>> >> 
>> >> x86_emulate/%: x86_emulate
>> >> 
>> > 
>> > Using % won't work. Jan made a similar comment during the first
>> > iteration of the fuzzer series. It turned out that we needed to list
>> > explicitly every file because of the other rules explicitly listed
>> > those files.
>> 
>> There was something in that area, but explicitly mentioning files
>> elsewhere should not prevent this dependency to work as long as
>> the files don't exist without the rule's commands having run.
> 
> I didn't dig out the old email so the description of the cause might be
> inaccurate.
> 
> Do you want me to do anything other than explicitly listing every file
> as we did before? I'm not sure I get your request.

Well, I'd prefer the shorter variant Andrew did suggest, so if that's
not possible to be used here, I think it would help if the reason was
recorded (in the commit message) now, to avoid later having the
discussion yet another time.

Jan
Wei Liu Feb. 20, 2017, 12:03 p.m. UTC | #8
On Fri, Feb 17, 2017 at 04:44:45AM -0700, Jan Beulich wrote:
> >>> On 17.02.17 at 12:36, <wei.liu2@citrix.com> wrote:
> > On Fri, Feb 17, 2017 at 03:33:26AM -0700, Jan Beulich wrote:
> >> >>> On 17.02.17 at 11:12, <wei.liu2@citrix.com> wrote:
> >> > On Thu, Feb 16, 2017 at 07:10:41PM +0000, Andrew Cooper wrote:
> >> >> On 16/02/17 18:56, Wei Liu wrote:
> >> >> > --- a/tools/fuzz/x86_instruction_emulator/Makefile
> >> >> > +++ b/tools/fuzz/x86_instruction_emulator/Makefile
> >> >> > @@ -8,12 +8,16 @@ else
> >> >> >  x86-instruction-emulator-fuzzer-all:
> >> >> >  endif
> >> >> >  
> >> >> > -x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
> >> >> > +x86_emulate:
> >> >> >  	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
> >> >> >  
> >> >> > -asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
> >> >> > +x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
> >> >> 
> >> >> You should be able to do this:
> >> >> 
> >> >> x86_emulate/%: x86_emulate
> >> >> 
> >> > 
> >> > Using % won't work. Jan made a similar comment during the first
> >> > iteration of the fuzzer series. It turned out that we needed to list
> >> > explicitly every file because of the other rules explicitly listed
> >> > those files.
> >> 
> >> There was something in that area, but explicitly mentioning files
> >> elsewhere should not prevent this dependency to work as long as
> >> the files don't exist without the rule's commands having run.
> > 
> > I didn't dig out the old email so the description of the cause might be
> > inaccurate.
> > 
> > Do you want me to do anything other than explicitly listing every file
> > as we did before? I'm not sure I get your request.
> 
> Well, I'd prefer the shorter variant Andrew did suggest, so if that's
> not possible to be used here, I think it would help if the reason was
> recorded (in the commit message) now, to avoid later having the
> discussion yet another time.

I think I figure out how to make it work. New version of patches coming
soon.

Wei.
diff mbox

Patch

diff --git a/tools/fuzz/x86_instruction_emulator/Makefile b/tools/fuzz/x86_instruction_emulator/Makefile
index fede7e9afd..0cd49753cf 100644
--- a/tools/fuzz/x86_instruction_emulator/Makefile
+++ b/tools/fuzz/x86_instruction_emulator/Makefile
@@ -8,12 +8,16 @@  else
 x86-instruction-emulator-fuzzer-all:
 endif
 
-x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
+x86_emulate:
 	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate .
 
-asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h:
+x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h: x86_emulate
+
+asm:
 	[ -L asm ] || ln -sf $(XEN_ROOT)/xen/include/asm-x86 asm
 
+asm/x86-vendors.h asm/x86-defns.h asm/msr-index.h: asm
+
 x86_emulate.c x86_emulate.h: %:
 	[ -L $* ] || ln -sf $(XEN_ROOT)/tools/tests/x86_emulator/$*