public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
From: Aleksandar Kanchev <kanchev@in.tum.de>
To: bluez-devel@lists.sourceforge.net
Subject: [Bluez-devel] kernel bug?
Date: Fri, 01 Feb 2008 00:00:56 +0100	[thread overview]
Message-ID: <47A25328.6000008@in.tum.de> (raw)

[-- Attachment #1: Type: text/plain, Size: 1040 bytes --]

Hello list,

recently I've stumbled upon something that I think might be a bluez bug.
My nokia phone was messed up, so it dropped rfcomm connections 
immediately after they were established. This caused my glibmm (glib2) 
based program to exit because of a glib error. After researching a bit I 
found out, that I was flushing a glib io channel after the channel was 
polled for IO_OUT, which is right. The flush caused a write() to the 
socket and glib expects write() to return either a negative number (an 
error) or positive > 0, a return = 0 is not expected probably because 
one should first wait for the IO_OUT event.
What was happening is that the connection was being dropped right after 
the socket was polled and this caused glib to crash most of the time. 
Should't bluez close the socket and return < 0 instead of returning 0?
I've attached a small program to better demonstrate what happened. I've 
also attached a copy of the email which I sent to the gtkmm mailing 
list, since I first thought it was a glib issue.

Thanks


[-- Attachment #2: bluez-bug.c --]
[-- Type: text/x-csrc, Size: 1446 bytes --]

/*
 * write() should not return 0 after
 * the remote device has terminated the connetion.
 * This makes glib's io_channel terminate
 * the running program.
 *                kanchev@in.tum.de
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>


int main(int argc, char **argv)
{
	char dummy;
	int sock, r;
	struct sockaddr_rc saddr;
	struct pollfd pollfd;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s <bluetooth address> <rfcomm channel>\n", argv[0]);
		return -1;
	}

	if ((sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) {
		perror("socket()");
		return -1;
	}

	memset(&saddr, 0, sizeof(struct sockaddr_rc));
	str2ba(argv[1], &saddr.rc_bdaddr);
	saddr.rc_family = AF_BLUETOOTH;
    saddr.rc_channel = (uint8_t) atoi(argv[2]);

	printf("Connecting to %s ...\n", argv[1]);
	if (connect(sock, (struct sockaddr *) &saddr, sizeof(struct sockaddr_rc)) < 0) {
		close(sock);
		perror("connect()");
		return -1;
	}

	pollfd.fd = sock;
	pollfd.events = POLLOUT;
	pollfd.revents = 0;
	if (poll(&pollfd, 1, -1) <= 0) {
		close(sock);
		perror("poll()");
		return -1;
	}

	printf("Turn off the bluetooth device %s now!\nPress enter to continue...", argv[1]);
	fflush(stdout);
	read(0, &dummy, 1);

	r = write(sock, "Hello", 5);
	printf("write() returned %d\n", r);

	close(sock);

	return 0;
}


[-- Attachment #3: Attached Message --]
[-- Type: message/rfc822, Size: 2385 bytes --]

From: Aleksandar Kanchev <kanchev@in.tum.de>
To: gtkmm-list@gnome.org
Subject: is this a glibmm/glib bug?
Date: Thu, 31 Jan 2008 12:56:17 +0100
Message-ID: <47A1B761.6080306@in.tum.de>

Hello list,

I'm developing a bluetooth C++ library based on glibmm. I've stumbled 
upon a problem which concerns Glib::IOChannel(s). The problem occurs in 
the following scenario:
    1) open an RFCOMM socket to a remote bluetooth device and 
Glib::IOChannel::create_from_fd()
    2) connect the socket's file descriptor to Glib::SignalIO and wait 
for Glib:IO_OUT
    3) when Glib::IO_OUT is set, then write some bytes to the 
Glib::IOChannel
    4) shut down the bluetooth device in order to terminate the 
bluetooth connection, this also terminates the file descriptor
    5) flush the Glib::IOChannel, this causes:
GLib-ERROR **: file giochannel.c: line 951 (g_io_channel_flush): 
assertion failed: (this_time > 0)
aborting...

Program received signal SIGABRT, Aborted.
0x00110402 in __kernel_vsyscall ()
(gdb) bt
#0  0x00110402 in __kernel_vsyscall ()
#1  0x00b15690 in raise () from /lib/libc.so.6
#2  0x00b16f91 in abort () from /lib/libc.so.6
#3  0x00d0df7a in g_logv () from /lib/libglib-2.0.so.0
#4  0x00d0dfb9 in g_log () from /lib/libglib-2.0.so.0
#5  0x00d0e036 in g_assert_warning () from /lib/libglib-2.0.so.0
#6  0x00cfa7a1 in g_io_channel_flush () from /lib/libglib-2.0.so.0
#7  0x007f274e in Glib::IOChannel::flush () from /usr/lib/libglibmm-2.4.so.1

I came across this because my nokia phone was disconnecting immediately 
after a connection was established. I was able to reproduce the error by 
sleeping right after a Glib::IOChannel::write and shutting down the 
bluetooth connection from my phone while the program was sleeping, then 
flushing the Glib::IOChannel. If I ::close() (the syscall) the fd, 
instead of shutting down the phone, then I get:
(process:19643): GLib-WARNING **: Invalid file descriptor.
which is ok.

What does the GLib-Error mean? Is it a glib, glibmm or bluez problem?

I was using:
gtkmm24-2.12.3-1.fc8
glibmm24-2.14.2-1.fc8
glib2-2.14.4-1.fc8
bluez-libs-3.20-1.fc8
Linux 2.6.23.14-107.fc8 #1 SMP Mon Jan 14 21:37:30 EST 2008 i686 i686 
i386 GNU/Linux
on Fedora 8

best regards,
Aleksandar


[-- Attachment #4: Type: text/plain, Size: 228 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

[-- Attachment #5: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

                 reply	other threads:[~2008-01-31 23:00 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47A25328.6000008@in.tum.de \
    --to=kanchev@in.tum.de \
    --cc=bluez-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox