1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
$NetBSD: patch-ac,v 1.2 2007/01/02 18:32:47 adam Exp $
--- camlibs/ptp2/ptp.c.orig 2006-12-24 16:16:20.000000000 +0100
+++ camlibs/ptp2/ptp.c
@@ -524,6 +524,9 @@ static inline uint16_t
ptp_usb_event (PTPParams* params, PTPContainer* event, int wait)
{
uint16_t ret;
+ uint32_t packetlen;
+ size_t toread;
+ unsigned char *bp;
unsigned int rlen;
PTPUSBEventContainer usbevent;
PTP_CNT_INIT(usbevent);
@@ -533,8 +536,24 @@ ptp_usb_event (PTPParams* params, PTPCon
switch(wait) {
case PTP_EVENT_CHECK:
- ret=params->check_int_func((unsigned char*)&usbevent,
- sizeof(usbevent), params->data, &rlen);
+ ret=params->check_int_func((unsigned char*)&packetlen,
+ sizeof(packetlen), params->data, &rlen);
+ if (ret!=PTP_RC_OK)
+ break;
+ if (rlen != sizeof(packetlen)) {
+ ret = PTP_ERROR_IO;
+ break;
+ }
+ toread = dtoh32(packetlen) - sizeof(packetlen);
+ bp = (unsigned char*)&usbevent.type;
+ while (toread > 0) {
+ ret=params->check_int_func(bp,
+ toread, params->data, &rlen);
+ if (ret!=PTP_RC_OK)
+ break;
+ toread -= rlen;
+ bp += rlen;
+ }
break;
case PTP_EVENT_CHECK_FAST:
ret=params->check_int_fast_func((unsigned char*)
|