ObjFW  Check-in [49ed0fa5ec]

Overview
Comment:Key Value Coding: Make sure free is always called

In theory, if -[UTF8String] would throw, this could leak.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 49ed0fa5ec301f4a1120f2e848734868d9d34c505e1f95e84204bfb7665a6262
User & Date: js on 2016-06-05 16:04:11
Other Links: manifest | tags
Context
2016-06-05
17:28
Update Xcode project to recent changes (check-in: 111c2e14b8 user: js tags: trunk)
16:04
Key Value Coding: Make sure free is always called (check-in: 49ed0fa5ec user: js tags: trunk)
16:00
Key Value Coding: Add fallback to isFoo (check-in: 10fbb20fd6 user: js tags: trunk)
Changes

Modified src/OFObject+KeyValueCoding.m from [f4fafd457a] to [6d4c66aa16].

55
56
57
58
59
60
61

62
63
64
65
66
67
68
69

70

71
72
73
74
75
76
77
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77
78
79







+







-
+

+







		if ((keyLength = [key UTF8StringLength]) < 1)
			return [self valueForUndefinedKey: key];

		if ((name = malloc(keyLength + 3)) == NULL)
			@throw [OFOutOfMemoryException
			    exceptionWithRequestedSize: keyLength + 3];

		@try {
		memcpy(name, "is", 2);
		memcpy(name + 2, [key UTF8String], keyLength);
		name[keyLength + 2] = '\0';

		name[2] = toupper(name[2]);

		selector = sel_registerName(name);

		} @finally {
		free(name);
		}

		typeEncoding = [self typeEncodingForSelector: selector];

		if (typeEncoding == NULL ||
		    *typeEncoding == '@' || *typeEncoding == '#')
			return [self valueForUndefinedKey: key];
	}
135
136
137
138
139
140
141

142
143
144
145
146
147
148
149

150

151
152
153
154
155
156
157
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

152
153
154
155
156
157
158
159
160
161







+







-
+

+







		return;
	}

	if ((name = malloc(keyLength + 5)) == NULL)
		@throw [OFOutOfMemoryException
		    exceptionWithRequestedSize: keyLength + 5];

	@try {
	memcpy(name, "set", 3);
	memcpy(name + 3, [key UTF8String], keyLength);
	memcpy(name + keyLength + 3, ":", 2);

	name[3] = toupper(name[3]);

	selector = sel_registerName(name);

	} @finally {
	free(name);
	}

	typeEncoding = [self typeEncodingForSelector: selector];

	if (typeEncoding == NULL || nextType(&typeEncoding) != 'v' ||
	    nextType(&typeEncoding) != '@' || nextType(&typeEncoding) != ':') {
		[self    setValue: value
		  forUndefinedKey: key];