[PATCH 6/6] sms: Fix gsm340_scts() to correctly decode absolute valid times.

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Daniel Willmann dwillmann at sysmocom.de
Wed Mar 12 18:53:13 UTC 2014


Hello Alexander,

On Fri, 2014-03-07 at 21:25, Alexander Chemeris wrote:
> - Support negative timezone offsets decoding.
> - Correctly account timezone offset and artificial offset mktime()
> introduces.

patch seems missing, I included the current one:

> From b8ed8ed29d239693e2b32b62cbac3b2847937b9b Mon Sep 17 00:00:00 2001
> Message-Id: <b8ed8ed29d239693e2b32b62cbac3b2847937b9b.1394648513.git.daniel at totalueberwachung.de>
> From: Alexander Chemeris <Alexander.Chemeris at gmail.com>
> Date: Fri, 7 Mar 2014 21:03:44 +0100
> Subject: [PATCH 1/1] sms: Fix gsm340_scts() to correctly decode absolute valid
>  times.
> 
> - Support negative timezone offsets decoding.
> - Correctly account timezone offset and artificial offset mktime() introduces.
> ---
>  src/gsm/gsm0411_utils.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/src/gsm/gsm0411_utils.c b/src/gsm/gsm0411_utils.c
> index bb59a10..e199b6a 100644
> --- a/src/gsm/gsm0411_utils.c
> +++ b/src/gsm/gsm0411_utils.c
> @@ -100,11 +100,13 @@ void gsm340_gen_scts(uint8_t *scts, time_t time)
>  time_t gsm340_scts(uint8_t *scts)
>  {
>  	struct tm tm;
> -	uint8_t yr = gsm411_unbcdify(*scts++);
> -	int ofs;
> +	uint8_t yr, tz;
> +	int ofs = 0;

Do we need to initialize ofs? It looks like both before and now ofs is
always assigned before use.

> +	time_t timestamp;
>  
>  	memset(&tm, 0x00, sizeof(struct tm));
>  
> +	yr = gsm411_unbcdify(*scts++);
>  	if (yr <= 80)
>  		tm.tm_year = 100 + yr;
>  	else
> @@ -114,15 +116,28 @@ time_t gsm340_scts(uint8_t *scts)
>  	tm.tm_hour = gsm411_unbcdify(*scts++);
>  	tm.tm_min  = gsm411_unbcdify(*scts++);
>  	tm.tm_sec  = gsm411_unbcdify(*scts++);
> -#ifdef HAVE_TM_GMTOFF_IN_TM
> -	tm.tm_gmtoff = gsm411_unbcdify(*scts++) * 15*60;
> -#endif

By deleting the #ifdef here and not adding it below you'll break cygwin
builds. See commit 7c8e2cc7aca1a789bbcf989a14be177d59041959.

>  	/* according to gsm 03.40 time zone is
>  	   "expressed in quarters of an hour" */
> -	ofs = gsm411_unbcdify(*scts++) * 15*60;
> -
> -	return mktime(&tm) - ofs;
> +	tz = *scts++;
> +	ofs = gsm411_unbcdify(tz&0x7f) * 15*60;
> +	if (tz&0x80)
> +		ofs = -ofs;
> +	/* mktime() doesn't tm.tm_gmtoff into account. Instead, it fills this field
doesn't take

> +	 * with the current timezone. Which means that the resulting time is off
> +	 * by several hours after that. So here we're setting tm.tm_isdt to -1
> +	 * to indicate that the tm time is local, but later we subtract the
> +	 * offset introduced by mktime. */
> +	tm.tm_isdst = -1;
> +
> +	timestamp = mktime(&tm);
> +	if (timestamp < 0)
> +		return -1;
> +
> +	/* Subtract artificial timezone offset, introduced by mktime() */
> +	timestamp = timestamp - ofs + tm.tm_gmtoff;
> +
> +	return timestamp;
>  }
>  
>  /* Decode validity period format 'relative'.
> -- 
> 1.8.4.2

I'm still not convinced that we want to use mktime and tm_gmtoff for the
calculation. There's timegm() which is the inverse of gmtime() which I
think we should use were it's available. Depending on timegm shouldn't
make us and more dependent on some extension than we already are with
tm_gmtoff.

The man page has a note on how to implement a portable version, though
it involves calling setenv (to set TZ to UTC) and I'm not sure we want
to do that in a library.

Additional discussion welcome.


Regards,
Daniel

-- 
- Daniel Willmann <dwillmann at sysmocom.de>       http://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Schivelbeiner Str. 5
* 10439 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Directors: Holger Freyther, Harald Welte




More information about the OpenBSC mailing list