[asterisk-bugs] [JIRA] (ASTERISK-28830) Incorrect UTF-8 handling when using function FILTER

Dmitriy (JIRA) noreply at issues.asterisk.org
Thu Apr 23 01:50:29 CDT 2020


    [ https://issues.asterisk.org/jira/browse/ASTERISK-28830?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=250521#comment-250521 ] 

Dmitriy commented on ASTERISK-28830:
------------------------------------

I found scenarios in which both types of errors are stably reproduced.

; BUG 1. Incorrect UTF8 text output
[FROM_PHONE_03]
exten => 8,1,NoOp()
 same => n,Set(n=20)
 same => n,While($[${SET(n=$[${n}-1])} > 0])
 same => n,NoOp(ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта)
 same => n,EndWhile
 same => n,Hangup()

RESULT:
  == Using SIP RTP CoS mark 5
    -- Executing [8 at FROM_PHONE_03:1] NoOp("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:2] Set("SIP/101-0000008b", "n=20") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРа▒       >        > ▒еромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИП▒       >        > ▒ВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутренн▒       >        > ▒оБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтро▒       >        > ▒СодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДва▒       >        > ▒дельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГра▒       >        > ▒цуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭт▒       >        > ▒уквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистические▒       >        > ▒мволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПять▒       > отДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаК       > ▒нсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфера▒       > стерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержи       > ▒КирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКакоготоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельны       > ▒Байта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "1") in new stack
    -- Executing [8 at FROM_PHONE_03:4] NoOp("SIP/101-0000008b", "ЕслиСтрокаСодержитКирилицуИПриВыводеНаКонсольКирилистическиеСимволыПопадаютНаГраницуКак▒       > готоВнутреннегоБуфераАстерискаРазмеромВПятьсотДвенадцатьБайтТоЭтуБуквуРазрываетНаДваОтдельныхБайта") in new stack
    -- Executing [8 at FROM_PHONE_03:5] EndWhile("SIP/101-0000008b", "") in new stack
    -- Executing [8 at FROM_PHONE_03:3] While("SIP/101-0000008b", "0") in new stack
    -- Executing [8 at FROM_PHONE_03:6] Hangup("SIP/101-0000008b", "") in new stack
  == Spawn extension (FROM_PHONE_03, 8, 6) exited non-zero on 'SIP/101-0000008b'


; BUG 2. Incorrect UTF8 write to CDR mysql table using cdr_adaptive_odbc
[FROM_PHONE_03]
exten => 9,1,NoOp()
 same => n,Set(CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэ яАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ) ; Success Insert To CDR table
;same => n,Set(CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ) ; Failed  Insert To CDR table
 same => n,Answer()
 same => n,Hangup()

;stably SUCCESS if I use first variant userfield
  == Using SIP RTP CoS mark 5
    -- Executing [9 at FROM_PHONE_03:1] NoOp("SIP/101-0000008c", "") in new stack
    -- Executing [9 at FROM_PHONE_03:2] Set("SIP/101-0000008c", "CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэ яАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ") in new stack
    -- Executing [9 at FROM_PHONE_03:3] Answer("SIP/101-0000008c", "") in new stack
    -- Executing [9 at FROM_PHONE_03:4] Hangup("SIP/101-0000008c", "") in new stack
  == Spawn extension (FROM_PHONE_03, 9, 4) exited non-zero on 'SIP/101-0000008c'


[FROM_PHONE_03]
exten => 9,1,NoOp()
;same => n,Set(CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэ яАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ) ; Success Insert To CDR table
 same => n,Set(CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ) ; Failed  Insert To CDR table
 same => n,Answer()
 same => n,Hangup()

;stably FAILED if I use second variant userfield
  == Using SIP RTP CoS mark 5
    -- Executing [9 at FROM_PHONE_03:1] NoOp("SIP/101-0000008d", "") in new stack
    -- Executing [9 at FROM_PHONE_03:2] Set("SIP/101-0000008d", "CDR(userfield)=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ") in new stack
    -- Executing [9 at FROM_PHONE_03:3] Answer("SIP/101-0000008d", "") in new stack
    -- Executing [9 at FROM_PHONE_03:4] Hangup("SIP/101-0000008d", "") in new stack
  == Spawn extension (FROM_PHONE_03, 9, 4) exited non-zero on 'SIP/101-0000008d'
[Apr 23 11:41:02] WARNING[31190]: res_odbc.c:538 ast_odbc_print_errors: SQL Execute returned an error: HY000: [MySQL][ODBC 8.0(a) Driver][mysqld-5.7.29-0ubuntu0.18.04.1]Incorrect string value: '\xD1' for column 'userfield' at row 1
[Apr 23 11:41:02] WARNING[31190]: res_odbc.c:433 ast_odbc_prepare_and_execute: SQL Execute error -1!
[Apr 23 11:41:02] WARNING[31190]: cdr_adaptive_odbc.c:765 odbc_log: cdr_adaptive_odbc: Insert failed on 'asteriskcdrdb:cdr'.  CDR failed: INSERT INTO cdr (calldate, clid, src, dst, dcontext, channel, lastapp, duration, billsec, disposition, amaflags, uniqueid, userfield, linkedid, sequence) VALUES ({ ts '2020-04-23 11:41:01' }, '"ОператорОператорОператорОператорОперато', '101', '9', 'FROM_PHONE_03', 'SIP/101-0000008d', 'Hangup', 0, 0, 'ANSWERED', 3, '1587624061.371', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэю▒', '1587624061.371', 171)


> Incorrect UTF-8 handling when using function FILTER
> ---------------------------------------------------
>
>                 Key: ASTERISK-28830
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-28830
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: Functions/General
>    Affects Versions: 13.31.0
>            Reporter: newborn
>
> As you can see, after using FILTER we're getting wrong symbols (Коп▒▒а")
> This causes dialplan errors and crash 
> How to filter UTF-8 (Russian alphabet) correctly?
> Code
> {noformat}
> NoOp(.. Processing call from ${CALLERID(all)} to ${EXTEN}@${CONTEXT}-GLOBAL ..);
> Set(CALLERID(name)=${FILTER(А-Яа-яA-Za-z\040\050\051\055\056,${CALLERID(name)})});
> {noformat}
> Result
> {noformat}
> [Apr 14 18:26:08]     -- Executing [0999 at inbound-trunk:1] NoOp("IAX2/02asterisk03-2864", ".. Processing call from "ООО Рога и Копыта" <7***> to 0299 at inbound-trunk-GLOBAL ..") in new stack
> [Apr 14 18:26:08]     -- Executing [0299 at inbound-trunk:2] Set("IAX2/msk02asterisk03-11656", "CALLERID(name)=ООО Рога и Коп▒▒а") in new stack
> [Apr 14 18:26:08] WARNING[1322]: res_odbc.c:550 ast_odbc_print_errors: SQL Execute returned an error: 22021: ERROR: invalid byte sequence for encoding "UTF8": 0xd1 0xd1;
> Error while preparing parameters
> [Apr 14 18:26:08] WARNING[1322]: res_odbc.c:445 ast_odbc_prepare_and_execute: SQL Execute error -1!
> [Apr 14 18:26:08] WARNING[1322]: cel_odbc.c:797 odbc_log: Insert failed on 'asterisk-local:cel'.  CEL failed: INSERT INTO cel 
> [Apr 14 18:26:16]     -- Executing [s at macro-inboundcall:5] Set("SIP/00001a28", "CALLFILENAME=in-2020-04-14-Tuesday--18h26m--from--ООО Рога и Коп▒▒а-7***--to-999--1586877968.66779") in new stack
> [Apr 14 18:26:16] ERROR[21790][C-00000df1]: json.c:870 ast_json_vpack: Error building JSON from '{s: s, s: s}': Invalid UTF-8 string.
> [Apr 14 18:26:16] ERROR[21790][C-00000df1]:   Got 19 backtrace records
> # 0: /usr/sbin/asterisk(ast_json_pack+0x99) [0x4ff6e9]
> # 1: /usr/sbin/asterisk(ast_channel_publish_varset+0x25) [0x5874a5]
> # 2: /usr/sbin/asterisk(pbx_builtin_setvar_helper+0x123) [0x54b143]
> # 3: /usr/sbin/asterisk(pbx_builtin_setvar+0xc6) [0x54b3f6]
> # 4: /usr/sbin/asterisk(pbx_exec+0xb9) [0x5432d9]
> # 5: /usr/sbin/asterisk() [0x53b92e]
> # 6: /usr/sbin/asterisk(ast_spawn_extension+0x30) [0x53c410]
> # 7: /usr/lib64/asterisk/modules/app_macro.so(+0x2d17) [0x7f89f309dd17]
> # 8: /usr/sbin/asterisk(pbx_exec+0xb9) [0x5432d9]
> # 9: /usr/sbin/asterisk(ast_app_exec_macro+0x5e) [0x443f6e]
> #10: /usr/lib64/asterisk/modules/app_dial.so(+0xbd0d) [0x7f89f6118d0d]
> #11: /usr/lib64/asterisk/modules/app_dial.so(+0xd2d6) [0x7f89f611a2d6]
> #12: /usr/sbin/asterisk(pbx_exec+0xb9) [0x5432d9]
> #13: /usr/sbin/asterisk() [0x53b92e]
> #14: /usr/sbin/asterisk() [0x53c95e]
> #15: /usr/sbin/asterisk() [0x53de1b]
> #16: /usr/sbin/asterisk() [0x5a3f4e]
> #17: /lib64/libpthread.so.0(+0x7e65) [0x7f8a2ec4fe65]
> #18: /lib64/libc.so.6(clone+0x6d) [0x7f8a2e22088d]
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list