Commit Graph

218 Commits

Author SHA1 Message Date
Amisha Jain
d35bae1515 obex: Resolve SRM issue for PTS testcases
Add check for unknown/undefined srm value.

This fix is required to pass the below the PTS testcases :
1. OPP/SR/GOEP/SRM/BI-02-C
2. FTP/SR/GOEP/SRM/BI-02-C
3. PBAP/PSE/GOEP/SRM/BI-05-C

Description - Verify that the Server ignores a SRM header with an
invalid value in the PUT/GET request and carries on with the
PUT/GET operation with SRM disabled.

Current Behaviour - Server is sending SRM enable in the response even
though receiving the unknown SRM value.

To fix this, I have added the check to verify the valid SRM values
before continuing with SRM enable.
2024-10-24 10:19:25 -04:00
Frédéric Danis
615fc3592a gobex: Replace g_convert by utf16_to_utf8
The glibc's iconv implementation is based around plug in modules
for specific translations which may not been built on the platform
and prevent to use g_convert().
This commit replaces it by a function similar to the existing
utf8_to_utf16() function.
2024-09-10 15:22:51 -04:00
Bastien Nocera
1764cea5c7 obexd: Fix buffer overrun
Don't access path at byte 2 when it might only contain a single byte.

Error: OVERRUN (CWE-119): [#def27] [important]
obexd/client/session.c:1142:2: overrun-buffer-val:
Overrunning buffer pointed to by "first" of 1 bytes by passing it to a
function which accesses it at byte offset 2.
1140|		req->index++;
1141|
1142|->		p->req_id = g_obex_setpath(p->session->obex, first, setpath_cb, p, err);
1143|		if (*err != NULL)
1144|			return (*err)->code;
2024-06-03 15:08:10 -04:00
Emil Velikov
0e5a458977 gobex: const annotate RO arrays, use G_N_ELEMENTS 2024-01-19 15:45:04 -05:00
Tedd Ho-Jeong An
8fe1e5e165 gobex: Fix read from pointer after free
This patch sets the pointer to null after free since the g_free(p)
doesn't set the pointer to NULL.

This is reported by the Coverity.

Fixes: 7e7d826aa1 ("gobex: Print error if data cannot be written")
2022-02-18 13:25:57 -08:00
Luiz Augusto von Dentz
7e7d826aa1 gobex: Print error if data cannot be written
This makes sure that if the data cannot be written it fails and the
error is properly printed.
2022-02-14 15:40:40 -08:00
Luiz Augusto von Dentz
cfab569484 build: Replace use of g_memdup with util_memdup
This replaces the uses of g_memdup with util_memdup since the former has
been deprecated:

  warning: ‘g_memdup’ is deprecated: Use 'g_memdup2' instead
  [-Wdeprecated-declarations]

g_memdup2 requires bumping glib version which would likely have its
own problems thus why util_memdup was introduced.
2022-01-06 12:58:39 -08:00
Tedd Ho-Jeong An
f81e74be9d gobex: Add SPDX License Identifier
This patch adds SPDX License Identifier and removes the license text.

-------------------------------------
       License            COUNT
-------------------------------------
 GPL-2.0-or-later     :     12

License: GPL-2.0-or-later
   gobex/gobex-defs.h
   gobex/gobex-transfer.c
   gobex/gobex.c
   gobex/gobex-apparam.h
   gobex/gobex-header.h
   gobex/gobex-header.c
   gobex/gobex.h
   gobex/gobex-packet.h
   gobex/gobex-defs.c
   gobex/gobex-debug.h
   gobex/gobex-apparam.c
   gobex/gobex-packet.c
2020-09-21 16:19:34 -07:00
Denis Grigorev
7a35c12a6c gobex: Fix segfault caused by interrupted transfer
When a obex transfer is interrupted by a peer in the middle, the response
G_OBEX_RSP_FORBIDDEN comes and the transfer is freed in transfer_complete.
However gobex is still ref'ed and gobex->io continues to be writable,
so write_data() and then g_obex_abort() are called. When the abort response
comes, struct obc_transfer is already freed, which leads to the crash.

Backtrace :
__GI___pthread_mutex_lock (mutex=0x65732f74) at pthread_mutex_lock.c:67
0xecc6eeda in dbus_connection_get_object_path_data () from libdbus-1.so.3
0x000457d4 in g_dbus_emit_property_changed_full () at gdbus/object.c:1794
0x00045868 in g_dbus_emit_property_changed () at gdbus/object.c:1832
0x000367f0 in transfer_set_status () at obexd/client/transfer.c:211
0x0003681e in transfer_set_status () at obexd/client/transfer.c:206
xfer_complete () at obexd/client/transfer.c:672
0x00022df6 in transfer_complete () at gobex/gobex-transfer.c:103
0x00022f44 in transfer_abort_response () at gobex/gobex-transfer.c:124
0x00020a0e in handle_response () at gobex/gobex.c:1128
0x00020dde in incoming_data () at gobex/gobex.c:1373

This commit introduces g_obex_drop_tx_queue(), which will be called if
a transfer error detected. After the tx queue is dropped, obex shuts
down gracefully.
2020-07-01 10:49:49 -07:00
Marcel Holtmann
261948090e build: Move declaration of _GNU_SOURCE back into individual source files 2018-12-06 21:28:18 +01:00
Marcel Holtmann
67a2c40e65 gobex: Fix compiler warning from casting functions 2018-05-23 16:32:22 +02:00
Luiz Augusto von Dentz
07943b87fa gobex: Make g_obex_apparam_encode NULL safe
Make g_obex_apparam_encode ignore if the apparam pointer is NULL.
2017-04-23 23:12:34 +03:00
Miao-chen Chou
4832ed0339 gobex: Fix a compilation error for the compatibility with LLVM
The C Standard, subclause 7.16.1.4, paragraph 4 [ISO/IEC 9899:2011], states:
The parameter parmN is the identifier of the rightmost parameter in
the variable parameter list in the function definition (the one just
before the ...). If the parameter parmN is declared with the register
storage class, with a function or array type, or with a type that is
not compatible with the type that results after application of the
default argument promotions, the behavior is undefined.
2016-12-07 16:03:58 +02:00
Johan Hedberg
66a85a3191 gobex: Minor coding style (whitespace) fix 2015-07-08 12:38:01 +03:00
Marcel Holtmann
7bd86b5b9e gobex: Fix includes for gobex.h header 2015-03-01 00:27:37 -08:00
Szymon Janc
29bdc7df4c gobex: List all enum values in switch
As described in coding style M10.
2014-12-08 14:00:28 +01:00
Luiz Augusto von Dentz
31d69f8ecf gobex: Abort if there is no request to cancel
If there is no request to cancel send an abort since otherwise the remote
may hang waiting.
2014-08-29 10:32:27 +03:00
Luiz Augusto von Dentz
3ff1f6b5e8 gobex: Add g_obex_abort 2014-08-29 10:32:26 +03:00
Luiz Augusto von Dentz
82c524e4d0 gobex: Fix crash when debug is enabled
GError can be NULL thus causing invalid read when trying to a message
member such as bellow:

Invalid read of size 8
   at 0x41190F: g_obex_send_internal (gobex.c:531)
   by 0x4130A6: g_obex_send_req (gobex.c:756)
   by 0x4268A5: obc_session_unref (session.c:289)
   by 0x41396A: incoming_data (gobex.c:1397)
   by 0x59712A5: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x5971627: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x5971A39: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x40D78C: main (main.c:320)
 Address 0x0 is not stack'd, malloc'd or (recently) free'd
2014-08-29 10:32:26 +03:00
Luiz Augusto von Dentz
867ca173d6 gobex: Fix warning if g_obex_resume is called when disconnected 2014-08-29 10:32:26 +03:00
Andrei Emeltchenko
cfdb4b82de gobex: Fix use after free
Refactor function transfer_get_req_first() to avoid use after free.
2014-08-11 16:27:56 +03:00
Andrei Emeltchenko
4830f41e03 gobex: Fix use after free 2014-08-11 16:26:37 +03:00
Andrei Emeltchenko
662b5e4d57 gobex: Fix use after free
It is better not to dereference freed pointer
2014-08-11 16:26:09 +03:00
Andrei Emeltchenko
6df15b5415 gobex: Fix use after free
transfer_complete() frees transfer pointer.
2014-08-05 17:09:14 +03:00
Szymon Janc
87dc59894d gobex: Fix removing invalid source
Since GLib 2.39 calling g_source_remove on already removed source
is causing critical warning.

This was affecting unit/test-gobex-transfer when running with
GLib 2.40.

/gobex/test_packet_get_req_suspend_resume:
(./unit/test-gobex-transfer:28879): GLib-CRITICAL **: Source ID 263 was
    not found when attempting to remove it
Trace/breakpoint trap
2014-04-25 11:15:15 +03:00
Luiz Augusto von Dentz
021712264c gobex: Fix asserting one more time
This fixes a regression caused by 35938b779d
where the current pending_req is set to NULL while processing the
response but cause the request to timeout since it is no longer removed
properly.
2014-04-09 14:28:47 +03:00
Luiz Augusto von Dentz
35938b779d gobex: Fix being able to cancel completed requests
This fixes bogus responses when rsp_func calls g_obex_cancel_req for
responses with final bit set.
2014-04-08 16:27:49 +03:00
Luiz Augusto von Dentz
28ef9c48c2 gobex: Really fix assert this time 2014-04-02 16:48:43 +03:00
Luiz Augusto von Dentz
17e6a27958 gobex: Fix memory leak
This fixes the following leak introduced by the authentication patches:

16 bytes in 1 blocks are definitely lost in loss record 62 of 158
   at 0x4C291D4: calloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x4E7FEC6: g_malloc0 (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x403226: prepare_auth_rsp.isra.4 (gobex.c:564)
   by 0x404DE4: handle_response (gobex.c:1015)
   by 0x405C7B: incoming_data (gobex.c:1351)
   by 0x4E7A2A5: g_main_context_dispatch (in
/usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x4E7A627: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x4E7AA39: g_main_loop_run (in
/usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x40DC34: test_auth (test-gobex.c:966)
   by 0x4E9E5E0: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x4E9E7A5: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2)
   by 0x4E9EB1A: g_test_run_suite (in
/usr/lib64/libglib-2.0.so.0.3800.2)
2014-04-02 16:48:43 +03:00
Luiz Augusto von Dentz
ac93ba0e44 gobex: Fix asserting when resending connect request
In case connect requests needs to be resent to authenticate the timeout
handle should be removed otherwise it may end up asserting:

ERROR:gobex/gobex.c:251:req_timeout: assertion failed: (p != NULL)
2014-04-02 14:25:39 +03:00
Luiz Augusto von Dentz
774aae64e8 gobex: Respond to authentication challenge
This implements authentication response as defined in OBEX specification
since it is a mandatory feature for many Bluetooth profiles.
2014-03-31 17:30:59 +03:00
Luiz Augusto von Dentz
ab22fce6bb gobex/header: Add g_obex_header_new_tag function
This function can be used to set tag using GObexApparam as argument but
for arbritary headers.
2014-03-31 17:30:58 +03:00
Luiz Augusto von Dentz
c447292799 gobex: Add g_obex_disconnect
This adds g_obex_disconnect function which can be used to send OBEX
Disconnect command.
2014-03-21 16:13:45 +02:00
Luiz Augusto von Dentz
0246b2d6bd gobex/transfer: Keep request id for GET when SRM is active
In case a GET operation is in progress with SRM the same request id is
valid for the whole transfer otherwise it is not possible to cancel the
transfer after the first response.
2014-03-21 16:13:44 +02:00
Luiz Augusto von Dentz
4b873ec8af gobex: Fix not resetting SRM setup
If SRM is not confirmed by both ends the setup should be disregarded and
the data associated to it can be freed otherwise the next command may
reuse the same setup assuming it is still valid and probably cause SRM
to be enabled without remote consent.
2014-03-21 16:13:44 +02:00
Luiz Augusto von Dentz
8a0fb5f525 gobex: Handle suspending/resuming for GET when SRM is active
This adds support for suspending/resuming GET requests GET when SRM is
active, in this case suspending the TX queue wont stop the remote
to continue sending packets, to do that SRMP header should be set to wait
so the remote should wait.
2014-02-20 13:43:08 +02:00
Luiz Augusto von Dentz
7b43cc9e4f gobex: Fix not handling SRM properly
SRM can be enabled but while not active with use of SRMP header so the
handling of this states needs to be separated.
2014-02-20 13:43:08 +02:00
Luiz Augusto von Dentz
df65753b0a gobex: Revert g_obex_pending_req_abort to static pending_req_abort
This reverts the changes introduced in
9095deb825 that made pending_req_abort
public which is not necessary considering g_obex_cancel_req can do the
same and is safe to call even if the request is not pending.
2013-09-29 17:01:07 +03:00
Luiz Augusto von Dentz
c9f3b81d07 gobex: Fix crash on g_obex_pending_req_abort
It is not safe to call g_obex_pending_req_abort directly as pending_req
can be NULL:
Invalid read of size 4
   at 0x41231E: g_obex_pending_req_abort (gobex.c:693)
   by 0x416A8A: g_obex_cancel_transfer (gobex-transfer.c:647)
   by 0x42DEF2: obc_transfer_cancel (transfer.c:180)
   by 0x43D833: process_message.isra.5 (object.c:259)
   by 0x3B0701CE85: ??? (in /usr/lib64/libdbus-1.so.3.7.4)
   by 0x3B0700FA30: dbus_connection_dispatch (in /usr/lib64/libdbus-1.so.3.7.4)
   by 0x43A5B7: message_dispatch (mainloop.c:76)
   by 0x3B03C48962: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3)
   by 0x3B03C47E05: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3600.3)
   by 0x3B03C48157: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3)
   by 0x3B03C48559: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3600.3)
   by 0x40D53C: main (main.c:319)
 Address 0x30 is not stack'd, malloc'd or (recently) free'd
2013-09-29 17:01:07 +03:00
Andrei Emeltchenko
c64fd37802 codingstyle: Change __FUNCTION__ to __func__
The __func__ macro is part of the C99 standard whereas __FUNCTION__ is a
legacy gcc specific alias for it:

	http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

Additionally, checkpatch.pl that's commonly used to verify coding style
also recommends to use __func__ instead of __FUNCTION__.
2013-09-11 13:22:08 +03:00
Luiz Augusto von Dentz
0c6df3bb9b gobex: Add proper message to transfer errors
This improve the error message when a transfer fails by using
g_obex_strerror to decode the response code to a human readable string.
2013-08-12 11:13:51 +03:00
Lucas De Marchi
f946c9e445 gobex: Get rid of gchar
Use plain char instead of gchar.
2013-05-02 09:02:31 +03:00
Lucas De Marchi
c1e4e183b5 gobex: Get rid of gint
Use plain int instead of gint. In glib gint is always a typedef to int,
so it's safe to use it even for callbacks with glib.
2013-05-01 09:04:21 +03:00
Lucas De Marchi
d073af52ea gobex: Use gcc builtin instead of g_atomic
g_atomic_* end up using G_STATIC_ASSERT, causing gcc 4.8 to yell due to
-Wunused-local-typedefs.

/usr/include/glib-2.0/glib/gmacros.h:162:53: error: typedef ‘_GStaticAssertCompileTimeAssertion_2’ locally defined but not used [-Werror=unused-local-typedefs]
 #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1]

Most of the uses of atomic operations were wrong. They were fixed as
well. If we are using atomic operations, reading the variable again
later for logging is not an option, we should use the return of the
atomic function used to fetch the variable.
2013-04-09 07:01:58 +09:00
Johan Hedberg
30e2aaa3f8 gobex: Fix GPL version reference
These files (like everything else in the tree) should be GPL 2 or later
instead of GPL 2 only.
2013-02-15 16:25:29 +02:00
Johan Hedberg
b8779d2202 Revert "Ensure config.h is included by using CPPFLAGS"
This reverts commit 8a03376544.

The patch needs to be split up and the gdbus/ changes were bogus
compared to the original commit message.

Conflicts:
	Makefile.am
	Makefile.obexd
	profiles/cyclingspeed/cyclingspeed.c
	profiles/heartrate/heartrate.c
	src/error.c
2012-12-07 12:46:04 +02:00
Lucas De Marchi
8a03376544 Ensure config.h is included by using CPPFLAGS
Instead of trying to include config.h in each file over the tree and
possibly forgetting to include it, give a "-include config.h" argument
to the compiler so it's guaranteed that a) it will be included for all
source files and b) it will be the first header included.

gdbus/ directory is left out, since it would break other projects using
it.
2012-12-05 17:18:07 +02:00
Luiz Augusto von Dentz
c5cab062fc gobex: Fix build on 32 bits systems
GUINT_TO_POINTER does not cast properly in older version of GLib (< 2.31)
causing the following errors:

cc1: warnings being treated as errors
gobex/gobex-apparam.c: In function ‘g_obex_apparam_set_bytes’:
gobex/gobex-apparam.c:176:38: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_uint8’:
gobex/gobex-apparam.c:243:43: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_uint16’:
gobex/gobex-apparam.c:261:43: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_uint32’:
gobex/gobex-apparam.c:282:43: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_uint64’:
gobex/gobex-apparam.c:303:43: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_string’:
gobex/gobex-apparam.c:324:43: error: cast to pointer from integer of
different size
gobex/gobex-apparam.c: In function ‘g_obex_apparam_get_bytes’:
gobex/gobex-apparam.c:342:43: error: cast to pointer from integer of
different size
make[1]: *** [gobex/gobex-apparam.o] Error 1
make: *** [all] Error 2
2012-12-04 22:22:06 +01:00
Luiz Augusto von Dentz
696fad1853 gobex: Add debug option to apparam
This adds "apparam" to the debug options of GOBEX_DEBUG
2012-12-04 22:22:06 +01:00
Luiz Augusto von Dentz
63d1b60c8c gobex: Integrate GObexApparam with GObexHeader
This introduce 2 new convenient functions: g_obex_header_get_apparam
which parses and decode an header into GObexApparam and
gobex_header_new_apparam that encode GObexApparam into GObexHeader.
2012-12-04 22:22:06 +01:00