[LTP] [PATCH 4/5] SAFE_MACROS: Add SAFE_PRCTL()

Guangwen Feng fenggw-fnst@cn.fujitsu.com
Thu Dec 15 11:17:37 CET 2016


Hi!

On 12/05/2016 10:40 PM, Cyril Hrubis wrote:
> Hi!
>> +int safe_prctl(const char *file, const int lineno, int opt, ...);
>> +#define SAFE_PRCTL(opt, ...) \
>> +	safe_prctl(__FILE__, __LINE__, (opt), ##__VA_ARGS__)
>> +
>>  #endif /* SAFE_MACROS_H__ */
>> diff --git a/lib/safe_macros.c b/lib/safe_macros.c
>> index 1c89b8c..c8c5383 100644
>> --- a/lib/safe_macros.c
>> +++ b/lib/safe_macros.c
>> @@ -807,3 +807,23 @@ int safe_system(const char *file, const int lineno, const char *cmd)
>>  
>>  	return rval;
>>  }
>> +
>> +int safe_prctl(const char *file, const int lineno, int opt, ...)
>> +{
>> +	va_list ap;
>> +	int rval;
>> +	unsigned long arg;
>> +
>> +	va_start(ap, opt);
>> +	arg = va_arg(ap, unsigned long);
>> +	va_end(ap);
> 
> This is broken by design. The prctl() can have up to four long arguments
> but here we use only the first one unconditionally.
> 
> 
> I'm not sure how we can fix this easily. Either we can count number of
> arguments passed to the SAFE_PRCTL() by hacky preprocessor counting[1]
> and pass it as a first agument.
> 
> Or we can switch on the opt to figure out the number of expected arguments,
> which is ugly as well, but we can at least start small by adding only
> opts that we use.
> 
> [1]
> https://groups.google.com/forum/?_escaped_fragment_=topic/comp.std.c/d-6Mj5Lko_s#!topic/comp.std.c/d-6Mj5Lko_s
> 

Thanks for your review and kindly suggestion.

I see the prctl()'s arguments is variable in prctl.h, just like the fcntl() and ioctl(),
so I think maybe I can do it just as fcntl() and ioctl() did?

Best Regards,
Guangwen Feng

>> +	rval = prctl(opt, arg);
>> +	if (rval < 0) {
>> +		tst_brkm(TBROK | TERRNO, NULL,
>> +			 "%s:%d prctl(%i, %lu) failed",
>> +			 file, lineno, opt, arg);
>> +	}
>> +
>> +	return rval;
>> +}
>> -- 
>> 1.8.4.2
>>
>>
>>
>>
>> -- 
>> Mailing list info: https://lists.linux.it/listinfo/ltp
> 




More information about the ltp mailing list