diff options
author | Rodrigo Arias Mallo <rodarima@gmail.com> | 2024-09-01 23:46:23 +0200 |
---|---|---|
committer | Rodrigo Arias Mallo <rodarima@gmail.com> | 2024-09-10 07:01:06 +0200 |
commit | 8faec1d33e19bf86e2a1131daa48736e91497b67 (patch) | |
tree | 498dfe3512e7ef929e24140df80a586061be54f8 | |
parent | 7ba398c9019ee2cf2b0b93afe5428eacd77c60d4 (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.
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | src/form.cc | 26 |
2 files changed, 17 insertions, 11 deletions
@@ -23,6 +23,8 @@ dillo-3.2.0 [Not released yet] Patches: Rodrigo Arias Mallo +- Add primitive support for SVG using the nanosvg.h library. Patches: dogma, Rodrigo Arias Mallo ++- Avoid expensive search for multipart/form-data boundaries. + Patches: Xavier Del Campo Romero, Rodrigo Arias Mallo dillo-3.1.1 [Jun 8, 2024] 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); } } |