Re: [PATCH] kconfig: qconf: make debug links work again
From: Mauro Carvalho Chehab
Date: Sun Jun 28 2020 - 12:21:02 EST
Em Sun, 28 Jun 2020 23:41:46 +0900
Masahiro Yamada <masahiroy@xxxxxxxxxx> escreveu:
> On Sun, Jun 28, 2020 at 9:21 PM Mauro Carvalho Chehab
> <mchehab+huawei@xxxxxxxxxx> wrote:
> >
> > The Qt5 conversion broke support for debug info links.
> >
> > Restore the behaviour added by changeset
> > ab45d190fd4a ("kconfig: create links in info window").
> >
> > Reported-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx>
> > Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
>
>
> I tested this patch, but this caused
> segmentation fault.
>
>
> I enabled 'Show Debug Info',
> and then clicked
> dep: <symbol name>.
>
> Then, xconfig crashed.
>
> (without this patch, it did not cause
> segfault at least)
>
> Did you see this?
Could you please try the attached version? It should validate again the
symbols, instead of relying on a pointer passed via an URL.
This version still passes pointers via URLs for menus, though,
as it doesn't implement any logic for seeking the menu->prompt
string.
With this version, if something bad happens when parsing a
symbol internal URL, the code will print a message and ignore
it.
Thanks,
Mauro
[PATCH] kconfig: qconf: make debug links work again
The Qt5 conversion broke support for debug info links.
Restore the behaviour added by changeset
ab45d190fd4a ("kconfig: create links in info window").
Reported-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index 631e19659504..7dae5c5989db 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -7,6 +7,7 @@
#include <QAction>
#include <QApplication>
#include <QCloseEvent>
+#include <QDebug>
#include <QDesktopWidget>
#include <QFileDialog>
#include <QLabel>
@@ -1012,7 +1013,7 @@ ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
: Parent(parent), sym(0), _menu(0)
{
setObjectName(name);
-
+ setOpenLinks(false);
if (!objectName().isEmpty()) {
configSettings->beginGroup(objectName());
@@ -1085,7 +1086,7 @@ void ConfigInfoView::menuInfo(void)
if (sym->name) {
head += " (";
if (showDebug())
- head += QString().sprintf("<a href=\"s%p\">", sym);
+ head += QString().sprintf("<a href=\"s%s\">", sym->name);
head += print_filter(sym->name);
if (showDebug())
head += "</a>";
@@ -1094,7 +1095,7 @@ void ConfigInfoView::menuInfo(void)
} else if (sym->name) {
head += "<big><b>";
if (showDebug())
- head += QString().sprintf("<a href=\"s%p\">", sym);
+ head += QString().sprintf("<a href=\"s%s\">", sym->name);
head += print_filter(sym->name);
if (showDebug())
head += "</a>";
@@ -1217,13 +1218,56 @@ void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char
QString str2 = print_filter(str);
if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
- *text += QString().sprintf("<a href=\"s%p\">", sym);
+ *text += QString().sprintf("<a href=\"s%s\">", sym->name);
*text += str2;
*text += "</a>";
} else
*text += str2;
}
+void ConfigInfoView::clicked(const QUrl &url)
+{
+ QByteArray str = url.toEncoded();
+ const std::size_t count = str.size();
+ char *hex = new char[count + 1];
+ char type;
+ struct symbol **result;
+
+ if (count < 1) {
+ qInfo() << "Clicked link is empty";
+ return;
+ }
+
+ memcpy(hex, str.constData(), count);
+ type = hex[0];
+
+ if (type == 's') {
+ /* Seek for exact match */
+ hex[0] = '^';
+ strcat(hex, "$");
+ result = sym_re_search(hex);
+ if (!result) {
+ qInfo() << "Clicked symbol is invalid";
+ return;
+ }
+
+ sym = *result;
+ symbolInfo();
+ } else {
+ unsigned long p = (int)strtol(hex + 1, NULL, 16);
+ if (!p) {
+ qInfo() << "Clicked menu is invalid";
+ return;
+ }
+
+ struct menu *m = (struct menu *)p;
+
+ _menu = m;
+ menuInfo();
+ }
+ emit showDebugChanged(true);
+}
+
QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
{
QMenu* popup = Parent::createStandardContextMenu(pos);
@@ -1497,6 +1541,9 @@ ConfigMainWindow::ConfigMainWindow(void)
helpMenu->addAction(showIntroAction);
helpMenu->addAction(showAboutAction);
+ connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
+ helpText, SLOT (clicked (const QUrl &)) );
+
connect(configList, SIGNAL(menuChanged(struct menu *)),
helpText, SLOT(setInfo(struct menu *)));
connect(configList, SIGNAL(menuSelected(struct menu *)),
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index d913a02967ae..a193137f2314 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -250,6 +250,7 @@ public slots:
void setInfo(struct menu *menu);
void saveSettings(void);
void setShowDebug(bool);
+ void clicked (const QUrl &url);
signals:
void showDebugChanged(bool);