aboutsummaryrefslogtreecommitdiff
path: root/gprofng
diff options
context:
space:
mode:
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>2024-11-26 19:40:16 -0800
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>2024-11-27 13:55:02 -0800
commit194a7cc5e417c76e2d83a6928d47adcea916289c (patch)
tree8dbc2854fd38c119a97870440ee7e2c1afad5cee /gprofng
parentd77a5792b386ec0f02c3b636a91cfc2ce53c2498 (diff)
downloadbinutils-194a7cc5e417c76e2d83a6928d47adcea916289c.zip
binutils-194a7cc5e417c76e2d83a6928d47adcea916289c.tar.gz
binutils-194a7cc5e417c76e2d83a6928d47adcea916289c.tar.bz2
gprofng: skip unrecognized input command
gprofng crashes when the GUI sends an invalid command. Skip unrecognized commands and return an error status to the GUI. gprofng/ChangeLog 2024-11-26 Vladimir Mezentsev <vladimir.mezentsev@oracle.com> * src/ipc.cc (ipc_doWork): Skip unrecognized commands. * src/ipcio.cc (writeError): New function. * src/ipcio.h: Add RESPONSE_STATUS_ERROR.
Diffstat (limited to 'gprofng')
-rw-r--r--gprofng/src/ipc.cc6
-rw-r--r--gprofng/src/ipcio.cc10
-rw-r--r--gprofng/src/ipcio.h5
3 files changed, 18 insertions, 3 deletions
diff --git a/gprofng/src/ipc.cc b/gprofng/src/ipc.cc
index 3e706db..feda1f8 100644
--- a/gprofng/src/ipc.cc
+++ b/gprofng/src/ipc.cc
@@ -2534,8 +2534,10 @@ ipc_doWork (void *arg)
}
else
{
- ipc_log ("Unrecognized input cmd \"%s\"; Aborting.\n", inp);
- return 1;
+ char *s = dbe_sprintf ("Unrecognized request: \"%s\"", inp);
+ ipc_log ("%s\n", s);
+ writeError (s, req);
+ free (s);
}
ipc_log (" processing IPC command %s complete\n", inp);
free (inp);
diff --git a/gprofng/src/ipcio.cc b/gprofng/src/ipcio.cc
index 8ff16d5..c20a22f 100644
--- a/gprofng/src/ipcio.cc
+++ b/gprofng/src/ipcio.cc
@@ -777,6 +777,16 @@ writeString (const char *s, IPCrequest* req)
}
void
+writeError (const char *s, IPCrequest* req)
+{
+ IPCresponse *OUTS = responseBufferPool->getNewResponse (BUFFER_SIZE_LARGE);
+ OUTS->sendByte (L_STRING);
+ OUTS->sendSVal (s);
+ writeResponseWithHeader (req->getRequestID (), req->getChannelID (),
+ RESPONSE_TYPE_COMPLETE, RESPONSE_STATUS_ERROR, OUTS);
+}
+
+void
writeObject (DbeObj obj, IPCrequest* req)
{
writeLong ((long long) obj, req);
diff --git a/gprofng/src/ipcio.h b/gprofng/src/ipcio.h
index 23c35fc..7cef743 100644
--- a/gprofng/src/ipcio.h
+++ b/gprofng/src/ipcio.h
@@ -40,6 +40,7 @@ typedef char *String;
#define RESPONSE_STATUS_SUCCESS 1
#define RESPONSE_STATUS_FAILURE 2
#define RESPONSE_STATUS_CANCELLED 3
+#define RESPONSE_STATUS_ERROR 4
#define RESPONSE_TYPE_ACK 0
#define RESPONSE_TYPE_PROGRESS 1
@@ -60,7 +61,8 @@ enum IPCrequestStatus
IN_PROGRESS,
COMPLETED,
CANCELLED_DEFAULT,
- CANCELLED_IMMEDIATE
+ CANCELLED_IMMEDIATE,
+ UNDEFINED_REGUEST
};
enum IPCTraceLevel
@@ -151,6 +153,7 @@ String readString (IPCrequest*);
void readRequestHeader ();
// write to the wire
+void writeError (const char *, IPCrequest*);
void writeString (const char *, IPCrequest*);
void writeBoolean (bool, IPCrequest*);
void writeInt (int, IPCrequest*);