[media-m5602-po1030] question about return value check

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

 




Hello everybody,

While looking into Coverity ID 1227044 I ran into the following piece of code at drivers/media/usb/gspca/m5602/m5602_po1030.c:280:

280int po1030_start(struct sd *sd)
281{
282        struct cam *cam = &sd->gspca_dev.cam;
283        int i, err = 0;
284        int width = cam->cam_mode[sd->gspca_dev.curr_mode].width;
285        int height = cam->cam_mode[sd->gspca_dev.curr_mode].height;
286        int ver_offs = cam->cam_mode[sd->gspca_dev.curr_mode].priv;
287        u8 data;
288
289        switch (width) {
290        case 320:
291                data = PO1030_SUBSAMPLING;
292                err = m5602_write_sensor(sd, PO1030_CONTROL3, &data, 1);
293                if (err < 0)
294                        return err;
295
296                data = ((width + 3) >> 8) & 0xff;
297 err = m5602_write_sensor(sd, PO1030_WINDOWWIDTH_H, &data, 1);
298                if (err < 0)
299                        return err;
300
301                data = (width + 3) & 0xff;
302 err = m5602_write_sensor(sd, PO1030_WINDOWWIDTH_L, &data, 1);
303                if (err < 0)
304                        return err;
305
306                data = ((height + 1) >> 8) & 0xff;
307 err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_H, &data, 1);
308                if (err < 0)
309                        return err;
310
311                data = (height + 1) & 0xff;
312 err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_L, &data, 1);
313
314                height += 6;
315                width -= 1;
316                break;
317
318        case 640:
319                data = 0;
320                err = m5602_write_sensor(sd, PO1030_CONTROL3, &data, 1);
321                if (err < 0)
322                        return err;
323
324                data = ((width + 7) >> 8) & 0xff;
325 err = m5602_write_sensor(sd, PO1030_WINDOWWIDTH_H, &data, 1);
326                if (err < 0)
327                        return err;
328
329                data = (width + 7) & 0xff;
330 err = m5602_write_sensor(sd, PO1030_WINDOWWIDTH_L, &data, 1);
331                if (err < 0)
332                        return err;
333
334                data = ((height + 3) >> 8) & 0xff;
335 err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_H, &data, 1);
336                if (err < 0)
337                        return err;
338
339                data = (height + 3) & 0xff;
340 err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_L, &data, 1);
341
342                height += 12;
343                width -= 2;
344                break;
345        }
346        err = m5602_write_bridge(sd, M5602_XB_SENSOR_TYPE, 0x0c);
347        if (err < 0)
348                return err;
349
350        err = m5602_write_bridge(sd, M5602_XB_LINE_OF_FRAME_H, 0x81);
351        if (err < 0)
352                return err;
353
354        err = m5602_write_bridge(sd, M5602_XB_PIX_OF_LINE_H, 0x82);
355        if (err < 0)
356                return err;
357
358        err = m5602_write_bridge(sd, M5602_XB_SIG_INI, 0x01);
359        if (err < 0)
360                return err;
361
362        err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA,
363                                 ((ver_offs >> 8) & 0xff));
364        if (err < 0)
365                return err;
366
367 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (ver_offs & 0xff));
368        if (err < 0)
369                return err;
370
371        for (i = 0; i < 2 && !err; i++)
372                err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
373        if (err < 0)
374                return err;
375
376 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height >> 8) & 0xff);
377        if (err < 0)
378                return err;
379
380        err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height & 0xff));
381        if (err < 0)
382                return err;
383
384        for (i = 0; i < 2 && !err; i++)
385                err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
386
387        for (i = 0; i < 2 && !err; i++)
388                err = m5602_write_bridge(sd, M5602_XB_SIG_INI, 0);
389
390        for (i = 0; i < 2 && !err; i++)
391                err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, 0);
392        if (err < 0)
393                return err;
394
395 err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, (width >> 8) & 0xff);
396        if (err < 0)
397                return err;
398
399        err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, (width & 0xff));
400        if (err < 0)
401                return err;
402
403        err = m5602_write_bridge(sd, M5602_XB_SIG_INI, 0);
404        return err;
405}

The issue here is that the value contained in variable _err_ at lines 312 and 340 is not being evaluated as it happens in other instances after calling m5602_write_sensor().

I'm suspicious this is not the original intention and maybe a patch like the following could be applied:

--- a/drivers/media/usb/gspca/m5602/m5602_po1030.c+++ b/drivers/media/usb/gspca/m5602/m5602_po1030.c@@ -310,6 +310,8 @@ int po1030_start(struct sd *sd)

                data = (height + 1) & 0xff;
                err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_L, &data, 1);
+               if (err < 0)
+                       return err;

                height += 6;
                width -= 1;
@@ -338,6 +340,8 @@ int po1030_start(struct sd *sd)

                data = (height + 3) & 0xff;
                err = m5602_write_sensor(sd, PO1030_WINDOWHEIGHT_L, &data, 1);
+               if (err < 0)
+                       return err;

                height += 12;
                width -= 2;


What do you think?

It would be great to hear your opinions about it.

I'd really appreciate any comment on this.

Thank you!
--
Gustavo A. R. Silva








[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux