mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Each preferences object owns its string members. In three cases, pointers were copied instead of strings, leading to (in the best case) dangling pointers if the user edited values: 1) In the GET_TXT macro in core/prefs-macros.h 2) In the PreferencesDialog::defaultsRequested() method 3) In main() of the mobile version This patch fixes these issues, by using copy_string() or copy_prefs() as appropriate. The only reason that the old code didn't crash regularly is that the default_prefs object was only used at startup and defaultsRequested() is (at the moment?) dead code. This patch also aligns the backslashes in core/pref.h and fixes a typo. The declaration of copy_prefs() is moved to the core/prefs.h header. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #ifndef PREFSMACROS_H
 | |
| #define PREFSMACROS_H
 | |
| 
 | |
| #define SB(V, B) s.setValue(V, (int)(B->isChecked() ? 1 : 0))
 | |
| 
 | |
| #define GET_UNIT(name, field, f, t)                                 \
 | |
| 	v = s.value(QString(name));                                 \
 | |
| 	if (v.isValid())                                            \
 | |
| 		prefs.units.field = (v.toInt() == (t)) ? (t) : (f); \
 | |
| 	else                                                        \
 | |
| 		prefs.units.field = default_prefs.units.field
 | |
| 
 | |
| #define GET_UNIT3(name, field, f, l, type)                          \
 | |
| 	v = s.value(QString(name));                                 \
 | |
| 	if (v.isValid() && v.toInt() >= (f) && v.toInt() <= (l))    \
 | |
| 		prefs.units.field = (type)v.toInt();                \
 | |
| 	else                                                        \
 | |
| 		prefs.units.field = default_prefs.units.field
 | |
| 
 | |
| #define GET_UNIT_BOOL(name, field)                      \
 | |
| 	v = s.value(QString(name));                     \
 | |
| 	if (v.isValid())                                \
 | |
| 		prefs.units.field = v.toBool();         \
 | |
| 	else                                            \
 | |
| 		prefs.units.field = default_prefs.units.field
 | |
| 
 | |
| #define GET_BOOL(name, field)                           \
 | |
| 	v = s.value(QString(name));                     \
 | |
| 	if (v.isValid())                                \
 | |
| 		prefs.field = v.toBool();               \
 | |
| 	else                                            \
 | |
| 		prefs.field = default_prefs.field
 | |
| 
 | |
| #define GET_DOUBLE(name, field)             \
 | |
| 	v = s.value(QString(name));         \
 | |
| 	if (v.isValid())                    \
 | |
| 		prefs.field = v.toDouble(); \
 | |
| 	else                                \
 | |
| 		prefs.field = default_prefs.field
 | |
| 
 | |
| #define GET_INT(name, field)             \
 | |
| 	v = s.value(QString(name));      \
 | |
| 	if (v.isValid())                 \
 | |
| 		prefs.field = v.toInt(); \
 | |
| 	else                             \
 | |
| 		prefs.field = default_prefs.field
 | |
| 
 | |
| #define GET_ENUM(name, type, field)                 \
 | |
| 	v = s.value(QString(name));                 \
 | |
| 	if (v.isValid())                            \
 | |
| 		prefs.field = (enum type)v.toInt(); \
 | |
| 	else                                        \
 | |
| 		prefs.field = default_prefs.field
 | |
| 
 | |
| #define GET_INT_DEF(name, field, defval)                                 \
 | |
| 	v = s.value(QString(name));                                      \
 | |
| 	if (v.isValid())                                                 \
 | |
| 		prefs.field = v.toInt();                                 \
 | |
| 	else                                                             \
 | |
| 		prefs.field = defval
 | |
| 
 | |
| #define GET_TXT(name, field)                                             \
 | |
| 	v = s.value(QString(name));                                      \
 | |
| 	if (v.isValid())                                                 \
 | |
| 		prefs.field = strdup(v.toString().toUtf8().constData()); \
 | |
| 	else                                                             \
 | |
| 		prefs.field = copy_string(default_prefs.field)
 | |
| 
 | |
| #define SAVE_OR_REMOVE_SPECIAL(_setting, _default, _compare, _value)     \
 | |
| 	if (_compare != _default)                                        \
 | |
| 		s.setValue(_setting, _value);                            \
 | |
| 	else                                                             \
 | |
| 		s.remove(_setting)
 | |
| 
 | |
| #define SAVE_OR_REMOVE(_setting, _default, _value)                       \
 | |
| 	if (_value != _default)                                          \
 | |
| 		s.setValue(_setting, _value);                            \
 | |
| 	else                                                             \
 | |
| 		s.remove(_setting)
 | |
| 
 | |
| #endif // PREFSMACROS_H
 | |
| 
 |