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
}