aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-10-04 01:22:25 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-10-09 14:09:00 +0200
commitf3c50f07395f0e3331c4389015fe26ef53213c83 (patch)
treefa96c3dba3b790925b62dbddc4857d4fa9f97297
parentaa39852931032233259bb7495fec0ed6b6a81e0c (diff)
http-files: Avoid null dereferences
-rw-r--r--plugins/http-files/src/file_provider.vala35
-rw-r--r--plugins/http-files/src/file_sender.vala4
2 files changed, 34 insertions, 5 deletions
diff --git a/plugins/http-files/src/file_provider.vala b/plugins/http-files/src/file_provider.vala
index 7928dc81..df7d9c11 100644
--- a/plugins/http-files/src/file_provider.vala
+++ b/plugins/http-files/src/file_provider.vala
@@ -117,7 +117,9 @@ public class FileProvider : Dino.FileProvider, Object {
});
file_meta.mime_type = content_type;
if (content_length != null) {
- file_meta.size = int64.parse(content_length);
+ if (int64.try_parse(content_length, out file_meta.size) == false) {
+ throw new FileReceiveError.GET_METADATA_FAILED("failed to parse size");
+ }
}
return file_meta;
@@ -152,10 +154,23 @@ public class FileProvider : Dino.FileProvider, Object {
}
public FileMeta get_file_meta(FileTransfer file_transfer) throws FileReceiveError {
- Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(file_transfer.counterpart.bare_jid, file_transfer.account);
+ var? cm_identity = stream_interactor.get_module(ConversationManager.IDENTITY);
+ if (cm_identity == null) {
+ throw new FileReceiveError.GET_METADATA_FAILED("null ConversationManager");
+ }
+
+ Conversation? conversation = cm_identity.get_conversation(file_transfer.counterpart.bare_jid, file_transfer.account);
if (conversation == null) throw new FileReceiveError.GET_METADATA_FAILED("No conversation");
+ else if (file_transfer.info == null) {
+ throw new FileReceiveError.GET_METADATA_FAILED("null file_transfer.info");
+ }
- Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(int.parse(file_transfer.info), conversation);
+ int info;
+ bool result = int.try_parse(file_transfer.info, out info);
+ if (result == false) {
+ throw new FileReceiveError.GET_METADATA_FAILED("failed to parse file_transfer.info");
+ }
+ Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(info, conversation);
if (message == null) throw new FileReceiveError.GET_METADATA_FAILED("No message");
var file_meta = new HttpFileMeta();
@@ -170,10 +185,20 @@ public class FileProvider : Dino.FileProvider, Object {
}
public FileReceiveData? get_file_receive_data(FileTransfer file_transfer) {
- Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(file_transfer.counterpart.bare_jid, file_transfer.account);
+ var? cm_identity = stream_interactor.get_module(ConversationManager.IDENTITY);
+ if (cm_identity == null) return null;
+
+ Conversation? conversation = cm_identity.get_conversation(file_transfer.counterpart.bare_jid, file_transfer.account);
if (conversation == null) return null;
- Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(int.parse(file_transfer.info), conversation);
+ var? ms_identity = stream_interactor.get_module(MessageStorage.IDENTITY);
+ if (ms_identity == null || file_transfer.info == null) return null;
+
+ int info;
+ bool result = int.try_parse(file_transfer.info, out info);
+ if (result == false) return null;
+
+ Message? message = ms_identity.get_message_by_id(info, conversation);
if (message == null) return null;
var receive_data = new HttpFileReceiveData();
diff --git a/plugins/http-files/src/file_sender.vala b/plugins/http-files/src/file_sender.vala
index a39d695b..8f9f02fc 100644
--- a/plugins/http-files/src/file_sender.vala
+++ b/plugins/http-files/src/file_sender.vala
@@ -81,6 +81,10 @@ public class HttpFileSender : FileSender, Object {
body.complete();
return;
}
+ else if (read < 0) {
+ warning("transfer_more_bytes: stream.read failed");
+ return;
+ }
bytes.length = (int)read;
body.append_buffer(new Soup.Buffer.take(bytes));
}