2024-05-29 Fred Gleason <fredg@paravelsystems.com>

* Changed the socket type from SOCK_STREAM to SOCK_SEQPACKET in
	the 'RDUnixServer' and 'RDUnixSocket' classes.
	* Removed the resynchronization code from the 'RDJsonFramer' class.
	* Fixed a bug in rdpadd(8) that could cause corruption when processing
	JSON updates.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2024-05-29 11:56:02 -04:00
parent d422d12a5b
commit c4e6914c29
5 changed files with 11 additions and 56 deletions

View File

@ -24785,3 +24785,9 @@
2024-05-27 Fred Gleason <fredg@paravelsystems.com> 2024-05-27 Fred Gleason <fredg@paravelsystems.com>
* Fixed a regression in the 'RDHPIPlayStream::play()' method that * Fixed a regression in the 'RDHPIPlayStream::play()' method that
the 'play_length' setting to be ignored. the 'play_length' setting to be ignored.
2024-05-29 Fred Gleason <fredg@paravelsystems.com>
* Changed the socket type from SOCK_STREAM to SOCK_SEQPACKET in
the 'RDUnixServer' and 'RDUnixSocket' classes.
* Removed the resynchronization code from the 'RDJsonFramer' class.
* Fixed a bug in rdpadd(8) that could cause corruption when processing
JSON updates.

View File

@ -23,9 +23,6 @@
RDJsonFramer::RDJsonFramer(QTcpSocket *in_sock,QObject *parent) RDJsonFramer::RDJsonFramer(QTcpSocket *in_sock,QObject *parent)
: QObject(parent) : QObject(parent)
{ {
d_escaped=false;
d_quoted=false;
d_level=0;
d_socket=in_sock; d_socket=in_sock;
connect(d_socket,SIGNAL(readyRead()),this,SLOT(readyReadData())); connect(d_socket,SIGNAL(readyRead()),this,SLOT(readyReadData()));
} }
@ -34,9 +31,6 @@ RDJsonFramer::RDJsonFramer(QTcpSocket *in_sock,QObject *parent)
RDJsonFramer::RDJsonFramer(QObject *parent) RDJsonFramer::RDJsonFramer(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
d_escaped=false;
d_quoted=false;
d_level=0;
d_socket=NULL; d_socket=NULL;
} }
@ -57,54 +51,13 @@ QByteArray RDJsonFramer::currentDocument() const
void RDJsonFramer::write(const QByteArray &data) void RDJsonFramer::write(const QByteArray &data)
{ {
for(int i=0;i<data.size();i++) { d_current_document=data;
QChar c=data.at(i); emit documentReceived(d_current_document);
d_data+=c;
if((c.cell()=='\\')&&(!d_escaped)) {
d_escaped=true;
}
else {
switch(c.cell()) {
case '{':
if(!d_quoted) {
d_level++;
}
break;
case '}':
if(!d_quoted) {
if(--d_level==0) {
d_current_document=d_data+"\n";
d_escaped=false;
d_quoted=false;
d_level=0;
d_data.clear();
emit documentReceived(d_current_document);
}
}
break;
case '"':
if(!d_escaped) {
d_quoted=!d_quoted;
}
break;
}
d_escaped=false;
}
}
} }
void RDJsonFramer::reset() void RDJsonFramer::reset()
{ {
d_escaped=false;
d_quoted=false;
d_level=0;
d_data.clear();
emit documentReset(); emit documentReset();
} }

View File

@ -46,10 +46,6 @@ class RDJsonFramer : public QObject
void readyReadData(); void readyReadData();
private: private:
QByteArray d_data;
bool d_escaped;
bool d_quoted;
int d_level;
QByteArray d_current_document; QByteArray d_current_document;
QTcpSocket *d_socket; QTcpSocket *d_socket;
}; };

View File

@ -77,7 +77,7 @@ bool RDUnixServer::listenToPathname(const QString &pathname)
{ {
struct sockaddr_un sa; struct sockaddr_un sa;
if((unix_socket=socket(AF_UNIX,SOCK_STREAM,0))<0) { if((unix_socket=socket(AF_UNIX,SOCK_SEQPACKET,0))<0) {
unix_error_string=QString("unable to create socket")+" ["+ unix_error_string=QString("unable to create socket")+" ["+
QString(strerror(errno))+"]"; QString(strerror(errno))+"]";
return false; return false;
@ -108,7 +108,7 @@ bool RDUnixServer::listenToAbstract(const QString &addr)
{ {
struct sockaddr_un sa; struct sockaddr_un sa;
if((unix_socket=socket(AF_UNIX,SOCK_STREAM,0))<0) { if((unix_socket=socket(AF_UNIX,SOCK_SEQPACKET,0))<0) {
unix_error_string=QString("unable to create socket")+" ["+ unix_error_string=QString("unable to create socket")+" ["+
QString(strerror(errno))+"]"; QString(strerror(errno))+"]";
return false; return false;

View File

@ -43,7 +43,7 @@ bool RDUnixSocket::connectToAbstract(const QString &addr,
int sock; int sock;
struct sockaddr_un sa; struct sockaddr_un sa;
if((sock=::socket(AF_UNIX,SOCK_STREAM,0))<0) { if((sock=::socket(AF_UNIX,SOCK_SEQPACKET,0))<0) {
return false; return false;
} }
memset(&sa,0,sizeof(sa)); memset(&sa,0,sizeof(sa));