diff options
author | Vladimir Mezentsev <vladimir.mezentsev@oracle.com> | 2024-11-26 19:40:16 -0800 |
---|---|---|
committer | Vladimir Mezentsev <vladimir.mezentsev@oracle.com> | 2024-11-27 13:55:02 -0800 |
commit | 194a7cc5e417c76e2d83a6928d47adcea916289c (patch) | |
tree | 8dbc2854fd38c119a97870440ee7e2c1afad5cee /gprofng | |
parent | d77a5792b386ec0f02c3b636a91cfc2ce53c2498 (diff) | |
download | binutils-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.cc | 6 | ||||
-rw-r--r-- | gprofng/src/ipcio.cc | 10 | ||||
-rw-r--r-- | gprofng/src/ipcio.h | 5 |
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*); |