Hi, ti, 2024-07-23 kello 16:35 +0530, Amisha Jain kirjoitti: > Instead of emitting the property "Size" from obex_put_stream_start(), > Call the function manager_emit_transfer_property() from plugins/*.c > wherever plugin has transfer object present. > Remove the code from obex.c which is generic for all profiles. > > This change resolves the type mismatch issue when calling the > manager_emit_transfer_property from obex.c. We are passing > 'os->service_data' of plugin session type but the > manager_emit_transfer_property() expects the 'obex_transfer' > type, therefore size is not set properly and might cause > crash/disconnection. > > --- > obexd/plugins/ftp.c | 5 +++++ > obexd/plugins/opp.c | 5 +++++ > obexd/src/obex.c | 3 --- > 3 files changed, 10 insertions(+), 3 deletions(-) > > diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c > index 874fe2b8b..127bb9aaf 100644 > --- a/obexd/plugins/ftp.c > +++ b/obexd/plugins/ftp.c > @@ -175,6 +175,11 @@ int ftp_chkput(struct obex_session *os, void *user_data) > > ret = obex_put_stream_start(os, path); > > + if (obex_get_size(os) != OBJECT_SIZE_DELETE && > + obex_get_size(os) != OBJECT_SIZE_UNKNOWN) { > + manager_emit_transfer_property(ftp->transfer, "Size"); > + } This probably should check ret == 0, to be exactly equivalent to what it was before. > + > if (ret == 0) > manager_emit_transfer_started(ftp->transfer); > > diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c > index 777f5f8ed..74b2f805b 100644 > --- a/obexd/plugins/opp.c > +++ b/obexd/plugins/opp.c > @@ -87,6 +87,11 @@ skip_auth: > > err = obex_put_stream_start(os, path); > > + if (obex_get_size(os) != OBJECT_SIZE_DELETE && > + obex_get_size(os) != OBJECT_SIZE_UNKNOWN) { > + manager_emit_transfer_property(user_data, "Size"); > + } > + Similarly err == 0 here. Based on looking at the code looks otherwise OK, but haven't tested this myself in practice. > g_free(path); > > if (err < 0) > diff --git a/obexd/src/obex.c b/obexd/src/obex.c > index 98d6245a4..370bfac9e 100644 > --- a/obexd/src/obex.c > +++ b/obexd/src/obex.c > @@ -716,9 +716,6 @@ int obex_put_stream_start(struct obex_session *os, const char *filename) > return err; > } > > - if (os->size != OBJECT_SIZE_DELETE && os->size != OBJECT_SIZE_UNKNOWN) > - manager_emit_transfer_property(os->service_data, "Size"); > - > os->path = g_strdup(filename); > > return 0; -- Pauli Virtanen