[PATCH v2] v4l2.c: a new (incomplete) decoder for Video4Linux ioctls args

Dmitry V. Levin ldv at altlinux.org
Sat Jun 14 17:22:22 UTC 2014


On Tue, Jun 03, 2014 at 11:29:42AM +0200, Philippe De Muyter wrote:
> --- /dev/null
> +++ b/v4l2.c
[...]
> +#ifdef linux

Starting with strace v4.7 it is always linux.

[...]
> +#include "xlat/v4l2_device_capabilities_flags.h"
> +
> +#include "xlat/v4l2_buf_types.h"
> +
> +#include "xlat/v4l2_buf_flags.h"
> +
> +#include "xlat/v4l2_framesize_types.h"
> +
> +#include "xlat/v4l2_frameinterval_types.h"
> +
> +#include "xlat/v4l2_fields.h"
> +
> +#include "xlat/v4l2_colorspaces.h"
> +
> +#include "xlat/v4l2_format_description_flags.h"
> +
> +#include "xlat/v4l2_memories.h"
> +
> +#include "xlat/v4l2_control_ids.h"
> +
> +#include "xlat/v4l2_control_types.h"
> +
> +#include "xlat/v4l2_control_flags.h"
> +
> +#include "xlat/v4l2_control_classes.h"
> +
> +#include "xlat/v4l2_streaming_capabilities.h"
> +
> +#include "xlat/v4l2_capture_modes.h"
> +
> +#include "xlat/v4l2_input_types.h"

These empty lines are not necessary.

[...]
> +#if (WORDS_BIGENDIAN == 1)

I suggest a simpler form: #if WORDS_BIGENDIAN

> +		tprintf("pix={width=%u, height=%u, pixelformat=",
> +						pix->width, pix->height);

Please fix indentation in this and other similar cases.

[...]
> +#if defined(HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) && HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE

All macros listed in AC_CHECK_DECLS are defined.

> +	case VIDIOC_G_FMT:
> +	case VIDIOC_S_FMT:
> +	case VIDIOC_TRY_FMT: {
> +		struct v4l2_format f;
> +
> +		if (umove(tcp, arg, &f) < 0) {
> +			tprintf(", %#lx", arg);
> +		} else {
> +			if (entering(tcp)) {
> +				tprints(", {type=");
> +				printxval(v4l2_buf_types, f.type, "V4L2_BUF_TYPE_???");
> +			}
> +			if ((entering(tcp) && code != VIDIOC_G_FMT)
> +			|| (exiting(tcp) && !syserror(tcp))) {
> +				tprints(exiting(tcp) ? " => " : ", ");
> +				print_v4l2_format_fmt(&f);
> +			}
> +			if (exiting(tcp))
> +				tprints("}");
> +		}
> +		return 1;

In this and other similar places, no need to repeat the code from default
ioctl parser.  Please replace
	if (umove(tcp, arg, &f) < 0) {
		tprintf(", %#lx", arg);
	} else {
		...
	}
with
	if (umove(tcp, arg, &f) < 0)
		return 0;
	...

> +	case VIDIOC_G_PARM:
> +	case VIDIOC_S_PARM: {
> +		struct v4l2_streamparm s;
> +
> +		if (entering(tcp))
> +			return 1;
> +		if (umove(tcp, arg, &s) < 0) {
> +			tprintf(", %#lx", arg);
> +		} else {
> +			tprints(", {type=");
> +			printxval(v4l2_buf_types, s.type, "V4L2_BUF_TYPE_???");
> +
> +			if (s.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {

In this and many other similar cases, please ensure that
you are not printing too much garbage in case of syserror(tcp).

[...]
> +	case VIDIOC_S_EXT_CTRLS:
> +	case VIDIOC_TRY_EXT_CTRLS:
> +	case VIDIOC_G_EXT_CTRLS: {
> +		struct v4l2_ext_controls c;
> +		unsigned n;
> +
> +		if (entering(tcp) || umove(tcp, arg, &c) < 0)
> +			return 0;
> +
> +		tprints(", ctrl_class=");
> +		printxval(v4l2_control_classes, c.ctrl_class,
> +			  "V4L2_CTRL_CLASS_???");
> +		tprintf(", count=%u, error_idx=%u, controls=[", c.count,
> +			c.error_idx);
> +
> +		for (n = 0; n < c.count; ++n) {

c.count is uint32_t, so please ensure that you are not going to print
2^32-1 elements, especially if the structure does not come from the
kernel.

> +			struct v4l2_ext_control ctrl;
> +			if (n > 0)
> +				tprints(", ");
> +			umove(tcp, (long) (c.controls + n), &ctrl);

Please check umove return code; there is no need to fetch remaining
elements if umove fails.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20140614/c3d29298/attachment.bin>


More information about the Strace-devel mailing list