2011-06-21 08:37:33

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH obexd] Add copy and move support for filesystem plugin

From: Luiz Augusto von Dentz <[email protected]>

Move is implemented using rename and copy uses sendfile, both part of
POSIX.
---
plugins/filesystem.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/plugins/filesystem.c b/plugins/filesystem.c
index b4ff556..4b0665f 100644
--- a/plugins/filesystem.c
+++ b/plugins/filesystem.c
@@ -36,6 +36,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/statvfs.h>
+#include <sys/sendfile.h>
#include <fcntl.h>
#include <wait.h>

@@ -234,6 +235,99 @@ static ssize_t filesystem_write(void *object, const void *buf, size_t count)
return ret;
}

+static int filesystem_rename(const char *name, const char *destname)
+{
+ int ret;
+
+ ret = rename(name, destname);
+ if (ret < 0) {
+ error("rename(%s, %s): %s (%d)", name, destname,
+ strerror(errno), errno);
+ return -errno;
+ }
+
+ return ret;
+}
+
+static int sendfile_async(int out_fd, int in_fd, off_t *offset, size_t count)
+{
+ int pid;
+
+ /* Run sendfile on child process */
+ pid = fork();
+ switch (pid) {
+ case 0:
+ break;
+ case -1:
+ error("fork() %s (%d)", strerror(errno), errno);
+ return -errno;
+ default:
+ DBG("child %d forked", pid);
+ return pid;
+ }
+
+ /* At child */
+ if (sendfile(out_fd, in_fd, offset, count) < 0)
+ error("sendfile(): %s (%d)", strerror(errno), errno);
+
+ close(in_fd);
+ close(out_fd);
+
+ exit(errno);
+}
+
+static int filesystem_copy(const char *name, const char *destname)
+{
+ void *in, *out;
+ ssize_t ret;
+ size_t size;
+ struct stat st;
+ int in_fd, out_fd, err;
+
+ in = filesystem_open(name, O_RDONLY, 0, NULL, &size, &err);
+ if (in == NULL) {
+ error("open(%s): %s (%d)", name, strerror(-err), -err);
+ return -err;
+ }
+
+ in_fd = GPOINTER_TO_INT(in);
+ ret = fstat(in_fd, &st);
+ if (ret < 0) {
+ error("stat(%s): %s (%d)", name, strerror(errno), errno);
+ return -errno;
+ }
+
+ out = filesystem_open(destname, O_WRONLY | O_CREAT | O_TRUNC,
+ st.st_mode, NULL, &size, &err);
+ if (out == NULL) {
+ error("open(%s): %s (%d)", destname, strerror(-err), -err);
+ filesystem_close(in);
+ return -errno;
+ }
+
+ out_fd = GPOINTER_TO_INT(out);
+
+ /* Check if sendfile is supported */
+ ret = sendfile(out_fd, in_fd, NULL, 0);
+ if (ret < 0) {
+ ret = -errno;
+ error("sendfile: %s (%zd)", strerror(-ret), -ret);
+ goto done;
+ }
+
+ ret = sendfile_async(out_fd, in_fd, NULL, st.st_size);
+ if (ret < 0)
+ goto done;
+
+ return 0;
+
+done:
+ filesystem_close(in);
+ filesystem_close(out);
+
+ return ret;
+}
+
struct capability_object {
int pid;
int output;
@@ -555,6 +649,8 @@ static struct obex_mime_type_driver file = {
.read = filesystem_read,
.write = filesystem_write,
.remove = remove,
+ .move = filesystem_rename,
+ .copy = filesystem_copy,
};

static struct obex_mime_type_driver capability = {
--
1.7.5.4



2011-06-28 08:01:15

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH obexd] Add copy and move support for filesystem plugin

Hi Luiz,

On Tue, Jun 21, 2011, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> Move is implemented using rename and copy uses sendfile, both part of
> POSIX.
> ---
> plugins/filesystem.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 96 insertions(+), 0 deletions(-)

Applied. Thanks.

Johan

2011-06-21 10:23:26

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb

Hi Nami,

2011/6/21 Li, Nami <[email protected]>:
> Hi, Luiz
>
> -----Original Message-----
> From: Luiz Augusto von Dentz [mailto:[email protected]]
> Sent: 2011??6??21?? 17:48
> To: Li, Nami
> Cc: [email protected]
> Subject: Re: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb
>
> Hi Nami,
>
> 2011/6/21 Li, Nami <[email protected]>:
>> Hi,
>>
>> -----Original Message-----
>> From: [email protected]
>> [mailto:[email protected]] On Behalf Of Luiz
>> Augusto von Dentz
>> Sent: 2011??6??21?? 16:38
>> To: [email protected]
>> Subject: [PATCH obexd] Fix crash introduced by
>> f5279bfcedd669bc5d4e88cc1c59807c92226dfb
>>
>> From: Luiz Augusto von Dentz <[email protected]>
>>
>> The callback function actually needs the bluetooth_service structure not obex_service_driver.
>> ---
>> plugins/bluetooth.c | 11 +++++++++--
>> 1 files changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c index
>> fe508f4..1037b24 100644
>> --- a/plugins/bluetooth.c
>> +++ b/plugins/bluetooth.c
>> @@ -459,10 +459,11 @@ static int request_service_authorization(struct
>> bluetooth_service *service,
>>
>> static void confirm_event(GIOChannel *io, void *user_data) {
>> - struct bluetooth_service *service = user_data;
>> + struct bluetooth_service *service;
>> GError *err = NULL;
>> char address[18];
>> uint8_t channel;
>> + struct obex_service_driver *driver = user_data;
>>
>> bt_io_get(io, BT_IO_RFCOMM, &err,
>> BT_IO_OPT_DEST, address, @@ -477,7 +478,13 @@
>> static void confirm_event(GIOChannel *io, void *user_data)
>> info("bluetooth: New connection from: %s, channel %u", address,
>> channel);
>>
>> - if (service->driver->service != OBEX_OPP) {
>> + service = find_service(driver, 0);
>>
>> Will it be better to write as "service = find_service(driver, channel);" ?
>> Or if you choose not to use channel, I think you could omit channel
>> variable and omit bt_io_get(BT_IO_OPT_CHANNEL, &channel);
>
>>I only leave the channel there for logging, as for the find_service it is really useless to use the channel if we are going to support L2CAP in future, so in theory this should work regardless of the transport.
>
>
> Yeah, it`s better when support L2CAP. If the channel is only use for logging, can we delete it?
> There are only two functions calling find_service, one in your commit , another in register_record function:
> service = find_service(driver, 0);
> Seems the channel parameter is useless.
> And considering OBEX over L2CAP, should we modify find_service to
> static struct bluetooth_service *find_service(struct obex_service_driver *driver)
> just delete uint8_t channel parameter.
> If ok, you or me can upload a patch for this issue.

Yep, I gonna send a new version that just remove it since we no longer
need it after this changes

--
Luiz Augusto von Dentz

2011-06-21 10:19:24

by Li, Nami

[permalink] [raw]
Subject: RE: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb

SGksIEx1aXoNCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZyb206IEx1aXogQXVndXN0
byB2b24gRGVudHogW21haWx0bzpsdWl6LmRlbnR6QGdtYWlsLmNvbV0gDQpTZW50OiAyMDExxOo2
1MIyMcjVIDE3OjQ4DQpUbzogTGksIE5hbWkNCkNjOiBsaW51eC1ibHVldG9vdGhAdmdlci5rZXJu
ZWwub3JnDQpTdWJqZWN0OiBSZTogW1BBVENIIG9iZXhkXSBGaXggY3Jhc2ggaW50cm9kdWNlZCBi
eSBmNTI3OWJmY2VkZDY2OWJjNWQ0ZTg4Y2MxYzU5ODA3YzkyMjI2ZGZiDQoNCkhpIE5hbWksDQoN
CjIwMTEvNi8yMSBMaSwgTmFtaSA8bmFtaUBxY2EucXVhbGNvbW0uY29tPjoNCj4gSGksDQo+DQo+
IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IGxpbnV4LWJsdWV0b290aC1vd25l
ckB2Z2VyLmtlcm5lbC5vcmcgDQo+IFttYWlsdG86bGludXgtYmx1ZXRvb3RoLW93bmVyQHZnZXIu
a2VybmVsLm9yZ10gT24gQmVoYWxmIE9mIEx1aXogDQo+IEF1Z3VzdG8gdm9uIERlbnR6DQo+IFNl
bnQ6IDIwMTHE6jbUwjIxyNUgMTY6MzgNCj4gVG86IGxpbnV4LWJsdWV0b290aEB2Z2VyLmtlcm5l
bC5vcmcNCj4gU3ViamVjdDogW1BBVENIIG9iZXhkXSBGaXggY3Jhc2ggaW50cm9kdWNlZCBieSAN
Cj4gZjUyNzliZmNlZGQ2NjliYzVkNGU4OGNjMWM1OTgwN2M5MjIyNmRmYg0KPg0KPiBGcm9tOiBM
dWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LnZvbi5kZW50ekBpbnRlbC5jb20+DQo+DQo+IFRo
ZSBjYWxsYmFjayBmdW5jdGlvbiBhY3R1YWxseSBuZWVkcyB0aGUgYmx1ZXRvb3RoX3NlcnZpY2Ug
c3RydWN0dXJlIG5vdCBvYmV4X3NlcnZpY2VfZHJpdmVyLg0KPiAtLS0NCj4gIHBsdWdpbnMvYmx1
ZXRvb3RoLmMgfCAgIDExICsrKysrKysrKy0tDQo+ICAxIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0
aW9ucygrKSwgMiBkZWxldGlvbnMoLSkNCj4NCj4gZGlmZiAtLWdpdCBhL3BsdWdpbnMvYmx1ZXRv
b3RoLmMgYi9wbHVnaW5zL2JsdWV0b290aC5jIGluZGV4IA0KPiBmZTUwOGY0Li4xMDM3YjI0IDEw
MDY0NA0KPiAtLS0gYS9wbHVnaW5zL2JsdWV0b290aC5jDQo+ICsrKyBiL3BsdWdpbnMvYmx1ZXRv
b3RoLmMNCj4gQEAgLTQ1OSwxMCArNDU5LDExIEBAIHN0YXRpYyBpbnQgcmVxdWVzdF9zZXJ2aWNl
X2F1dGhvcml6YXRpb24oc3RydWN0IA0KPiBibHVldG9vdGhfc2VydmljZSAqc2VydmljZSwNCj4N
Cj4gIHN0YXRpYyB2b2lkIGNvbmZpcm1fZXZlbnQoR0lPQ2hhbm5lbCAqaW8sIHZvaWQgKnVzZXJf
ZGF0YSkgIHsNCj4gLSAgICAgICBzdHJ1Y3QgYmx1ZXRvb3RoX3NlcnZpY2UgKnNlcnZpY2UgPSB1
c2VyX2RhdGE7DQo+ICsgICAgICAgc3RydWN0IGJsdWV0b290aF9zZXJ2aWNlICpzZXJ2aWNlOw0K
PiAgICAgICAgR0Vycm9yICplcnIgPSBOVUxMOw0KPiAgICAgICAgY2hhciBhZGRyZXNzWzE4XTsN
Cj4gICAgICAgIHVpbnQ4X3QgY2hhbm5lbDsNCj4gKyAgICAgICBzdHJ1Y3Qgb2JleF9zZXJ2aWNl
X2RyaXZlciAqZHJpdmVyID0gdXNlcl9kYXRhOw0KPg0KPiAgICAgICAgYnRfaW9fZ2V0KGlvLCBC
VF9JT19SRkNPTU0sICZlcnIsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgQlRfSU9fT1BUX0RF
U1QsIGFkZHJlc3MsIEBAIC00NzcsNyArNDc4LDEzIEBAIA0KPiBzdGF0aWMgdm9pZCBjb25maXJt
X2V2ZW50KEdJT0NoYW5uZWwgKmlvLCB2b2lkICp1c2VyX2RhdGEpDQo+ICAgICAgICBpbmZvKCJi
bHVldG9vdGg6IE5ldyBjb25uZWN0aW9uIGZyb206ICVzLCBjaGFubmVsICV1IiwgYWRkcmVzcywN
Cj4gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKTsNCj4NCj4gLSAgICAgICBpZiAoc2Vy
dmljZS0+ZHJpdmVyLT5zZXJ2aWNlICE9IE9CRVhfT1BQKSB7DQo+ICsgICAgICAgc2VydmljZSA9
IGZpbmRfc2VydmljZShkcml2ZXIsIDApOw0KPg0KPiBXaWxsIGl0IGJlIGJldHRlciB0byB3cml0
ZSBhcyAic2VydmljZSA9IGZpbmRfc2VydmljZShkcml2ZXIsIGNoYW5uZWwpOyIgPw0KPiBPciBp
ZiB5b3UgY2hvb3NlIG5vdCB0byB1c2UgY2hhbm5lbCwgSSB0aGluayB5b3UgY291bGQgb21pdCBj
aGFubmVsIA0KPiB2YXJpYWJsZSBhbmQgb21pdCBidF9pb19nZXQoQlRfSU9fT1BUX0NIQU5ORUws
ICZjaGFubmVsKTsNCg0KPkkgb25seSBsZWF2ZSB0aGUgY2hhbm5lbCB0aGVyZSBmb3IgbG9nZ2lu
ZywgYXMgZm9yIHRoZSBmaW5kX3NlcnZpY2UgaXQgaXMgcmVhbGx5IHVzZWxlc3MgdG8gdXNlIHRo
ZSBjaGFubmVsIGlmIHdlIGFyZSBnb2luZyB0byBzdXBwb3J0IEwyQ0FQIGluIGZ1dHVyZSwgc28g
aW4gdGhlb3J5IHRoaXMgc2hvdWxkIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGUgdHJhbnNwb3J0Lg0K
DQoNClllYWgsIGl0YHMgYmV0dGVyIHdoZW4gc3VwcG9ydCBMMkNBUC4gIElmIHRoZSBjaGFubmVs
IGlzIG9ubHkgdXNlIGZvciBsb2dnaW5nLCBjYW4gd2UgZGVsZXRlIGl0PyANClRoZXJlIGFyZSBv
bmx5IHR3byBmdW5jdGlvbnMgY2FsbGluZyBmaW5kX3NlcnZpY2UsIG9uZSBpbiB5b3VyIGNvbW1p
dCAsIGFub3RoZXIgaW4gcmVnaXN0ZXJfcmVjb3JkIGZ1bmN0aW9uOg0KCXNlcnZpY2UgPSBmaW5k
X3NlcnZpY2UoZHJpdmVyLCAwKTsNClNlZW1zIHRoZSBjaGFubmVsIHBhcmFtZXRlciBpcyB1c2Vs
ZXNzLg0KQW5kIGNvbnNpZGVyaW5nIE9CRVggb3ZlciBMMkNBUCwgc2hvdWxkIHdlIG1vZGlmeSBm
aW5kX3NlcnZpY2UgdG8NCiAgIHN0YXRpYyBzdHJ1Y3QgYmx1ZXRvb3RoX3NlcnZpY2UgKmZpbmRf
c2VydmljZShzdHJ1Y3Qgb2JleF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyKQ0KanVzdCBkZWxldGUg
dWludDhfdCBjaGFubmVsIHBhcmFtZXRlci4NCklmIG9rLCB5b3Ugb3IgbWUgY2FuIHVwbG9hZCBh
IHBhdGNoIGZvciB0aGlzIGlzc3VlLg0KDQpOYW1pDQoNCg==

2011-06-21 09:47:32

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb

Hi Nami,

2011/6/21 Li, Nami <[email protected]>:
> Hi,
>
> -----Original Message-----
> From: [email protected] [mailto:[email protected]] On Behalf Of Luiz Augusto von Dentz
> Sent: 2011??6??21?? 16:38
> To: [email protected]
> Subject: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb
>
> From: Luiz Augusto von Dentz <[email protected]>
>
> The callback function actually needs the bluetooth_service structure not obex_service_driver.
> ---
> plugins/bluetooth.c | 11 +++++++++--
> 1 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c index fe508f4..1037b24 100644
> --- a/plugins/bluetooth.c
> +++ b/plugins/bluetooth.c
> @@ -459,10 +459,11 @@ static int request_service_authorization(struct bluetooth_service *service,
>
> static void confirm_event(GIOChannel *io, void *user_data) {
> - struct bluetooth_service *service = user_data;
> + struct bluetooth_service *service;
> GError *err = NULL;
> char address[18];
> uint8_t channel;
> + struct obex_service_driver *driver = user_data;
>
> bt_io_get(io, BT_IO_RFCOMM, &err,
> BT_IO_OPT_DEST, address,
> @@ -477,7 +478,13 @@ static void confirm_event(GIOChannel *io, void *user_data)
> info("bluetooth: New connection from: %s, channel %u", address,
> channel);
>
> - if (service->driver->service != OBEX_OPP) {
> + service = find_service(driver, 0);
>
> Will it be better to write as "service = find_service(driver, channel);" ?
> Or if you choose not to use channel, I think you could omit channel variable and omit bt_io_get(BT_IO_OPT_CHANNEL, &channel);

I only leave the channel there for logging, as for the find_service it
is really useless to use the channel if we are going to support L2CAP
in future, so in theory this should work regardless of the transport.

--
Luiz Augusto von Dentz

2011-06-21 09:37:27

by Li, Nami

[permalink] [raw]
Subject: RE: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb

SGksDQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpGcm9tOiBsaW51eC1ibHVldG9vdGgt
b3duZXJAdmdlci5rZXJuZWwub3JnIFttYWlsdG86bGludXgtYmx1ZXRvb3RoLW93bmVyQHZnZXIu
a2VybmVsLm9yZ10gT24gQmVoYWxmIE9mIEx1aXogQXVndXN0byB2b24gRGVudHoNClNlbnQ6IDIw
MTHE6jbUwjIxyNUgMTY6MzgNClRvOiBsaW51eC1ibHVldG9vdGhAdmdlci5rZXJuZWwub3JnDQpT
dWJqZWN0OiBbUEFUQ0ggb2JleGRdIEZpeCBjcmFzaCBpbnRyb2R1Y2VkIGJ5IGY1Mjc5YmZjZWRk
NjY5YmM1ZDRlODhjYzFjNTk4MDdjOTIyMjZkZmINCg0KRnJvbTogTHVpeiBBdWd1c3RvIHZvbiBE
ZW50eiA8bHVpei52b24uZGVudHpAaW50ZWwuY29tPg0KDQpUaGUgY2FsbGJhY2sgZnVuY3Rpb24g
YWN0dWFsbHkgbmVlZHMgdGhlIGJsdWV0b290aF9zZXJ2aWNlIHN0cnVjdHVyZSBub3Qgb2JleF9z
ZXJ2aWNlX2RyaXZlci4NCi0tLQ0KIHBsdWdpbnMvYmx1ZXRvb3RoLmMgfCAgIDExICsrKysrKysr
Ky0tDQogMSBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pDQoN
CmRpZmYgLS1naXQgYS9wbHVnaW5zL2JsdWV0b290aC5jIGIvcGx1Z2lucy9ibHVldG9vdGguYyBp
bmRleCBmZTUwOGY0Li4xMDM3YjI0IDEwMDY0NA0KLS0tIGEvcGx1Z2lucy9ibHVldG9vdGguYw0K
KysrIGIvcGx1Z2lucy9ibHVldG9vdGguYw0KQEAgLTQ1OSwxMCArNDU5LDExIEBAIHN0YXRpYyBp
bnQgcmVxdWVzdF9zZXJ2aWNlX2F1dGhvcml6YXRpb24oc3RydWN0IGJsdWV0b290aF9zZXJ2aWNl
ICpzZXJ2aWNlLA0KIA0KIHN0YXRpYyB2b2lkIGNvbmZpcm1fZXZlbnQoR0lPQ2hhbm5lbCAqaW8s
IHZvaWQgKnVzZXJfZGF0YSkgIHsNCi0Jc3RydWN0IGJsdWV0b290aF9zZXJ2aWNlICpzZXJ2aWNl
ID0gdXNlcl9kYXRhOw0KKwlzdHJ1Y3QgYmx1ZXRvb3RoX3NlcnZpY2UgKnNlcnZpY2U7DQogCUdF
cnJvciAqZXJyID0gTlVMTDsNCiAJY2hhciBhZGRyZXNzWzE4XTsNCiAJdWludDhfdCBjaGFubmVs
Ow0KKwlzdHJ1Y3Qgb2JleF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyID0gdXNlcl9kYXRhOw0KIA0K
IAlidF9pb19nZXQoaW8sIEJUX0lPX1JGQ09NTSwgJmVyciwNCiAJCQlCVF9JT19PUFRfREVTVCwg
YWRkcmVzcywNCkBAIC00NzcsNyArNDc4LDEzIEBAIHN0YXRpYyB2b2lkIGNvbmZpcm1fZXZlbnQo
R0lPQ2hhbm5lbCAqaW8sIHZvaWQgKnVzZXJfZGF0YSkNCiAJaW5mbygiYmx1ZXRvb3RoOiBOZXcg
Y29ubmVjdGlvbiBmcm9tOiAlcywgY2hhbm5lbCAldSIsIGFkZHJlc3MsDQogCQkJY2hhbm5lbCk7
DQogDQotCWlmIChzZXJ2aWNlLT5kcml2ZXItPnNlcnZpY2UgIT0gT0JFWF9PUFApIHsNCisJc2Vy
dmljZSA9IGZpbmRfc2VydmljZShkcml2ZXIsIDApOw0KDQpXaWxsIGl0IGJlIGJldHRlciB0byB3
cml0ZSBhcyAic2VydmljZSA9IGZpbmRfc2VydmljZShkcml2ZXIsIGNoYW5uZWwpOyIgPyANCk9y
IGlmIHlvdSBjaG9vc2Ugbm90IHRvIHVzZSBjaGFubmVsLCBJIHRoaW5rIHlvdSBjb3VsZCBvbWl0
IGNoYW5uZWwgdmFyaWFibGUgYW5kIG9taXQgYnRfaW9fZ2V0KEJUX0lPX09QVF9DSEFOTkVMLCAm
Y2hhbm5lbCk7DQoNCisJaWYgKHNlcnZpY2UgPT0gTlVMTCkgew0KKwkJZXJyb3IoImJsdWV0b290
aDogVW5hYmxlIHRvIGZpbmQgc2VydmljZSIpOw0KKwkJZ290byBkcm9wOw0KKwl9DQorDQorCWlm
IChkcml2ZXItPnNlcnZpY2UgIT0gT0JFWF9PUFApIHsNCiAJCWlmIChyZXF1ZXN0X3NlcnZpY2Vf
YXV0aG9yaXphdGlvbihzZXJ2aWNlLCBpbywgYWRkcmVzcykgPCAwKQ0KIAkJCWdvdG8gZHJvcDsN
CiANCi0tDQoxLjcuNS40DQoNCi0tDQpUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2Vu
ZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtYmx1ZXRvb3RoIiBpbiB0aGUgYm9keSBvZiBh
IG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZyBNb3JlIG1ham9yZG9tbyBpbmZv
IGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwNCg==

2011-06-21 08:37:34

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH obexd] Fix crash introduced by f5279bfcedd669bc5d4e88cc1c59807c92226dfb

From: Luiz Augusto von Dentz <[email protected]>

The callback function actually needs the bluetooth_service structure not
obex_service_driver.
---
plugins/bluetooth.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index fe508f4..1037b24 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -459,10 +459,11 @@ static int request_service_authorization(struct bluetooth_service *service,

static void confirm_event(GIOChannel *io, void *user_data)
{
- struct bluetooth_service *service = user_data;
+ struct bluetooth_service *service;
GError *err = NULL;
char address[18];
uint8_t channel;
+ struct obex_service_driver *driver = user_data;

bt_io_get(io, BT_IO_RFCOMM, &err,
BT_IO_OPT_DEST, address,
@@ -477,7 +478,13 @@ static void confirm_event(GIOChannel *io, void *user_data)
info("bluetooth: New connection from: %s, channel %u", address,
channel);

- if (service->driver->service != OBEX_OPP) {
+ service = find_service(driver, 0);
+ if (service == NULL) {
+ error("bluetooth: Unable to find service");
+ goto drop;
+ }
+
+ if (driver->service != OBEX_OPP) {
if (request_service_authorization(service, io, address) < 0)
goto drop;

--
1.7.5.4