summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorTimothy Pearson <[email protected]>2013-03-21 16:21:25 -0500
committerTimothy Pearson <[email protected]>2013-03-21 16:21:25 -0500
commitf5b03149e8e68e510efe9842d85a058b42a51264 (patch)
tree49c476a64e7377ecf25a949a9116fc7bf89c4cf5 /src/tools
parent1b0a52a0c1285bf6237aac3fbd99eaebeca5663a (diff)
downloadtqt3-f5b03149e8e68e510efe9842d85a058b42a51264.tar.gz
tqt3-f5b03149e8e68e510efe9842d85a058b42a51264.zip
Automated update from Qt3
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/ntqstring.h14
-rw-r--r--src/tools/qstring.cpp79
2 files changed, 87 insertions, 6 deletions
diff --git a/src/tools/ntqstring.h b/src/tools/ntqstring.h
index 29704e719..b91caf83c 100644
--- a/src/tools/ntqstring.h
+++ b/src/tools/ntqstring.h
@@ -360,11 +360,10 @@ inline bool operator>( TQChar c1, TQChar c2 ) { return !(c2>=c1); }
// internal
struct Q_EXPORT TQStringData : public TQShared {
TQStringData() :
- TQShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); }
+ TQShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE), security_unpaged(FALSE) { ref(); }
TQStringData(TQChar *u, uint l, uint m) :
- TQShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { }
- ~TQStringData() { if ( unicode ) delete[] ((char*)unicode);
- if ( ascii ) delete[] ascii; }
+ TQShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE), security_unpaged(FALSE) { }
+ ~TQStringData();
void deleteSelf();
TQChar *unicode;
@@ -389,6 +388,8 @@ struct Q_EXPORT TQStringData : public TQShared {
#endif
uint islatin1 : 1;
+ bool security_unpaged : 1;
+
private:
#if defined(TQ_DISABLE_COPY)
TQStringData( const TQStringData& );
@@ -750,7 +751,12 @@ private:
// needed for TQDeepCopy
void detach();
+
+ void setSecurityUnPaged(bool lock);
+ static char* unicodeToLatin1( const TQChar*, uint len, bool unpaged );
+
friend class TQDeepCopy<TQString>;
+ friend class TQLineEdit;
};
class Q_EXPORT TQCharRef {
diff --git a/src/tools/qstring.cpp b/src/tools/qstring.cpp
index 86ba42469..878f3e60f 100644
--- a/src/tools/qstring.cpp
+++ b/src/tools/qstring.cpp
@@ -65,10 +65,18 @@
#if defined(Q_WS_WIN)
#include "qt_windows.h"
#endif
+#if defined(Q_OS_LINUX)
+#include <sys/mman.h>
+#endif
#if !defined( QT_NO_COMPONENT ) && !defined( QT_LITE_COMPONENT )
#include "ntqcleanuphandler.h"
#endif
+#if defined(Q_OS_LINUX)
+#define LINUX_MEMLOCK_LIMIT_BYTES 16384
+#define LINUX_MEMLOCK_LIMIT_CHARACTERS LINUX_MEMLOCK_LIMIT_BYTES/sizeof(TQChar)
+#endif
+
#ifndef LLONG_MAX
#define LLONG_MAX TQ_INT64_C(9223372036854775807)
#endif
@@ -1025,6 +1033,14 @@ static inline bool format(TQChar::Decomposition tag, TQString & str,
} // format()
#endif
+TQStringData::~TQStringData() {
+ if ( unicode ) delete[] ((char*)unicode);
+ if ( ascii && security_unpaged ) {
+ munlock(ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+ }
+ if ( ascii ) delete[] ascii;
+}
+
/*
TQString::compose() and visual() were developed by Gordon Tisher
<[email protected]>, with input from Lars Knoll <[email protected]>,
@@ -1203,19 +1219,34 @@ static TQChar* internalLatin1ToUnicode( const char *str, uint* len,
}
/*!
+ ABI compatibility
+*/
+
+char* TQString::unicodeToLatin1(const TQChar *uc, uint l)
+{
+ return unicodeToLatin1(uc, l, false);
+}
+
+/*!
This utility function converts \a l 16-bit characters from \a uc
to ASCII, returning a '\0'-terminated string.
The caller is responsible for deleting the resultant string with
delete[].
*/
-char* TQString::unicodeToLatin1(const TQChar *uc, uint l)
+
+char* TQString::unicodeToLatin1(const TQChar *uc, uint l, bool unpaged)
{
if (!uc) {
return 0;
}
char *a = new char[l+1];
char *result = a;
+ if (unpaged) {
+#if defined(Q_OS_LINUX)
+ mlock(result, LINUX_MEMLOCK_LIMIT_BYTES);
+#endif
+ }
while (l--) {
*a++ = (uc->unicode() > 0xff) ? '?' : (char)uc->unicode();
uc++;
@@ -1707,8 +1738,10 @@ void TQString::setLength( uint newLen )
if ( nd ) {
uint len = TQMIN( d->len, newLen );
memcpy( nd, d->unicode, sizeof(TQChar) * len );
+ bool unpaged = d->security_unpaged;
deref();
d = new TQStringData( nd, newLen, newMax );
+ setSecurityUnPaged(unpaged);
}
} else {
d->len = newLen;
@@ -1760,8 +1793,10 @@ void TQString::reserve( uint minCapacity )
uint len = d->len;
if ( len )
memcpy( nd, d->unicode, sizeof(TQChar) * len );
+ bool unpaged = d->security_unpaged;
deref();
d = new TQStringData( nd, len, minCapacity );
+ setSecurityUnPaged(unpaged);
}
}
}
@@ -1780,8 +1815,10 @@ void TQString::squeeze()
uint len = d->len;
if ( len )
memcpy( nd, d->unicode, sizeof(TQChar) * len );
+ bool unpaged = d->security_unpaged;
deref();
d = new TQStringData( nd, len, len );
+ setSecurityUnPaged(unpaged);
}
}
}
@@ -2744,9 +2781,11 @@ TQString& TQString::fill( TQChar c, int len )
if ( len == 0 ) {
*this = "";
} else {
+ bool unpaged = d->security_unpaged;
deref();
TQChar * nd = QT_ALLOC_QCHAR_VEC( len );
d = new TQStringData(nd,len,len);
+ setSecurityUnPaged(unpaged);
while (len--) *nd++ = c;
}
return *this;
@@ -5678,8 +5717,15 @@ TQString &TQString::operator+=( char c )
const char* TQString::latin1() const
{
if ( !d->ascii || !d->islatin1 ) {
+ if (d->security_unpaged) {
+#if defined(Q_OS_LINUX)
+ if (d->ascii) {
+ munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+ }
+#endif
+ }
delete [] d->ascii;
- d->ascii = unicodeToLatin1( d->unicode, d->len );
+ d->ascii = unicodeToLatin1( d->unicode, d->len, d->security_unpaged );
d->islatin1 = TRUE;
}
return d->ascii;
@@ -5699,10 +5745,22 @@ const char* TQString::ascii() const
#ifndef QT_NO_TEXTCODEC
if ( TQTextCodec::codecForCStrings() ) {
if ( !d->ascii || d->islatin1 ) {
+ if (d->security_unpaged) {
+#if defined(Q_OS_LINUX)
+ if (d->ascii) {
+ munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+ }
+#endif
+ }
delete [] d->ascii;
if (d->unicode) {
TQCString s = TQTextCodec::codecForCStrings()->fromUnicode( *this );
d->ascii = new char[s.length() + 1];
+ if (d->security_unpaged) {
+#if defined(Q_OS_LINUX)
+ mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+#endif
+ }
memcpy(d->ascii, s.data(), s.length() + 1);
} else {
d->ascii = 0;
@@ -5715,6 +5773,23 @@ const char* TQString::ascii() const
return latin1();
}
+void TQString::setSecurityUnPaged(bool lock) {
+ if (lock != d->security_unpaged) {
+ if (d->security_unpaged) {
+ if (d->ascii) {
+ munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+ }
+ d->security_unpaged = false;
+ }
+ else {
+ if (d->ascii) {
+ mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
+ }
+ d->security_unpaged = true;
+ }
+ }
+}
+
/*!
Returns the string encoded in UTF-8 format.