aboutsummaryrefslogtreecommitdiff
path: root/src/form.cc
diff options
context:
space:
mode:
authorRodrigo Arias Mallo <rodarima@gmail.com>2024-09-01 23:46:23 +0200
committerRodrigo Arias Mallo <rodarima@gmail.com>2024-09-10 07:01:06 +0200
commit8faec1d33e19bf86e2a1131daa48736e91497b67 (patch)
tree498dfe3512e7ef929e24140df80a586061be54f8 /src/form.cc
parent7ba398c9019ee2cf2b0b93afe5428eacd77c60d4 (diff)
Generate boundary by choosing a random character
Instead of rejecting random characters that are not in the boundary character set, draw a random index and select the character at that position. The probability distribution is not perfectly uniform with this method, but reduces the number of calls to rand() by 4 times on average.
Diffstat (limited to 'src/form.cc')
-rw-r--r--src/form.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/form.cc b/src/form.cc
index 4a401a91..2ad743b5 100644
--- a/src/form.cc
+++ b/src/form.cc
@@ -2,6 +2,7 @@
* File: form.cc
*
* Copyright 2008 Jorge Arellano Cid <jcid@dillo.org>
+ * Copyright 2024 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1246,20 +1247,23 @@ Dstr *DilloHtmlForm::buildQueryData(DilloHtmlInput *active_submit)
return DataStr;
}
+/**
+ * Generate a random boundary.
+ *
+ * Using 70 random characters makes the probability that it collides
+ * with a 1 TiB random file less than 1e-117, so there is no need for
+ * checking for collisions. */
static void generate_boundary(Dstr *boundary)
{
- for (int i = 0; i < 70; i++) {
- /* Extracted from RFC 2046, section 5.1.1. */
- static const char set[] = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "0123456789";
- char s[sizeof " "] = {0};
+ /* Extracted from RFC 2046, section 5.1.1. */
+ static const char set[] = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789";
+ static const size_t n = strlen(set);
- do {
- *s = rand();
- } while (!strspn(s, set));
-
- dStr_append(boundary, s);
+ for (int i = 0; i < 70; i++) {
+ int c = (unsigned char) set[rand() % n];
+ dStr_append_c(boundary, c);
}
}