mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Instead of a constant or a macro for the maximum number of 'ws_info' elements the 100 literal was used. Define MAX_WS_INFO in dive.h and use it everywhere. Also clamp loops that iterate `ws_info' to MAX_WS_INFO. Prevents potential out-of-bounds reading, similarly to the previous commit about 'tank_info'. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include "qt-models/weightsysteminfomodel.h"
 | |
| #include "core/dive.h"
 | |
| #include "core/metrics.h"
 | |
| #include "core/gettextfromc.h"
 | |
| 
 | |
| WSInfoModel *WSInfoModel::instance()
 | |
| {
 | |
| 	static WSInfoModel self;
 | |
| 	return &self;
 | |
| }
 | |
| 
 | |
| bool WSInfoModel::insertRows(int, int count, const QModelIndex &parent)
 | |
| {
 | |
| 	beginInsertRows(parent, rowCount(), rowCount());
 | |
| 	rows += count;
 | |
| 	endInsertRows();
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| bool WSInfoModel::setData(const QModelIndex &index, const QVariant &value, int)
 | |
| {
 | |
| 	//WARN: check for Qt::EditRole
 | |
| 	struct ws_info_t *info = &ws_info[index.row()];
 | |
| 	switch (index.column()) {
 | |
| 	case DESCRIPTION:
 | |
| 		info->name = strdup(value.toByteArray().data());
 | |
| 		break;
 | |
| 	case GR:
 | |
| 		info->grams = value.toInt();
 | |
| 		break;
 | |
| 	}
 | |
| 	emit dataChanged(index, index);
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| void WSInfoModel::clear()
 | |
| {
 | |
| }
 | |
| 
 | |
| QVariant WSInfoModel::data(const QModelIndex &index, int role) const
 | |
| {
 | |
| 	QVariant ret;
 | |
| 	if (!index.isValid()) {
 | |
| 		return ret;
 | |
| 	}
 | |
| 	struct ws_info_t *info = &ws_info[index.row()];
 | |
| 
 | |
| 	int gr = info->grams;
 | |
| 	switch (role) {
 | |
| 	case Qt::FontRole:
 | |
| 		ret = defaultModelFont();
 | |
| 		break;
 | |
| 	case Qt::DisplayRole:
 | |
| 	case Qt::EditRole:
 | |
| 		switch (index.column()) {
 | |
| 		case GR:
 | |
| 			ret = gr;
 | |
| 			break;
 | |
| 		case DESCRIPTION:
 | |
| 			ret = gettextFromC::tr(info->name);
 | |
| 			break;
 | |
| 		}
 | |
| 		break;
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| int WSInfoModel::rowCount(const QModelIndex&) const
 | |
| {
 | |
| 	return rows + 1;
 | |
| }
 | |
| 
 | |
| const QString &WSInfoModel::biggerString() const
 | |
| {
 | |
| 	return biggerEntry;
 | |
| }
 | |
| 
 | |
| WSInfoModel::WSInfoModel() : rows(-1)
 | |
| {
 | |
| 	setHeaderDataStrings(QStringList() << tr("Description") << tr("kg"));
 | |
| 	struct ws_info_t *info;
 | |
| 	for (info = ws_info; info->name && info < ws_info + MAX_WS_INFO; info++, rows++) {
 | |
| 		QString wsInfoName = gettextFromC::tr(info->name);
 | |
| 		if (wsInfoName.count() > biggerEntry.count())
 | |
| 			biggerEntry = wsInfoName;
 | |
| 	}
 | |
| 
 | |
| 	if (rows > -1) {
 | |
| 		beginInsertRows(QModelIndex(), 0, rows);
 | |
| 		endInsertRows();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void WSInfoModel::updateInfo()
 | |
| {
 | |
| 	struct ws_info_t *info;
 | |
| 	beginRemoveRows(QModelIndex(), 0, this->rows);
 | |
| 	endRemoveRows();
 | |
| 	rows = -1;
 | |
| 	for (info = ws_info; info->name && info < ws_info + MAX_WS_INFO; info++, rows++) {
 | |
| 		QString wsInfoName = gettextFromC::tr(info->name);
 | |
| 		if (wsInfoName.count() > biggerEntry.count())
 | |
| 			biggerEntry = wsInfoName;
 | |
| 	}
 | |
| 
 | |
| 	if (rows > -1) {
 | |
| 		beginInsertRows(QModelIndex(), 0, rows);
 | |
| 		endInsertRows();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void WSInfoModel::update()
 | |
| {
 | |
| 	if (rows > -1) {
 | |
| 		beginRemoveRows(QModelIndex(), 0, rows);
 | |
| 		endRemoveRows();
 | |
| 		rows = -1;
 | |
| 	}
 | |
| 	struct ws_info_t *info;
 | |
| 	for (info = ws_info; info->name && info < ws_info + MAX_WS_INFO; info++, rows++);
 | |
| 
 | |
| 	if (rows > -1) {
 | |
| 		beginInsertRows(QModelIndex(), 0, rows);
 | |
| 		endInsertRows();
 | |
| 	}
 | |
| }
 |