* Fix a crash if `kDNSServiceErr_Invalid` is returned by `TXTRecordSetValue` which occured because the `%@` was being used for a C string
* Handle the situation which caused `kDNSServiceErr_Invalid` to be returned by `TXTRecordSetValue` if setting a long status message (≥ 250 characters) by truncating appropriately.
Fixes #11322
1.1 --- a/Plugins/Bonjour/libezv/Private Classes/AWEzvRendezvousData.m Sat Nov 21 20:07:58 2009 -0600
1.2 +++ b/Plugins/Bonjour/libezv/Private Classes/AWEzvRendezvousData.m Sun Nov 22 09:58:41 2009 -0600
1.3 @@ -32,6 +32,7 @@
1.4
1.5 #import "AWEzvRendezvousData.h"
1.6 #import "AWEzvSupportRoutines.h"
1.7 +#import <AIUtilities/AIStringAdditions.h>
1.8
1.9 @implementation AWEzvRendezvousData
1.10
1.11 @@ -509,9 +510,48 @@
1.12 /* TXTRecord */ &txtRecord,
1.13 /* key */ [key UTF8String],
1.14 /* size, may be zero */ valueSize,
1.15 - /* value, may be null */ valueToSet /* may be NULL */);
1.16 + /* value, may be null */ valueToSet);
1.17 +
1.18 + if ((txtRecordError == kDNSServiceErr_Invalid) &&
1.19 + [value isKindOfClass:[NSString class]]) {
1.20 + /* kDNSServiceErr_Invalid may be returned if:
1.21 + * 1. Invalid characters were included (per documentation)
1.22 + * 2. The length of the value is >= 250 characters (at least for the msg key)
1.23 + *
1.24 + * So: First, try stripping out any non-ASCII characters, as I'm not sure what might consitute an
1.25 + * "illegal character" in a field which requests UTF8.
1.26 + *
1.27 + * Then, if that still fails, truncate the string to 248 characters (248,249,250 are the ellipsis).
1.28 + */
1.29 + valueToSet = [[value dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] bytes];
1.30 + valueSize = strlen(valueToSet);
1.31 +
1.32 + txtRecordError = TXTRecordSetValue (
1.33 + /* TXTRecord */ &txtRecord,
1.34 + /* key */ [key UTF8String],
1.35 + /* size, may be zero */ valueSize,
1.36 + /* value, may be null */ valueToSet);
1.37 +
1.38 + if (txtRecordError == kDNSServiceErr_Invalid) {
1.39 + valueToSet = [[value stringWithEllipsisByTruncatingToLength:248] UTF8String];
1.40 + valueSize = strlen(valueToSet);
1.41 + txtRecordError = TXTRecordSetValue (
1.42 + /* TXTRecord */ &txtRecord,
1.43 + /* key */ [key UTF8String],
1.44 + /* size, may be zero */ valueSize,
1.45 + /* value, may be null */ valueToSet);
1.46 + }
1.47 + }
1.48 +
1.49 if (txtRecordError != kDNSServiceErr_NoError) {
1.50 - AWEzvLog(@"Error setting TXTRecord of key=%@ and value=%@", key, valueToSet);
1.51 + if (txtRecordError == kDNSServiceErr_Invalid) {
1.52 + AWEzvLog(@"Error setting TXTRecord of key=%@ and value=%s: Value contains illegal characters", key, valueToSet);
1.53 +
1.54 + } else if (txtRecordError == kDNSServiceErr_NoMemory) {
1.55 + AWEzvLog(@"Error setting TXTRecord of key=%@ and value=%s: Exceeded available storage", key, valueToSet);
1.56 + } else {
1.57 + AWEzvLog(@"Error setting TXTRecord of key=%@ and value=%s: Error is %i", key, valueToSet, txtRecordError);
1.58 + }
1.59
1.60 }
1.61