Fixes for 'std::bad_alloc' issue.

M committed Dec 23, 2020 at 14:48 UTC fd4efd46ea00a247759f2dcb6cd86555b57f79fd
7 files changed +58 -10
cw_monero/ios/Classes/monero_api.cpp
+14 -2
@@ -294,14 +294,26 @@ extern "C"
294 return true;
295 }
296
297 - void load_wallet(char *path, char *password, int32_t nettype)
297 + bool load_wallet(char *path, char *password, int32_t nettype)
298 {
299 nice(19);
300 Monero::NetworkType networkType = static_cast<Monero::NetworkType>(nettype);
301 - Monero::Wallet *wallet = Monero::WalletManagerFactory::getWalletManager()->openWallet(std::string(path), std::string(password), networkType);
301 + Monero::WalletManager *walletManager = Monero::WalletManagerFactory::getWalletManager();
302 + Monero::Wallet *wallet = walletManager->openWallet(std::string(path), std::string(password), networkType);
303 + int status;
304 + std::string errorString;
305 +
306 + wallet->statusWithErrorString(status, errorString);
307 change_current_wallet(wallet);
308 +
309 + return !(status != Monero::Wallet::Status_Ok || !errorString.empty());
310 + }
311 +
312 + char *error_string() {
313 + return strdup(get_current_wallet()->errorString().c_str());
314 }
315
316 +
317 bool is_wallet_exist(char *path)
318 {
319 return Monero::WalletManagerFactory::getWalletManager()->walletExists(std::string(path));
cw_monero/lib/exceptions/wallet_loading_exception.dart new
+8
@@ -0,0 +1,8 @@
1 +class WalletLoadingException implements Exception {
2 + WalletLoadingException({this.message});
3 +
4 + final String message;
5 +
6 + @override
7 + String toString() => message;
8 +}
\ No newline at end of file
cw_monero/lib/signatures.dart
+3 -1
@@ -14,7 +14,9 @@ typedef restore_wallet_from_keys = Int8 Function(Pointer<Utf8>, Pointer<Utf8>,
14
15 typedef is_wallet_exist = Int8 Function(Pointer<Utf8>);
16
17 -typedef load_wallet = Void Function(Pointer<Utf8>, Pointer<Utf8>, Int8);
17 +typedef load_wallet = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Int8);
18 +
19 +typedef error_string = Pointer<Utf8> Function();
20
21 typedef get_filename = Pointer<Utf8> Function();
22
cw_monero/lib/types.dart
+3 -1
@@ -14,7 +14,9 @@ typedef RestoreWalletFromKeys = int Function(Pointer<Utf8>, Pointer<Utf8>,
14
15 typedef IsWalletExist = int Function(Pointer<Utf8>);
16
17 -typedef LoadWallet = void Function(Pointer<Utf8>, Pointer<Utf8>, int);
17 +typedef LoadWallet = int Function(Pointer<Utf8>, Pointer<Utf8>, int);
18 +
19 +typedef ErrorString = Pointer<Utf8> Function();
20
21 typedef GetFilename = Pointer<Utf8> Function();
22
cw_monero/lib/wallet_manager.dart
+11 -2
@@ -7,6 +7,7 @@ import 'package:cw_monero/signatures.dart';
7 import 'package:cw_monero/types.dart';
8 import 'package:cw_monero/monero_api.dart';
9 import 'package:cw_monero/exceptions/wallet_creation_exception.dart';
10 +import 'package:cw_monero/exceptions/wallet_loading_exception.dart';
11 import 'package:cw_monero/exceptions/wallet_restore_from_keys_exception.dart';
12 import 'package:cw_monero/exceptions/wallet_restore_from_seed_exception.dart';
13
@@ -32,6 +33,10 @@ final loadWalletNative = moneroApi
33 .lookup<NativeFunction<load_wallet>>('load_wallet')
34 .asFunction<LoadWallet>();
35
36 +final errorStringNative = moneroApi
37 + .lookup<NativeFunction<error_string>>('error_string')
38 + .asFunction<ErrorString>();
39 +
40 void createWalletSync(
41 {String path, String password, String language, int nettype = 0}) {
42 final pathPointer = Utf8.toUtf8(path);
@@ -136,10 +141,14 @@ void restoreWalletFromKeysSync(
141 void loadWallet({String path, String password, int nettype = 0}) {
142 final pathPointer = Utf8.toUtf8(path);
143 final passwordPointer = Utf8.toUtf8(password);
139 -
140 - loadWalletNative(pathPointer, passwordPointer, nettype);
144 + final loaded = loadWalletNative(pathPointer, passwordPointer, nettype) != 0;
145 free(pathPointer);
146 free(passwordPointer);
147 +
148 + if (!loaded) {
149 + throw WalletLoadingException(
150 + message: convertUTF8ToString(pointer: errorStringNative()));
151 + }
152 }
153
154 void _createWallet(Map<String, dynamic> args) {
ios/Runner.xcodeproj/project.pbxproj
+3 -3
@@ -371,7 +371,7 @@
371 "$(inherited)",
372 "$(PROJECT_DIR)/Flutter",
373 );
374 - MARKETING_VERSION = 4.0.91;
374 + MARKETING_VERSION = 4.0.92;
375 PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
376 PRODUCT_NAME = "$(TARGET_NAME)";
377 SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -511,7 +511,7 @@
511 "$(inherited)",
512 "$(PROJECT_DIR)/Flutter",
513 );
514 - MARKETING_VERSION = 4.0.91;
514 + MARKETING_VERSION = 4.0.92;
515 PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
516 PRODUCT_NAME = "$(TARGET_NAME)";
517 SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -545,7 +545,7 @@
545 "$(inherited)",
546 "$(PROJECT_DIR)/Flutter",
547 );
548 - MARKETING_VERSION = 4.0.91;
548 + MARKETING_VERSION = 4.0.92;
549 PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
550 PRODUCT_NAME = "$(TARGET_NAME)";
551 SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
lib/monero/monero_wallet_service.dart
+16 -1
@@ -3,6 +3,7 @@ import 'package:cake_wallet/core/wallet_base.dart';
3 import 'package:hive/hive.dart';
4 import 'package:cw_monero/wallet_manager.dart' as monero_wallet_manager;
5 import 'package:cw_monero/wallet.dart' as monero_wallet;
6 +import 'package:cw_monero/exceptions/wallet_loading_exception.dart';
7 import 'package:cake_wallet/monero/monero_wallet.dart';
8 import 'package:cake_wallet/core/wallet_credentials.dart';
9 import 'package:cake_wallet/core/wallet_service.dart';
@@ -55,6 +56,15 @@ class MoneroWalletService extends WalletService<
56
57 final Box<WalletInfo> walletInfoSource;
58
59 + static void _removeCache(String name) async {
60 + final path = await pathForWallet(name: name, type: WalletType.monero);
61 + final cacheFile = File(path);
62 +
63 + if (cacheFile.existsSync()) {
64 + cacheFile.deleteSync();
65 + }
66 + }
67 +
68 @override
69 Future<MoneroWallet> create(MoneroNewWalletCredentials credentials) async {
70 try {
@@ -126,7 +136,12 @@ class MoneroWalletService extends WalletService<
136 return wallet;
137 } catch (e) {
138 // TODO: Implement Exception for wallet list service.
129 - print('MoneroWalletsManager Error: $e');
139 +
140 + if (e.message == 'std::bad_alloc') {
141 + _removeCache(name);
142 + return openWallet(name, password);
143 + }
144 +
145 rethrow;
146 }
147 }