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

Re: The open() system call in f8 really broken...



On Thu, Aug 16, 2007 at 04:18:50PM -0500, Eric Sandeen wrote:
> Hmm is that what killed my e2sfprogs build?  This looks like a bug in
> the check:
> 
> 
>    195  memset(data, 0, sizeof(struct test_private_data));
>    196  data->magic = EXT2_ET_MAGIC_TEST_IO_CHANNEL;
>    197  if (test_io_backing_manager) {
>    198          retval = test_io_backing_manager->open(name, flags,
>    199                                                 &data->real);
>    200             if (retval)
>    201                     goto cleanup;
>    202  } else
>    203             data->real = 0;
> 
> test_io.c: In function 'test_open':
> test_io.c:198: error: expected identifier before '(' token

This has been mentioned here several times already in other threads.
In this case you are not calling open(1), but some function pointer.
And therefore it is undesirable to let it be expanded as function-like
macro (which POSIX allows).
The right fix is to use one of:
retval = (test_io_backing_manager->open)(name, flags, &data->real);
retval = (*test_io_backing_manager->open)(name, flags, &data->real);
retval = test_io_backing_manager->(open)(name, flags, &data->real);
or, far less desirable, but what standard allows,
#undef open
above this.  The last one means that no open(1) error checking will be
done in the rest of the source file, which is not a good idea.

	Jakub


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