memfd file descriptors were not closed, thats why memory was not free'd
Change-Id: I553e91d8caf8ba5a21578f88aa8d21a644c7e505
- if(socket_transport->memfd == -1)
- {
if (ioctl(socket_transport->fd, KDBUS_CMD_MEMFD_NEW, &memfd) < 0) {
_dbus_verbose("KDBUS_CMD_MEMFD_NEW failed: \n");
return -1;
if (ioctl(socket_transport->fd, KDBUS_CMD_MEMFD_NEW, &memfd) < 0) {
_dbus_verbose("KDBUS_CMD_MEMFD_NEW failed: \n");
return -1;
socket_transport->memfd = memfd;
_dbus_verbose("kdbus_init_memfd: %d!!\n", socket_transport->memfd);
socket_transport->memfd = memfd;
_dbus_verbose("kdbus_init_memfd: %d!!\n", socket_transport->memfd);
+ close(transport->memfd);
uint64_t __attribute__ ((__aligned__(8))) offset;
struct kdbus_msg *msg;
char *data;
uint64_t __attribute__ ((__aligned__(8))) offset;
struct kdbus_msg *msg;
char *data;
+ int start;
+
+ start = _dbus_string_get_length (buffer);
_dbus_assert (socket_transport->max_bytes_read_per_iteration >= 0);
_dbus_assert (socket_transport->max_bytes_read_per_iteration >= 0);
if (!_dbus_string_lengthen (buffer, socket_transport->max_bytes_read_per_iteration))
{
errno = ENOMEM;
return -1;
}
if (!_dbus_string_lengthen (buffer, socket_transport->max_bytes_read_per_iteration))
{
errno = ENOMEM;
return -1;
}
- data = _dbus_string_get_data_len (buffer, 0, socket_transport->max_bytes_read_per_iteration);
+ data = _dbus_string_get_data_len (buffer, start, socket_transport->max_bytes_read_per_iteration);
again:
if (ioctl(socket_transport->fd, KDBUS_CMD_MSG_RECV, &offset) < 0)
again:
if (ioctl(socket_transport->fd, KDBUS_CMD_MSG_RECV, &offset) < 0)
if(errno == EINTR)
goto again;
_dbus_verbose("kdbus error receiving message: %d (%m)\n", errno);
if(errno == EINTR)
goto again;
_dbus_verbose("kdbus error receiving message: %d (%m)\n", errno);
- _dbus_string_set_length (buffer, 0);
+ _dbus_string_set_length (buffer, start);
return -1;
}
msg = (struct kdbus_msg *)((char*)socket_transport->kdbus_mmap_ptr + offset);
ret_size = kdbus_decode_msg(msg, data, socket_transport, fds, n_fds);
return -1;
}
msg = (struct kdbus_msg *)((char*)socket_transport->kdbus_mmap_ptr + offset);
ret_size = kdbus_decode_msg(msg, data, socket_transport, fds, n_fds);
- _dbus_string_set_length (buffer, ret_size);
+ if(ret_size == -1)
+ { /* error */
+ _dbus_string_set_length (buffer, start);
+ return -1;
+ } else {
+ _dbus_string_set_length (buffer, start + ret_size);
+ }
+
again2:
if (ioctl(socket_transport->fd, KDBUS_CMD_MSG_RELEASE, &offset) < 0)
{
again2:
if (ioctl(socket_transport->fd, KDBUS_CMD_MSG_RELEASE, &offset) < 0)
{
_dbus_message_loader_return_buffer (transport->loader,
buffer,
_dbus_message_loader_return_buffer (transport->loader,
buffer,
- bytes_read < 0 ? 0 : _dbus_string_get_length (buffer));
+ bytes_read < 0 ? 0 : bytes_read);
_dbus_message_loader_return_unix_fds(transport->loader, fds, bytes_read < 0 ? 0 : n_fds);
if (bytes_read < 0)
_dbus_message_loader_return_unix_fds(transport->loader, fds, bytes_read < 0 ? 0 : n_fds);
if (bytes_read < 0)