forked from acouzens/open5gs
[SBI] Fix conversion of AMBR bitrates from string to integer
When the input string contains a number and a unit too large to be represented by a 64-bit variable, AMF/SMF would crash due to conversion resulting in a negative value and unable to be used in compiling NAS-PDU container. Now the value gets clipped at int64_t maximum value. Failed to encode ASN-PDU [-1] (../lib/asn1c/util/message.c:42)
This commit is contained in:
parent
a4babef9eb
commit
84569ccbdc
|
@ -717,6 +717,7 @@ uint64_t ogs_sbi_bitrate_from_string(char *str)
|
||||||
char *unit = NULL;
|
char *unit = NULL;
|
||||||
uint64_t bitrate = 0;
|
uint64_t bitrate = 0;
|
||||||
ogs_assert(str);
|
ogs_assert(str);
|
||||||
|
uint64_t mul = 1;
|
||||||
|
|
||||||
unit = strrchr(str, ' ');
|
unit = strrchr(str, ' ');
|
||||||
bitrate = atoll(str);
|
bitrate = atoll(str);
|
||||||
|
@ -728,15 +729,25 @@ uint64_t ogs_sbi_bitrate_from_string(char *str)
|
||||||
|
|
||||||
SWITCH(unit+1)
|
SWITCH(unit+1)
|
||||||
CASE("Kbps")
|
CASE("Kbps")
|
||||||
return bitrate * 1000;
|
mul = 1000ul;
|
||||||
|
break;
|
||||||
CASE("Mbps")
|
CASE("Mbps")
|
||||||
return bitrate * 1000 * 1000;
|
mul = 1000ul * 1000ul;
|
||||||
|
break;
|
||||||
CASE("Gbps")
|
CASE("Gbps")
|
||||||
return bitrate * 1000 * 1000 * 1000;
|
mul = 1000ul * 1000ul * 1000ul;
|
||||||
|
break;
|
||||||
CASE("Tbps")
|
CASE("Tbps")
|
||||||
return bitrate * 1000 * 1000 * 1000 * 1000;
|
mul = 1000ul * 1000ul * 1000ul * 1000ul;
|
||||||
|
break;
|
||||||
DEFAULT
|
DEFAULT
|
||||||
END
|
END
|
||||||
|
|
||||||
|
if (bitrate >= (INT64_MAX / mul))
|
||||||
|
bitrate = INT64_MAX;
|
||||||
|
else
|
||||||
|
bitrate *= mul;
|
||||||
|
|
||||||
return bitrate;
|
return bitrate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue