[Scummvm-git-logs] scummvm master -> b0d722473b49e27417258f03ee802372f3ee354e

sev- noreply at scummvm.org
Tue Jul 5 13:13:36 UTC 2022


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
acac0a5f27 DIRECTOR: Fix dumping Mac resources
c9d88ac756 COMMON: Do not crash on malformed punycode strings
b84b8ac53c JANITORIAL: Use C++-style comments
b0d722473b COMMON: Process common suffixes for punycoded strings


Commit: acac0a5f27df87fab5f12ae49d931147eca04ced
    https://github.com/scummvm/scummvm/commit/acac0a5f27df87fab5f12ae49d931147eca04ced
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-07-05T14:13:59+02:00

Commit Message:
DIRECTOR: Fix dumping Mac resources

Changed paths:
    engines/director/archive.cpp


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index faa999bae16..bc86695082a 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -307,6 +307,8 @@ void MacArchive::readTags() {
 
 			res.offset = res.size = 0; // unused
 			res.name = _resFork->getResName(tagArray[i], idArray[j]);
+			res.tag = tagArray[i];
+			res.index = idArray[j];
 			debug(3, "Found MacArchive resource '%s' %d: %s", tag2str(tagArray[i]), idArray[j], res.name.c_str());
 			if (ConfMan.getBool("dump_scripts"))
 				dumpChunk(res, out);


Commit: c9d88ac756694274c3495640068d1b00e9e84b00
    https://github.com/scummvm/scummvm/commit/c9d88ac756694274c3495640068d1b00e9e84b00
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-07-05T14:16:55+02:00

Commit Message:
COMMON: Do not crash on malformed punycode strings

Changed paths:
    common/punycode.cpp


diff --git a/common/punycode.cpp b/common/punycode.cpp
index e57296bd07f..fcc137e6d77 100644
--- a/common/punycode.cpp
+++ b/common/punycode.cpp
@@ -253,6 +253,11 @@ U32String punycode_decode(const String &src1) {
 		size_t org_i = i;
 
 		for (size_t w = 1, k = BASE; true; k += BASE) {
+			if (si >= src.size()) {
+				warning("punycode_decode: incorrect digit");
+				return src1;
+			}
+
 			size_t digit = decode_digit(src[si++]);
 
 			if (digit == SMAX) {


Commit: b84b8ac53cbe242bec83c7fc7559e6cf6ccf538c
    https://github.com/scummvm/scummvm/commit/b84b8ac53cbe242bec83c7fc7559e6cf6ccf538c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-07-05T14:21:12+02:00

Commit Message:
JANITORIAL: Use C++-style comments

Changed paths:
    common/punycode.cpp


diff --git a/common/punycode.cpp b/common/punycode.cpp
index fcc137e6d77..cf036692305 100644
--- a/common/punycode.cpp
+++ b/common/punycode.cpp
@@ -48,7 +48,7 @@
 
 namespace Common {
 
-/* punycode parameters, see https://datatracker.ietf.org/doc/html/rfc3492#section-5 */
+// punycode parameters, see https://datatracker.ietf.org/doc/html/rfc3492#section-5
 #define BASE 36
 #define TMIN 1
 #define TMAX 26
@@ -66,7 +66,7 @@ static uint32 adapt_bias(uint32 delta, unsigned n_points, int is_first) {
 	delta /= is_first ? DAMP : 2;
 	delta += delta / n_points;
 
-	/* while delta > 455: delta /= 35 */
+	// while delta > 455: delta /= 35
 	for (k = 0; delta > ((BASE - TMIN) * TMAX) / 2; k += BASE) {
 		delta /= (BASE - TMIN);
 	}
@@ -77,13 +77,13 @@ static uint32 adapt_bias(uint32 delta, unsigned n_points, int is_first) {
 static char encode_digit(int c) {
 	assert(c >= 0 && c <= BASE - TMIN);
 	if (c > 25) {
-		return c + 22; /* '0'..'9' */
+		return c + 22; // '0'..'9'
 	} else {
-		return c + 0x61; /* 'a'..'z' */
+		return c + 0x61; // 'a'..'z'
 	}
 }
 
-/* Encode as a generalized variable-length integer. Returns number of bytes written. */
+// Encode as a generalized variable-length integer. Returns number of bytes written.
 static String encode_var_int(const size_t bias, const size_t delta) {
 	size_t k, q, t;
 	String dst;
@@ -164,7 +164,7 @@ String punycode_encode(const U32String &src) {
 	size_t m;
 
 	for (; h < srclen; n++, delta++) {
-		/* Find next smallest non-basic code point. */
+		// Find next smallest non-basic code point.
 		for (m = SMAX, si = 0; si < srclen; si++) {
 			if (src[si] >= n && src[si] < m) {
 				m = src[si];
@@ -172,7 +172,7 @@ String punycode_encode(const U32String &src) {
 		}
 
 		if ((m - n) > (SMAX - delta) / (h + 1)) {
-			/* OVERFLOW */
+			// OVERFLOW
 			warning("punycode_encode: overflow1");
 			return src;
 		}
@@ -183,7 +183,7 @@ String punycode_encode(const U32String &src) {
 		for (si = 0; si < srclen; si++) {
 			if (src[si] < n) {
 				if (++delta == 0) {
-					/* OVERFLOW */
+					// OVERFLOW
 					warning("punycode_encode: overflow2");
 					return src;
 				}
@@ -196,7 +196,7 @@ String punycode_encode(const U32String &src) {
 		}
 	}
 
-	/* Return how many Unicode code points were converted. */
+	// Return how many Unicode code points were converted.
 	return dst;
 }
 
@@ -225,7 +225,7 @@ U32String punycode_decode(const String &src1) {
 	String src(&src1.c_str()[4]); // Skip the prefix for simplification
 	int srclen = src.size();
 
-	/* Ensure that the input contains only ASCII characters. */
+	// Ensure that the input contains only ASCII characters.
 	for (int si = 0; si < srclen; si++) {
 		if (src[si] & 0x80) {
 			return src1;
@@ -266,7 +266,7 @@ U32String punycode_decode(const String &src1) {
 			}
 
 			if (digit > (SMAX - i) / w) {
-				/* OVERFLOW */
+				// OVERFLOW
 				warning("punycode_decode: overflow1");
 				return src1;
 			}
@@ -287,7 +287,7 @@ U32String punycode_decode(const String &src1) {
 			}
 
 			if (w > SMAX / (BASE - t)) {
-				/* OVERFLOW */
+				// OVERFLOW
 				warning("punycode_decode: overflow2");
 				return src1;
 			}
@@ -298,7 +298,7 @@ U32String punycode_decode(const String &src1) {
 		bias = adapt_bias(i - org_i, di + 1, org_i == 0);
 
 		if (i / (di + 1) > SMAX - n) {
-			/* OVERFLOW */
+			// OVERFLOW
 				warning("punycode_decode: overflow3");
 			return src1;
 		}


Commit: b0d722473b49e27417258f03ee802372f3ee354e
    https://github.com/scummvm/scummvm/commit/b0d722473b49e27417258f03ee802372f3ee354e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-07-05T15:13:08+02:00

Commit Message:
COMMON: Process common suffixes for punycoded strings

Changed paths:
    common/punycode.cpp


diff --git a/common/punycode.cpp b/common/punycode.cpp
index cf036692305..6b6fc3d8366 100644
--- a/common/punycode.cpp
+++ b/common/punycode.cpp
@@ -234,6 +234,54 @@ U32String punycode_decode(const String &src1) {
 
 	size_t di = src.findLastOf('-');
 
+	Common::String tail;
+
+	// Sometimes strings could contain garbage at the end, like '.zip' added
+	// We try to detect these tails and keep it as is
+
+	// First, try to chop off any extensions
+	size_t dotPos = src.findLastOf('.');
+
+	while (dotPos != String::npos && dotPos > di) {
+		tail = String(src.c_str() + dotPos) + tail;
+		src = String(src.c_str(), dotPos);
+		srclen = src.size();
+
+		dotPos = src.findLastOf('.');
+
+		debug(9, "punycode_decode: src is: '%s', tail is: '%s'", src.c_str(), tail.c_str());
+	}
+
+	// And now scan for the illegal characters as a whole
+	while (di != 0) {
+		bool noncode = false;
+
+		// Scan string to the end for illegal characters
+		for (size_t i = di + 1; i < srclen; i++) {
+			if (!((src[i] >= '0' && src[i] <= '9') || (src[i] >= 'a' && src[i] <= 'z'))) {
+				noncode = true;
+				break;
+			}
+		}
+
+		if (noncode) {
+			tail = String(src.c_str() + di) + tail;
+			src = String(src.c_str(), di);
+			srclen = src.size();
+
+			debug(9, "punycode_decode: src is: '%s', tail is: '%s'", src.c_str(), tail.c_str());
+
+			di = src.findLastOf('-');
+
+			if (di == String::npos) {
+				warning("punycode_decode: malformed string");
+				return src1;
+			}
+		} else {
+			break;
+		}
+	}
+
 	// If we have no '-', the entire string is non-ASCII character insertions.
 	if (di == String::npos)
 		di = 0;
@@ -313,6 +361,11 @@ U32String punycode_decode(const String &src1) {
 		i++;
 	}
 
+	// If we chopped off tail, readd it here
+	dst += tail;
+
+	debug(9, "punycode_decode: returning %s", Common::U32String(dst).encode().c_str());
+
 	return dst;
 }
 




More information about the Scummvm-git-logs mailing list