support, enabled simultaneously with classic ieee1394 supportepel9
parent
37839e2a17
commit
8d810a51d3
@ -1,51 +0,0 @@
|
||||
diff -Naurp libraw1394-1.3.0/juju/juju.h libraw1394-1.3.0.bitfield/juju/juju.h
|
||||
--- libraw1394-1.3.0/juju/juju.h 2007-10-24 16:47:26.000000000 -0400
|
||||
+++ libraw1394-1.3.0.bitfield/juju/juju.h 2007-10-24 16:50:47.000000000 -0400
|
||||
@@ -29,8 +29,6 @@
|
||||
#include "../src/csr.h"
|
||||
#include "config.h"
|
||||
|
||||
-#define ACK_COMPLETE 1
|
||||
-
|
||||
#define ptr_to_u64(p) ((__u64)(unsigned long)(p))
|
||||
#define u64_to_ptr(p) ((void *)(unsigned long)(p))
|
||||
|
||||
diff -Naurp libraw1394-1.3.0/juju/raw1394-iso.c libraw1394-1.3.0.bitfield/juju/raw1394-iso.c
|
||||
--- libraw1394-1.3.0/juju/raw1394-iso.c 2007-10-24 16:47:26.000000000 -0400
|
||||
+++ libraw1394-1.3.0.bitfield/juju/raw1394-iso.c 2007-10-24 16:53:06.000000000 -0400
|
||||
@@ -40,13 +40,14 @@ queue_packet(raw1394handle_t handle,
|
||||
int err;
|
||||
|
||||
p = &handle->iso.packets[handle->iso.packet_index];
|
||||
- p->payload_length = length;
|
||||
- p->interrupt =
|
||||
- handle->iso.packet_phase == handle->iso.irq_interval - 1;
|
||||
- p->skip = 0;
|
||||
- p->tag = tag;
|
||||
- p->sy = sy;
|
||||
- p->header_length = header_length;
|
||||
+ p->control =
|
||||
+ FW_CDEV_ISO_PAYLOAD_LENGTH(length) |
|
||||
+ FW_CDEV_ISO_TAG(tag) |
|
||||
+ FW_CDEV_ISO_SY(sy) |
|
||||
+ FW_CDEV_ISO_HEADER_LENGTH(header_length);
|
||||
+
|
||||
+ if (handle->iso.packet_phase == handle->iso.irq_interval - 1)
|
||||
+ p->control |= FW_CDEV_ISO_INTERRUPT;
|
||||
|
||||
handle->iso.head += length;
|
||||
handle->iso.packet_count++;
|
||||
@@ -291,12 +292,7 @@ int raw1394_iso_xmit_sync(raw1394handle_
|
||||
struct fw_cdev_queue_iso queue_iso;
|
||||
int len;
|
||||
|
||||
- skip.payload_length = 0;
|
||||
- skip.interrupt = 1;
|
||||
- skip.skip = 1;
|
||||
- skip.tag = 0;
|
||||
- skip.sy = 0;
|
||||
- skip.header_length = 0;
|
||||
+ skip.control = FW_CDEV_ISO_INTERRUPT | FW_CDEV_ISO_SKIP;
|
||||
|
||||
queue_iso.packets = ptr_to_u64(&skip);
|
||||
queue_iso.size = sizeof skip;
|
@ -1,21 +0,0 @@
|
||||
diff -Naurp libraw1394-1.3.0/juju/raw1394-iso.c libraw1394-1.3.0.fix/juju/raw1394-iso.c
|
||||
--- libraw1394-1.3.0/juju/raw1394-iso.c 2008-04-28 13:57:30.000000000 -0400
|
||||
+++ libraw1394-1.3.0.fix/juju/raw1394-iso.c 2008-04-28 14:06:21.000000000 -0400
|
||||
@@ -421,7 +421,7 @@ iso_init(raw1394handle_t handle, int typ
|
||||
}
|
||||
|
||||
handle->iso.buffer =
|
||||
- mmap(NULL, buf_packets * max_packet_size,
|
||||
+ mmap(NULL, buf_packets * handle->iso.max_packet_size,
|
||||
prot, MAP_SHARED, handle->iso.fd, 0);
|
||||
|
||||
if (handle->iso.buffer == MAP_FAILED) {
|
||||
@@ -432,7 +432,7 @@ iso_init(raw1394handle_t handle, int typ
|
||||
}
|
||||
|
||||
handle->iso.buffer_end = handle->iso.buffer +
|
||||
- buf_packets * max_packet_size;
|
||||
+ buf_packets * handle->iso.max_packet_size;
|
||||
handle->iso.head = handle->iso.buffer;
|
||||
handle->iso.tail = handle->iso.buffer;
|
||||
handle->iso.first_payload = handle->iso.buffer;
|
@ -1,51 +0,0 @@
|
||||
diff -Naurp libraw1394-1.3.0/juju/raw1394-iso.c libraw1394-1.3.0.fix/juju/raw1394-iso.c
|
||||
--- libraw1394-1.3.0/juju/raw1394-iso.c 2007-10-22 13:55:58.000000000 -0400
|
||||
+++ libraw1394-1.3.0.fix/juju/raw1394-iso.c 2007-10-22 15:27:54.000000000 -0400
|
||||
@@ -394,6 +394,7 @@ iso_init(raw1394handle_t handle, int typ
|
||||
handle->iso.fd = open(handle->local_filename, O_RDWR);
|
||||
if (handle->iso.fd < 0) {
|
||||
free(handle->iso.packets);
|
||||
+ handle->iso.packets = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -404,6 +405,7 @@ iso_init(raw1394handle_t handle, int typ
|
||||
handle->iso.fd, &ep) < 0) {
|
||||
close(handle->iso.fd);
|
||||
free(handle->iso.packets);
|
||||
+ handle->iso.packets = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -417,6 +419,8 @@ iso_init(raw1394handle_t handle, int typ
|
||||
if (retval < 0) {
|
||||
close(handle->iso.fd);
|
||||
free(handle->iso.packets);
|
||||
+ handle->iso.packets = NULL;
|
||||
+ printf("ioctl call failed, retval = %d\n", retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -427,6 +431,7 @@ iso_init(raw1394handle_t handle, int typ
|
||||
if (handle->iso.buffer == MAP_FAILED) {
|
||||
close(handle->iso.fd);
|
||||
free(handle->iso.packets);
|
||||
+ handle->iso.packets = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -515,8 +520,12 @@ void raw1394_iso_stop(raw1394handle_t ha
|
||||
|
||||
void raw1394_iso_shutdown(raw1394handle_t handle)
|
||||
{
|
||||
- munmap(handle->iso.buffer,
|
||||
- handle->iso.buf_packets * handle->iso.max_packet_size);
|
||||
+ if (handle->iso.buffer) {
|
||||
+ munmap(handle->iso.buffer,
|
||||
+ handle->iso.buf_packets * handle->iso.max_packet_size);
|
||||
+ handle->iso.buffer = NULL;
|
||||
+ }
|
||||
close(handle->iso.fd);
|
||||
free(handle->iso.packets);
|
||||
+ handle->iso.packets = NULL;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,140 @@
|
||||
Originally submitted via Red Hat bugzilla by Philippe Troin:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=451727
|
||||
|
||||
Description:
|
||||
|
||||
While trying to track down some crashes in kino, I found the following problems
|
||||
with libraw1394:
|
||||
|
||||
* There is a DIR* leak in raw1394_set_port().
|
||||
* Lots of data structures are not fully initialized when calling IEEE1394
|
||||
ioctl()s. These cause valgrind errors (benign, as valgrind does not know
|
||||
how to interpret all ioctls. However these also cause kino to crash in
|
||||
libraw1394. I've added a bunch of memset()s to prevent this problem from
|
||||
happening.
|
||||
|
||||
Author: Philippe Troin <phil@fifi.org>
|
||||
|
||||
Forward-ported to libraw1394 git tree by Jarod Wilson.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jwilson@redhat.com>
|
||||
|
||||
--
|
||||
|
||||
src/fw-iso.c | 2 ++
|
||||
src/fw.c | 15 ++++++++++++++-
|
||||
tools/testlibraw.c | 1 +
|
||||
3 files changed, 17 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/fw-iso.c b/src/fw-iso.c
|
||||
index 471d981..a1794c3 100644
|
||||
--- a/src/fw-iso.c
|
||||
+++ b/src/fw-iso.c
|
||||
@@ -401,6 +401,7 @@ iso_init(fw_handle_t handle, int type,
|
||||
}
|
||||
|
||||
handle->iso.closure.func = handle_iso_event;
|
||||
+ memset(&ep, 0, sizeof(ep));
|
||||
ep.events = EPOLLIN;
|
||||
ep.data.ptr = &handle->iso.closure;
|
||||
if (epoll_ctl(handle->epoll_fd, EPOLL_CTL_ADD,
|
||||
@@ -411,6 +412,7 @@ iso_init(fw_handle_t handle, int type,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ memset(&create, 0, sizeof(create));
|
||||
create.type = type;
|
||||
create.channel = channel;
|
||||
create.speed = speed;
|
||||
diff --git a/src/fw.c b/src/fw.c
|
||||
index 1322fe2..3c61385 100644
|
||||
--- a/src/fw.c
|
||||
+++ b/src/fw.c
|
||||
@@ -149,6 +149,8 @@ scan_devices(fw_handle_t handle)
|
||||
fd = open(filename, O_RDWR);
|
||||
if (fd < 0)
|
||||
continue;
|
||||
+ memset(&get_info, 0, sizeof(get_info));
|
||||
+ memset(&reset, 0, sizeof(reset));
|
||||
get_info.version = FW_CDEV_VERSION;
|
||||
get_info.rom = 0;
|
||||
get_info.rom_length = 0;
|
||||
@@ -404,7 +406,10 @@ fw_handle_t fw_new_handle(void)
|
||||
struct epoll_event ep;
|
||||
int i;
|
||||
|
||||
+ memset(&ep, 0, sizeof(ep));
|
||||
+
|
||||
handle = malloc(sizeof *handle);
|
||||
+ memset(handle, 0, sizeof(*handle));
|
||||
|
||||
handle->tag_handler = default_tag_handler;
|
||||
handle->arm_tag_handler = default_arm_tag_handler;
|
||||
@@ -580,6 +585,8 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||
if (fd < 0)
|
||||
continue;
|
||||
|
||||
+ memset(&get_info, 0, sizeof(get_info));
|
||||
+ memset(&reset, 0, sizeof(reset));
|
||||
get_info.version = FW_CDEV_VERSION;
|
||||
get_info.rom = 0;
|
||||
get_info.rom_length = 0;
|
||||
@@ -603,10 +610,12 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||
sizeof handle->devices[i].filename);
|
||||
|
||||
handle->devices[i].closure.func = handle_device_event;
|
||||
+ memset(&ep, 0, sizeof(ep));
|
||||
ep.events = EPOLLIN;
|
||||
ep.data.ptr = &handle->devices[i].closure;
|
||||
if (epoll_ctl(handle->epoll_fd, EPOLL_CTL_ADD, fd, &ep) < 0) {
|
||||
close(fd);
|
||||
+ closedir(dir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -621,6 +630,8 @@ int fw_set_port(fw_handle_t handle, int port)
|
||||
i++;
|
||||
}
|
||||
|
||||
+ closedir(dir);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1220,6 +1231,7 @@ fw_start_fcp_listen(fw_handle_t handle)
|
||||
|
||||
closure->callback = handle_fcp_request;
|
||||
|
||||
+ memset(&request, 0, sizeof(request));
|
||||
request.offset = CSR_REGISTER_BASE + CSR_FCP_COMMAND;
|
||||
request.length = CSR_FCP_END - CSR_FCP_COMMAND;
|
||||
request.closure = ptr_to_u64(closure);
|
||||
@@ -1256,6 +1268,7 @@ fw_get_config_rom(fw_handle_t handle, quadlet_t *buffer,
|
||||
struct fw_cdev_get_info get_info;
|
||||
int err;
|
||||
|
||||
+ memset(&get_info, 0, sizeof(get_info));
|
||||
get_info.version = FW_CDEV_VERSION;
|
||||
get_info.rom = ptr_to_u64(buffer);
|
||||
get_info.rom_length = buffersize;
|
||||
@@ -1284,7 +1297,7 @@ fw_bandwidth_modify (raw1394handle_t handle,
|
||||
|
||||
if (bandwidth == 0)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
addr = CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE;
|
||||
/* Read current bandwidth usage from IRM. */
|
||||
result = raw1394_read (handle, raw1394_get_irm_id (handle), addr,
|
||||
diff --git a/tools/testlibraw.c b/tools/testlibraw.c
|
||||
index 2f02a6d..efd87ad 100644
|
||||
--- a/tools/testlibraw.c
|
||||
+++ b/tools/testlibraw.c
|
||||
@@ -202,6 +202,7 @@ int main(int argc, char **argv)
|
||||
read_topology_map(handle);
|
||||
|
||||
printf("testing config rom stuff\n");
|
||||
+ memset(rom, 0, sizeof(rom));
|
||||
retval=raw1394_get_config_rom(handle, rom, 0x100, &rom_size, &rom_version);
|
||||
printf("get_config_rom returned %d, romsize %d, rom_version %d\n",retval,rom_size,rom_version);
|
||||
printf("here are the first 10 quadlets:\n");
|
Loading…
Reference in new issue