Without that fix, when compiling libsamsung-ipc with
--enable-strict-cflags, we have the following error:
gprs.c: In function 'ipc_gprs_define_pdp_context_setup':
gprs.c:38:9: error:
'strncpy' specified bound 124 equals destination size
[-Werror=stringop-truncation]
38 | strncpy((char *) data->apn, apn, sizeof(data->apn));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It comes from the fact that the size of data->apn is fixed (to 124) in
include/gprs.h:
struct ipc_gprs_define_pdp_context_data {
unsigned char enable;
unsigned char cid;
unsigned char magic;
unsigned char apn[124];
} __attribute__((__packed__));
The issue is that in ipc_gprs_define_pdp_context_setup we had the
following code:
int ipc_gprs_define_pdp_context_setup(
struct ipc_gprs_define_pdp_context_data *data,
unsigned char enable,
unsigned char cid,
const char *apn)
{
[...]
strncpy((char *) data->apn, apn, sizeof(data->apn));
[...]
return 0;
}
And in the strcpy(3) manual we have:
The strncpy() function is similar, except that at most n bytes of
src are copied. Warning: If there is no null byte among the first
n bytes of src, the string placed in dest will not be
null-terminated.
So if we have an apn of 124 or more characters, the copied data will
not be null terminated hence the warning.
Since apn is a character array and not a string, and that the field is
padded with zeros anyway we can use memcpy instead.
Signed-off-by: Denis 'GNUtoo' Carikli <[email protected]>
---
samsung-ipc/gprs.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samsung-ipc/gprs.c b/samsung-ipc/gprs.c
index 89f06e7..64d94f9 100644
--- a/samsung-ipc/gprs.c
+++ b/samsung-ipc/gprs.c
@@ -35,7 +35,7 @@ int ipc_gprs_define_pdp_context_setup(
data->cid = cid;
data->magic = 0x02;
- strncpy((char *) data->apn, apn, sizeof(data->apn));
+ memcpy(data->apn, apn, sizeof(data->apn));
return 0;
}
--
2.37.1
_______________________________________________
Replicant mailing list
[email protected]
https://lists.osuosl.org/mailman/listinfo/replicant