少打一个&,chromebook 91.0.4472.165 bug导致无法解锁?

虽然咱国内不用这玩意,但是网络报道还是挺及时的:谷歌开发团队犯低级错误?因一个字符拼写Bug,Chromebook用户被锁在系统之外,但是我是看不太明白。
Java中 逻辑运算 &&& 的区别在于&没有短路功能, 到C++这里怎么回事呢?为什么少了个&就会造成用户输入密码不被验证?
if (key_data_.has_value() && !key_data_->label().empty())
if (key_data_.has_value() & !key_data_->label().empty())
在这里插入图片描述
&两边的函数看起来都返回是bool类型,但看从逻辑与看来没啥区别,区别就在短路,也就是说, 问题是false & ?造成的,咋一看无论是&还是&&均应返回false,但实际是有区别的,如果后者条件依赖前者为true,则此时就可能出现空指针等错误,导致啥也没返回,所以说难道正常逻辑期望的就是 key_data_.has_value()应该为false
看看引出这个bug的commit: cryptohome/vault_keyset.cc

diff --git a/cryptohome/vault_keyset.cc b/cryptohome/vault_keyset.cc
index f8e905a..d6362d5 100644
--- a/cryptohome/vault_keyset.cc
+++ b/cryptohome/vault_keyset.cc
@@ -429,6 +429,13 @@
 
     reset_salt_ = CryptoLib::CreateSecureRandomBlob(kAesBlockSize);
     reset_secret_ = CryptoLib::HmacSha256(reset_salt_.value(), reset_seed_);
+
+    // crbug.com/1224150: When an LE credential is resaved, that means the user
+    // authenticated successfully. In this case, auth_locked policy must always
+    // be set to false. Otherwise when a user enters their password, and
+    // PinWeaver unlocks the LE Credential, this field will remain set to true
+    // and PIN is never usable by Chrome.
+    auth_locked_ = false;
   }
 
   AuthBlockState auth_block_state;
@@ -461,7 +468,7 @@
 }
 
 std::string VaultKeyset::GetLabel() const {
-  if (key_data_.has_value()) {
+  if (key_data_.has_value() & !key_data_->label().empty()) {
     return key_data_->label();
   }
   // Fallback for legacy keys, for which the label has to be inferred from the
@@ -758,10 +765,8 @@
     *(serialized.mutable_key_data()) = key_data_.value();
   }
 
-  if (auth_locked_) {
-    serialized.mutable_key_data()->mutable_policy()->set_auth_locked(
-        auth_locked_);
-  }
+  serialized.mutable_key_data()->mutable_policy()->set_auth_locked(
+      auth_locked_);
 
   if (wrapped_chaps_key_.has_value()) {
     serialized.set_wrapped_chaps_key(wrapped_chaps_key_->data(),

reddit上有个评论,红框中我看了很是纳闷,居然有四个赞:在这里插入图片描述
于是自己试验一番,这个评论说反了(作者后来也承认),C++中&&&和JAVA中的是一样的效果,即&&可短路:

#include<iostream>
using namespace std;

bool methodA(){
 cout << "return true.\n";
 return true;
}

bool methodB(){
 cout << "return false.\n";
 return false;
}

int main(){
 cout << "test &\n";
 if( methodB() & methodA() ){
  }
  
  cout << "\n\ntest &&\n";
 if( methodB() && methodA() ){
  }
}

接着继续:
上面的diff中key_data_怎么来的?从代码中cryptohome/vault_keyset.cc找到:
key_data_ = serialized.key_data();
找这个类的定义SerializedVaultKeyset
cryptohome/vault_keyset.cc

SerializedVaultKeyset VaultKeyset::ToSerialized() const {
  SerializedVaultKeyset serialized;
  serialized.set_flags(flags_);
  serialized.set_salt(salt_.data(), salt_.size());
  serialized.set_wrapped_keyset(wrapped_keyset_.data(), wrapped_keyset_.size());
  if (tpm_key_.has_value()) {
    serialized.set_tpm_key(tpm_key_->data(), tpm_key_->size());
  }
  if (tpm_public_key_hash_.has_value()) {
    serialized.set_tpm_public_key_hash(tpm_public_key_hash_->data(),
                                       tpm_public_key_hash_->size());
  }
  if (password_rounds_.has_value()) {
    serialized.set_password_rounds(password_rounds_.value());
  }
  if (last_activity_timestamp_.has_value()) {
    serialized.set_last_activity_timestamp(last_activity_timestamp_.value());
  }
  if (key_data_.has_value()) {
    *(serialized.mutable_key_data()) = key_data_.value();
  }
  serialized.mutable_key_data()->mutable_policy()->set_auth_locked(
      auth_locked_);

说实话,上面这段C++代码是一点看不明白,SerializedVaultKeyset 应该是返回类型,VaultKeyset是何意?:: 是何意? ToSerialized是方法名,const又是何意?
方法第一行的SerializedVaultKeyset serialized;也不用初始化就可以用?
不看了,先发布 20210816。
附:
1. 学到一个meme, footgun:自己给自己挖坑
2. 而且有意思的是国内的文章一会儿91.0.4772.165 一会儿 91.0.4472.165,去看git上的代码都没有91.0.4772.165(或者167)这个tag,来是国外androidpolice的文章写错了
3. 另一个是我到处找看哪里有讨论这个问题的,居然在bilibili看到了相关讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值