ObjFW  Check-in [f60e4012b7]

Overview
Comment:Randomize hashes.

This prevents DoSing hashtables by creating conflicts deliberately.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: f60e4012b7a099f0c724219d82e77a29e0e06c37f80854fa06a0d8b154b21ca3
User & Date: js on 2012-12-04 09:19:58
Other Links: manifest | tags
Context
2012-12-04
09:59
Add a per-hashtable seed. check-in: 590fa6ed79 user: js tags: trunk
09:19
Randomize hashes. check-in: f60e4012b7 user: js tags: trunk
2012-12-03
01:17
OFXMLParser: Add configurable depth limit. check-in: ed4e64fd32 user: js tags: trunk
Changes

Modified configure.ac from [f33cdcae46] to [a9440db0fe].

393
394
395
396
397
398
399








400
401
402
403
404
405
406
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414







+
+
+
+
+
+
+
+







			ac_cv_snprintf_useful_ret="no"
		])
	])
	AC_MSG_RESULT($ac_cv_snprintf_useful_ret)
])
test x"$have_asprintf" != x"yes" -a x"$ac_cv_snprintf_useful_ret" != x"yes" && \
	AC_MSG_ERROR(No asprintf and no snprintf returning required space!)

AC_CHECK_FUNC(arc4random, [
	AC_DEFINE(OF_HAVE_ARC4RANDOM, 1, [Whether we have arc4random()])
], [
	AC_CHECK_FUNC(random, [
		AC_DEFINE(OF_HAVE_RANDOM, 1, [Whether we have random()])
	])
])

AC_CHECK_LIB(dl, dlopen, LIBS="$LIBS -ldl")

AC_ARG_ENABLE(threads,
	AS_HELP_STRING([--disable-threads], [disable thread support]))
AS_IF([test x"$enable_threads" != x"no"], [
	case "$host_os" in

Modified src/OFObject.h from [710d8a991e] to [c663f1ca8f].

871
872
873
874
875
876
877


878
879
880
881

882
883
884
871
872
873
874
875
876
877
878
879
880
881


882
883
884
885







+
+


-
-
+



@end

#import "OFObject+Serialization.h"

#ifdef __cplusplus
extern "C" {
#endif
extern id of_alloc_object(Class class_, size_t extraSize, size_t extraAlignment,
    void **extra);
extern size_t of_pagesize;
extern size_t of_num_cpus;
extern id of_alloc_object(Class class_, size_t extraSize, size_t extraAlignment,
    void **extra);
extern uint32_t of_hash_seed;
#ifdef __cplusplus
}
#endif

Modified src/OFObject.m from [2f06cacc09] to [df05949c71].

22
23
24
25
26
27
28


29
30
31
32
33
34
35
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37







+
+







#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <assert.h>

#include <sys/time.h>

#ifdef __QNX__
# include <sys/syspage.h>
#endif

#import "OFObject.h"
#import "OFTimer.h"
#import "OFThread.h"
95
96
97
98
99
100
101

102
103
104
105
106
107
108
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111







+








static struct {
	Class isa;
} alloc_failed_exception;

size_t of_pagesize;
size_t of_num_cpus;
uint32_t of_hash_seed;

#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
static void
uncaught_exception_handler(id exception)
{
	fprintf(stderr, "\nRuntime error: Unhandled exception:\n%s\n",
	    [[exception description] UTF8String]);
271
272
273
274
275
276
277














278
279
280
281
282
283
284
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301







+
+
+
+
+
+
+
+
+
+
+
+
+
+







# endif
		of_pagesize = 4096;
# ifdef _SC_NPROCESSORS_CONF
	if ((of_num_cpus = sysconf(_SC_NPROCESSORS_CONF)) < 1)
# endif
		of_num_cpus = 1;
#endif

#if defined(OF_HAVE_ARC4RANDOM)
	of_hash_seed = arc4random();
#elif defined(OF_HAVE_RANDOM)
	struct timeval t;
	gettimeofday(&t, NULL);
	srandom(t.tv_usec);
	of_hash_seed = random();
#else
	struct timeval t;
	gettimeofday(&t, NULL);
	srand(t.tv_usec);
	of_hash_seed = rand();
#endif
}

+ (void)initialize
{
}

+ alloc

Modified src/macros.h from [f956fa931a] to [419a2f32d2].

322
323
324
325
326
327
328
329

330
331
332
333
334
335
336
322
323
324
325
326
327
328

329
330
331
332
333
334
335
336







-
+







# define OF_IOS
#endif

#define OF_ROL(value, bits)						\
	(((value) << ((bits) % (sizeof(value) * 8))) |			\
	(value) >> (sizeof(value) * 8 - ((bits) % (sizeof(value) * 8))))

#define OF_HASH_INIT(hash) hash = 0
#define OF_HASH_INIT(hash) hash = of_hash_seed
#define OF_HASH_ADD(hash, byte)		\
	{				\
		hash += (uint8_t)byte;	\
		hash += (hash << 10);	\
		hash ^= (hash >> 6);	\
	}
#define OF_HASH_FINALIZE(hash)		\

Modified tests/TestsAppDelegate.m from [e7f245ce3b] to [cbb72ed2a0].

25
26
27
28
29
30
31





32



33
34
35
36
37
38
39
25
26
27
28
29
30
31
32
33
34
35
36

37
38
39
40
41
42
43
44
45
46







+
+
+
+
+
-
+
+
+







#ifdef _PSP
# include <pspmoduleinfo.h>
# include <pspkernel.h>
# include <pspdebug.h>
PSP_MODULE_INFO("ObjFW Tests", 0, 0, 0);
#endif

int
main(int argc, char *argv[])
{
	/* We need deterministic hashes for tests */
	of_hash_seed = 0;
OF_APPLICATION_DELEGATE(TestsAppDelegate)

	return of_application_main(&argc, &argv, [TestsAppDelegate class]);
}

@implementation TestsAppDelegate
- (void)outputString: (OFString*)str
	   withColor: (int)color
{
#if defined(_PSP)
	char i, space = ' ';