Blame 0002-Update-radare2-and-adapt-Cutter-1406.patch

c158fab
From cedec2c8790b3df093e08e3a7bf41a9c992a8af9 Mon Sep 17 00:00:00 2001
c158fab
From: =?UTF-8?q?Florian=20M=C3=A4rkl?= <info@florianmaerkl.de>
c158fab
Date: Fri, 29 Mar 2019 18:11:41 +0100
c158fab
Subject: [PATCH 2/4] Update radare2 and adapt Cutter (#1406)
c158fab
c158fab
* Update radare2 and adapt Cutter
c158fab
c158fab
* Fix QByteArray creation in CutterCore::assemble()
c158fab
c158fab
(cherry picked from commit 41af189312eaa1621db7a4acff57b123cc8dd423)
c158fab
---
c158fab
 radare2                               |  2 +-
c158fab
 src/core/Cutter.cpp                   | 36 ++++++++++++++++++++++-----
c158fab
 src/core/Cutter.h                     |  8 ++++--
c158fab
 src/dialogs/EditInstructionDialog.cpp |  6 +++--
c158fab
 4 files changed, 41 insertions(+), 11 deletions(-)
c158fab
c158fab
diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp
c158fab
index 51c8c82..5958a3f 100644
c158fab
--- a/src/core/Cutter.cpp
c158fab
+++ b/src/core/Cutter.cpp
c158fab
@@ -773,20 +773,26 @@ void CutterCore::setBBSize(int size)
c158fab
     setConfig("anal.bb.maxsize", size);
c158fab
 }
c158fab
 
c158fab
-QString CutterCore::assemble(const QString &code)
c158fab
+QByteArray CutterCore::assemble(const QString &code)
c158fab
 {
c158fab
     CORE_LOCK();
c158fab
     RAsmCode *ac = r_asm_massemble(core_->assembler, code.toUtf8().constData());
c158fab
-    QString hex(ac != nullptr ? ac->buf_hex : "");
c158fab
+    QByteArray res;
c158fab
+    if (ac && ac->bytes) {
c158fab
+        res = QByteArray(reinterpret_cast<const char *>(ac->bytes), ac->len);
c158fab
+    }
c158fab
     r_asm_code_free(ac);
c158fab
-    return hex;
c158fab
+    return res;
c158fab
 }
c158fab
 
c158fab
-QString CutterCore::disassemble(const QString &hex)
c158fab
+QString CutterCore::disassemble(const QByteArray &data)
c158fab
 {
c158fab
     CORE_LOCK();
c158fab
-    RAsmCode *ac = r_asm_mdisassemble_hexstr(core_->assembler, NULL, hex.toUtf8().constData());
c158fab
-    QString code = QString(ac != nullptr ? ac->buf_asm : "");
c158fab
+    RAsmCode *ac = r_asm_mdisassemble(core_->assembler, reinterpret_cast<const ut8 *>(data.constData()), data.length());
c158fab
+    QString code;
c158fab
+    if (ac && ac->assembly) {
c158fab
+        code = QString::fromUtf8(ac->assembly);
c158fab
+    }
c158fab
     r_asm_code_free(ac);
c158fab
     return code;
c158fab
 }
c158fab
@@ -2575,6 +2581,24 @@ QList<DisassemblyLine> CutterCore::disassembleLines(RVA offset, int lines)
c158fab
     return r;
c158fab
 }
c158fab
 
c158fab
+QByteArray CutterCore::hexStringToBytes(const QString &hex)
c158fab
+{
c158fab
+    QByteArray hexChars = hex.toUtf8();
c158fab
+    QByteArray bytes;
c158fab
+    bytes.reserve(hexChars.length() / 2);
c158fab
+    int size = r_hex_str2bin(hexChars.constData(), reinterpret_cast<ut8 *>(bytes.data()));
c158fab
+    bytes.resize(size);
c158fab
+    return bytes;
c158fab
+}
c158fab
+
c158fab
+QString CutterCore::bytesToHexString(const QByteArray &bytes)
c158fab
+{
c158fab
+    QByteArray hex;
c158fab
+    hex.resize(bytes.length() * 2);
c158fab
+    r_hex_bin2str(reinterpret_cast<const ut8 *>(bytes.constData()), bytes.size(), hex.data());
c158fab
+    return QString::fromUtf8(hex);
c158fab
+}
c158fab
+
c158fab
 void CutterCore::loadScript(const QString &scriptname)
c158fab
 {
c158fab
     r_core_task_sync_begin(core_);
c158fab
diff --git a/src/core/Cutter.h b/src/core/Cutter.h
c158fab
index c886cf0..da84152 100644
c158fab
--- a/src/core/Cutter.h
c158fab
+++ b/src/core/Cutter.h
c158fab
@@ -185,10 +185,14 @@ public:
c158fab
     QList<QString> getColorThemes();
c158fab
 
c158fab
     /* Assembly related methods */
c158fab
-    QString assemble(const QString &code);
c158fab
-    QString disassemble(const QString &hex;;
c158fab
+    QByteArray assemble(const QString &code);
c158fab
+    QString disassemble(const QByteArray &data);
c158fab
     QString disassembleSingleInstruction(RVA addr);
c158fab
     QList<DisassemblyLine> disassembleLines(RVA offset, int lines);
c158fab
+
c158fab
+    static QByteArray hexStringToBytes(const QString &hex;;
c158fab
+    static QString bytesToHexString(const QByteArray &bytes);
c158fab
+
c158fab
     void setCPU(QString arch, QString cpu, int bits);
c158fab
     void setEndianness(bool big);
c158fab
     void setBBSize(int size);
c158fab
diff --git a/src/dialogs/EditInstructionDialog.cpp b/src/dialogs/EditInstructionDialog.cpp
c158fab
index 2dfe8be..5993696 100644
c158fab
--- a/src/dialogs/EditInstructionDialog.cpp
c158fab
+++ b/src/dialogs/EditInstructionDialog.cpp
c158fab
@@ -45,9 +45,11 @@ void EditInstructionDialog::updatePreview(const QString &input)
c158fab
         ui->instructionLabel->setText("");
c158fab
         return;
c158fab
     } else if (editMode == EDIT_BYTES) {
c158fab
-        result = Core()->disassemble(input).trimmed();
c158fab
+        QByteArray data = CutterCore::hexStringToBytes(input);
c158fab
+        result = Core()->disassemble(data).trimmed();
c158fab
     } else if (editMode == EDIT_TEXT) {
c158fab
-        result = Core()->assemble(input).trimmed();
c158fab
+        QByteArray data = Core()->assemble(input);
c158fab
+        result = CutterCore::bytesToHexString(data).trimmed();
c158fab
     }
c158fab
 
c158fab
     if (result.isEmpty() || result.contains("\n")) {
c158fab
-- 
c158fab
2.21.0
c158fab