* Fix a crash if `kDNSServiceErr_Invalid` is returned by `TXTRecordSetValue` which occured because the `%@` was being used for a C string
authorEvan Schoenberg
Sun Nov 22 09:58:41 2009 -0600 (8 months ago)
changeset 293061a5bc1a37d6
parent 2929 5616a54b1173
child 2931 4f11c157f88b
* 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
Plugins/Bonjour/libezv/Private Classes/AWEzvRendezvousData.m
     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