Commit 77f6b92c authored by hengli's avatar hengli

Added mutexes to prevent malformed protobuf data.

parent dba8b932
...@@ -1031,25 +1031,33 @@ void UAS::receiveExtendedMessage(LinkInterface* link, std::tr1::shared_ptr<googl ...@@ -1031,25 +1031,33 @@ void UAS::receiveExtendedMessage(LinkInterface* link, std::tr1::shared_ptr<googl
if (message->GetTypeName() == pointCloud.GetTypeName()) if (message->GetTypeName() == pointCloud.GetTypeName())
{ {
receivedPointCloudTimestamp = QGC::groundTimeSeconds(); receivedPointCloudTimestamp = QGC::groundTimeSeconds();
pointCloudMutex.lock();
pointCloud.CopyFrom(*message); pointCloud.CopyFrom(*message);
pointCloudMutex.unlock();
emit pointCloudChanged(this); emit pointCloudChanged(this);
} }
else if (message->GetTypeName() == rgbdImage.GetTypeName()) else if (message->GetTypeName() == rgbdImage.GetTypeName())
{ {
receivedRGBDImageTimestamp = QGC::groundTimeSeconds(); receivedRGBDImageTimestamp = QGC::groundTimeSeconds();
rgbdImageMutex.lock();
rgbdImage.CopyFrom(*message); rgbdImage.CopyFrom(*message);
rgbdImageMutex.unlock();
emit rgbdImageChanged(this); emit rgbdImageChanged(this);
} }
else if (message->GetTypeName() == obstacleList.GetTypeName()) else if (message->GetTypeName() == obstacleList.GetTypeName())
{ {
receivedObstacleListTimestamp = QGC::groundTimeSeconds(); receivedObstacleListTimestamp = QGC::groundTimeSeconds();
obstacleListMutex.lock();
obstacleList.CopyFrom(*message); obstacleList.CopyFrom(*message);
obstacleListMutex.unlock();
emit obstacleListChanged(this); emit obstacleListChanged(this);
} }
else if (message->GetTypeName() == path.GetTypeName()) else if (message->GetTypeName() == path.GetTypeName())
{ {
receivedPathTimestamp = QGC::groundTimeSeconds(); receivedPathTimestamp = QGC::groundTimeSeconds();
pathMutex.lock();
path.CopyFrom(*message); path.CopyFrom(*message);
pathMutex.unlock();
emit pathChanged(this); emit pathChanged(this);
} }
} }
......
...@@ -135,39 +135,47 @@ public: ...@@ -135,39 +135,47 @@ public:
bool getSelected() const; bool getSelected() const;
#ifdef QGC_PROTOBUF_ENABLED #ifdef QGC_PROTOBUF_ENABLED
px::PointCloudXYZRGB getPointCloud() const { px::PointCloudXYZRGB getPointCloud() {
QMutexLocker locker(&pointCloudMutex);
return pointCloud; return pointCloud;
} }
px::PointCloudXYZRGB getPointCloud(qreal& receivedTimestamp) const { px::PointCloudXYZRGB getPointCloud(qreal& receivedTimestamp) {
receivedTimestamp = receivedPointCloudTimestamp; receivedTimestamp = receivedPointCloudTimestamp;
QMutexLocker locker(&pointCloudMutex);
return pointCloud; return pointCloud;
} }
px::RGBDImage getRGBDImage() const { px::RGBDImage getRGBDImage() {
QMutexLocker locker(&rgbdImageMutex);
return rgbdImage; return rgbdImage;
} }
px::RGBDImage getRGBDImage(qreal& receivedTimestamp) const { px::RGBDImage getRGBDImage(qreal& receivedTimestamp) {
receivedTimestamp = receivedRGBDImageTimestamp; receivedTimestamp = receivedRGBDImageTimestamp;
QMutexLocker locker(&rgbdImageMutex);
return rgbdImage; return rgbdImage;
} }
px::ObstacleList getObstacleList() const { px::ObstacleList getObstacleList() {
QMutexLocker locker(&obstacleListMutex);
return obstacleList; return obstacleList;
} }
px::ObstacleList getObstacleList(qreal& receivedTimestamp) const { px::ObstacleList getObstacleList(qreal& receivedTimestamp) {
receivedTimestamp = receivedObstacleListTimestamp; receivedTimestamp = receivedObstacleListTimestamp;
QMutexLocker locker(&obstacleListMutex);
return obstacleList; return obstacleList;
} }
px::Path getPath() const { px::Path getPath() {
QMutexLocker locker(&pathMutex);
return path; return path;
} }
px::Path getPath(qreal& receivedTimestamp) const { px::Path getPath(qreal& receivedTimestamp) {
receivedTimestamp = receivedPathTimestamp; receivedTimestamp = receivedPathTimestamp;
QMutexLocker locker(&pathMutex);
return path; return path;
} }
#endif #endif
...@@ -257,15 +265,19 @@ protected: //COMMENTS FOR TEST UNIT ...@@ -257,15 +265,19 @@ protected: //COMMENTS FOR TEST UNIT
#ifdef QGC_PROTOBUF_ENABLED #ifdef QGC_PROTOBUF_ENABLED
px::PointCloudXYZRGB pointCloud; px::PointCloudXYZRGB pointCloud;
QMutex pointCloudMutex;
qreal receivedPointCloudTimestamp; qreal receivedPointCloudTimestamp;
px::RGBDImage rgbdImage; px::RGBDImage rgbdImage;
QMutex rgbdImageMutex;
qreal receivedRGBDImageTimestamp; qreal receivedRGBDImageTimestamp;
px::ObstacleList obstacleList; px::ObstacleList obstacleList;
QMutex obstacleListMutex;
qreal receivedObstacleListTimestamp; qreal receivedObstacleListTimestamp;
px::Path path; px::Path path;
QMutex pathMutex;
qreal receivedPathTimestamp; qreal receivedPathTimestamp;
#endif #endif
......
...@@ -95,14 +95,14 @@ public: ...@@ -95,14 +95,14 @@ public:
virtual bool getSelected() const = 0; virtual bool getSelected() const = 0;
#ifdef QGC_PROTOBUF_ENABLED #ifdef QGC_PROTOBUF_ENABLED
virtual px::PointCloudXYZRGB getPointCloud() const = 0; virtual px::PointCloudXYZRGB getPointCloud() = 0;
virtual px::PointCloudXYZRGB getPointCloud(qreal& receivedTimestamp) const = 0; virtual px::PointCloudXYZRGB getPointCloud(qreal& receivedTimestamp) = 0;
virtual px::RGBDImage getRGBDImage() const = 0; virtual px::RGBDImage getRGBDImage() = 0;
virtual px::RGBDImage getRGBDImage(qreal& receivedTimestamp) const = 0; virtual px::RGBDImage getRGBDImage(qreal& receivedTimestamp) = 0;
virtual px::ObstacleList getObstacleList() const = 0; virtual px::ObstacleList getObstacleList() = 0;
virtual px::ObstacleList getObstacleList(qreal& receivedTimestamp) const = 0; virtual px::ObstacleList getObstacleList(qreal& receivedTimestamp) = 0;
virtual px::Path getPath() const = 0; virtual px::Path getPath() = 0;
virtual px::Path getPath(qreal& receivedTimestamp) const = 0; virtual px::Path getPath(qreal& receivedTimestamp) = 0;
#endif #endif
virtual bool isArmed() const = 0; virtual bool isArmed() const = 0;
......
...@@ -52,7 +52,6 @@ void QGCRGBDView::clearData(void) ...@@ -52,7 +52,6 @@ void QGCRGBDView::clearData(void)
qDebug() << offlineImg.load(":/images/status/colorbars.png"); qDebug() << offlineImg.load(":/images/status/colorbars.png");
glImage = QGLWidget::convertToGLFormat(offlineImg); glImage = QGLWidget::convertToGLFormat(offlineImg);
qDebug() << "cleardata" << offlineImg.isNull() << offlineImg.width() << offlineImg.height();
} }
void QGCRGBDView::contextMenuEvent(QContextMenuEvent* event) void QGCRGBDView::contextMenuEvent(QContextMenuEvent* event)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment