diff options
author | Louis Yung-Chieh Lo <yjlou@chromium.org> | 2010-11-19 09:58:47 +0800 |
---|---|---|
committer | Louis Yung-Chieh Lo <yjlou@chromium.org> | 2010-11-19 09:58:47 +0800 |
commit | 6965cbfed3352754f0ff9a270e3b330223b7154c (patch) | |
tree | f75b25ad312fcd504d4c5c0073a900e709e94a63 /cgpt/cmd_add.c | |
parent | 2b23c021f3137427a8b3f00e7702850be6e1c242 (diff) | |
download | vboot-6965cbfed3352754f0ff9a270e3b330223b7154c.tar.gz |
The right implementation of CGPT label conversion between UTF8 and UTF16.
For security quick fix, the original UTF8/UTF16 conversion only supports
ASCII area. This CL extends the library to support multiple code units
conversion between UTF8 and UTF16. The UTF8/UTF16 encoded byte(s) would be
decoded to code point first, then be encoded to UTF16/UTF8 correspondingly.
Bill, please kindly review the UTF8/UTF16 conversion.
Peter, please kindly comment if any security concern.
Thanks.
Change-Id: I99c558ff27556e0b8635ba2b8d9925d042e75cb2
BUG=chromium-os:7542
TEST=RUNTESTS=1 emerge-x86-generic vboot_reference
Manually tested the following commands (intentionally mix Chinese and ASCII):
export C=.../cgpt
export D=/tmp/hda
$C add $D -i 1 -l 批P踢T踢T許C夕C餐
$C find $D -l 批P踢T踢T許C夕C餐
$C show $D
$C add $D -i 1 -l 批P踢T踢T許C夕C餐
$C find $D -l 批P踢T踢T許C夕C餐
$C add $D -i 1 -l abc012
$C add $D -i 1 -l 是否看過坊間常見的許茹芸淚海慶功宴吃蓋飯第四集
$C add $D -i 1 -l 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ # ok and truncated
$C add $D -i 1 -l `printf "\xf4\x91\x81\x81"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf4\x8f\xbf\xbf"`
$C add $D -i 1 -l `printf "\xf4\x8f\x44\x44"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf4\x8f\xbf"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf0\xbf\xbf\xbf"`
$C add $D -i 1 -l `printf "\xf0\xbf\xbf\x44"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf0\x80\x80\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf0\x80\x84\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf0\x80\x90\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xf0\x88\x80\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xed\x80\x80"`
$C add $D -i 1 -l `printf "\xed\xa0\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xe0\xbf\xbf"`
$C add $D -i 1 -l `printf "\xe0\xbf\x44"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xe0\x80\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xe0\x90\x80"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xe0\xbf"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xd0\x80"`
$C add $D -i 1 -l `printf "\xd0\x11"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xd0"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\xc0\xaf"` # (EXPECT: failed)
$C add $D -i 1 -l `printf "\x80"` # (EXPECT: failed)
Review URL: http://codereview.chromium.org/5025003
Diffstat (limited to 'cgpt/cmd_add.c')
-rw-r--r-- | cgpt/cmd_add.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/cgpt/cmd_add.c b/cgpt/cmd_add.c index dafcc50f..81b0dfa1 100644 --- a/cgpt/cmd_add.c +++ b/cgpt/cmd_add.c @@ -251,8 +251,11 @@ int cmd_add(int argc, char *argv[]) { if (set_unique) memcpy(&entry->unique, &unique_guid, sizeof(Guid)); if (label) { - UTF8ToUTF16((uint8_t *)label, entry->name, - sizeof(entry->name) / sizeof(entry->name[0])); + if (CGPT_OK != UTF8ToUTF16((uint8_t *)label, entry->name, + sizeof(entry->name) / sizeof(entry->name[0]))) { + Error("The label cannot be converted to UTF16.\n"); + goto bad; + } } if (set_raw) { entry->attrs.fields.gpt_att = raw_value; |