Re: Issues with HTTP multipart/form-data file upload
Xavier Del Campo Romero <[email protected]> Sun, 1 Sep 2024 23:17:53 +0200
| Newsgroups | gmane.comp.web.dillo.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Rodrigo,
> Not sure what you mean with "unnecessary use of the heap". I meant
> something like this:
You are right: I was too fixated with strcspn(3), when in fact strchr(3)
would already do. Also, this use of dStr_append_c() looks good to me.
> The variable c is stored in a register, as you can see in the
> disassembly (built with -Og):
Thanks for the detailed explanation. Anyway, I do not expect this
function to become a performance bottleneck.
> This other method has a slightly not
> uniform distribution, but only runs rand() 70 times:
>
> Which is probably okay for this case.
I also think it is good enough.
> Then, I think using our own set may be the most readable solution here,
> which also allows the quick module method.
I agree.
Best regards,
Xavi
On 1/9/24 16:12, Rodrigo Arias wrote:
> Hi Xavier,
>
>> Thank you. I am still unfamiliar with that part of Dillo, so please let
>> me know about any progress.
>
> For now I'm still writing the RFC and doing some proof of concepts. I
> can see that it will take a while.
>
>> Limiting ourselves to a-z, A-Z and 0-9 would still account for 62 out of
>> the 75 possible characters, so roughly 82% of the set. I think that
>> removing the quoting in favour of the limited set reduce the risk for
>> broken implementations, yet still provide a good amount of randomness.
>
> Yes, I think so too.
>
>> I am not sure whether this was an intentional modification from your
>> side. My patch is adding a <space> as defined by POSIX.1-2017 [1], so
>> that sizeof " " would always return 2. Was it your intention to flag
>> this potential confusion?
>
> Yes, my point was that it is that is not easy to determine the length of
> a UTF-8 string by just looking at it.
>
>> Also, there was not strict reason to use sizeof " ". Any other
>> character would do e.g.: sizeof "x", sizeof "A", etc.
>
> Same problem:
>
> ᕁ 𝓍 𝙭 х 𝐱 𝗑 ⤫ 𝑥 𝘅 ⤬ ᙮ ⨯ 𝕩 𝖝 × 𝔁 𝚡 x x ⅹ 𝔵 ᕽ 𝒙 𝘹
>
> 𝙰 A 𝐴 ᗅ 𝑨 𝚨 𝕬 𝖠 А Α 𝛢 𝝖 𝒜 𝜜 𖽀 𝓐 𝞐 A 𝗔 𝘈 Ꭺ ꓮ 𝐀 𝔄 𝔸 𐊠 𝘼
>
> Check: https://util.unicode.org/UnicodeJsps/confusables.jsp
>
> It is generally safer to use the explicit length.
>
>>> You can also use dStr_append_c() to only append one character, so you
>>> only need a single character.
>>
>> That would be an unnecessary use of the heap, because the size is static.
>
> Not sure what you mean with "unnecessary use of the heap". I meant
> something like this:
>
> 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";
> int c;
>
> do {
> c = rand() & 0xff;
> } while (!strchr(set, c));
>
> dStr_append_c(boundary, c);
> }
> }
>
> The variable c is stored in a register, as you can see in the
> disassembly (built with -Og):
>
> hop% r2 build/src/dillo
> WARN: Relocs has not been applied. Please use `-e bin.relocs.apply=true`
> or `-e bin.cache=true` next time
> [0x000e3860]> s sym.generate_boundary_Dstr_
> [0x0012cf99]> af
> [0x0012cf99]> pdf
> ┌ 85: sym.generate_boundary_Dstr_ (int64_t arg1);
> │ ; arg int64_t arg1 @ rdi
> │ 0x0012cf99 55 push rbp ;
> Fl_Pixmap.H:1250 ; generate_boundary(Dstr*)
> │ 0x0012cf9a 4889e5 mov rbp, rsp
> │ 0x0012cf9d 4155 push r13
> │ 0x0012cf9f 4154 push r12
> │ 0x0012cfa1 53 push rbx
> │ 0x0012cfa2 4883ec08 sub rsp, 8
> │ 0x0012cfa6 4989fd mov r13, rdi ;
> arg1
> │ 0x0012cfa9 41bc00000000 mov r12d, 0 ;
> Fl_Pixmap.H:1251
> │ ┌─< 0x0012cfaf eb2c jmp 0x12cfdd
> │ ┌┌──> 0x0012cfb1 ff1509cd1e00 call qword [reloc.rand] ;
> Fl_Pixmap.H:1253 ; [0x319cc0:8]=0
> │ ╎╎│ 0x0012cfb7 0fb6d8 movzx ebx, al ;
> <--- Perform the "& 0xff" by zero-extending the lowest byte in eax
> │ ╎╎│ 0x0012cfba 89de mov esi, ebx ;
> Fl_Pixmap.H:1260
> │ ╎╎│ 0x0012cfbc 488d3dbd5b.. lea rdi,
> obj.generate_boundary_Dstr_::set ; 0x2a2b80 ;
> "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
> │ ╎╎│ 0x0012cfc3 ff15afc51e00 call qword [reloc.strchr] ;
> [0x319578:8]=0
> │ ╎╎│ 0x0012cfc9 4885c0 test rax, rax
> │ └───< 0x0012cfcc 74e3 je 0x12cfb1
> │ ╎│ 0x0012cfce 89de mov esi, ebx ;
> Fl_Pixmap.H:1262
> │ ╎│ 0x0012cfd0 4c89ef mov rdi, r13
> │ ╎│ 0x0012cfd3 67e830570800 call sym.dStr_append_c
> │ ╎│ 0x0012cfd9 4183c401 add r12d, 1 ;
> Fl_Pixmap.H:1251
> │ ╎│ ; CODE XREF from generate_boundary(Dstr*) @ 0x12cfaf(x)
> │ ╎└─> 0x0012cfdd 4183fc45 cmp r12d, 0x45 ;
> 'E'
> │ └──< 0x0012cfe1 7ece jle 0x12cfb1
> │ 0x0012cfe3 4883c408 add rsp, 8 ;
> Fl_Pixmap.H:1264
> │ 0x0012cfe7 5b pop rbx
> │ 0x0012cfe8 415c pop r12
> │ 0x0012cfea 415d pop r13
> │ 0x0012cfec 5d pop rbp
> └ 0x0012cfed c3 ret
>
> This method gives us a perfect uniform distribution when RAND_MAX is a
> power of 2, at the cost of executing rand() more times than required
> (70/(62/256) ≈ 289 on average). This other method has a slightly not
> uniform distribution, but only runs rand() 70 times:
>
> static void generate_boundary(Dstr *boundary)
> {
> /* Extracted from RFC 2046, section 5.1.1. */
> static const char set[] = "abcdefghijklmnopqrstuvwxyz"
> "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> "0123456789";
> static const int n = strlen(set);
>
> for (int i = 0; i < 70; i++) {
> int c = (unsigned char) set[rand() % n];
> dStr_append_c(boundary, c);
> }
> }
>
> Which is probably okay for this case.
>
> Notice I haven't tested any of these methods yet, I'll need to add a
> form upload test case to be able to see them in action (or a unit test).
>
>>> If we only use alphanumeric characters, we can just use isalnum() right?
>>
>> According to POSIX.1-2017 [2], isalnum(3) depends on the current locale
>> configured by the system. For example, characters such as Ä or ú could
>> return non-zero.
>
> Oh right, for some reason I was thinking this was the other way around,
> and isalnum only worked with ASCII. I think we should review the other
> uses of isalnum and friends as I think there may be used under similar
> assumptions.
>
>> To avoid this, there are two possible solutions:
>>
>> 1. Use isalnum_l(3) to specify a locale_t object corresponding to the
>> "POSIX" locale (equivalent to "C" [3]), which must be previously
>> allocated by the newlocale(3) function [3] and released by the
>> freelocal(3) function [4]. A minimalist example is shown below:
>>
>> locale_t l = newlocale(LC_CTYPE, "POSIX", NULL);
>>
>> for (unsigned char i = 0; i < 255; i++)
>> printf("hhu=%hhu, c=%c, isalnum=%d\n", i, i,
>> isalnum_l(i, l));
>>
>> freelocale(l);
>>
>> 2. Define a known subset from the portable character set defined by
>> POSIX.1-2017 [5] and use strspn(3), as already suggested by the patch.
>> IMHO this approach is better because:
>> - It does not deal with locales, so developers not familiar with them
>> would understand the code better.
>> - It is also portable outside a POSIX environment (not sure if this a
>> requirement, though).
>> - It does not require dynamic allication via newlocale(3).
>> - It is the only possible option if non-alnum characters, such as ':'
>> or '/', are appended to the boundary string.
>
> Then, I think using our own set may be the most readable solution here,
> which also allows the quick module method.
>
> Best,
> Rodrigo
> _______________________________________________
> Dillo-dev mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
_______________________________________________
Dillo-dev mailing list -- dillo-dev-lx9mn2B4QYRWk0Htik3J/[email protected]
To unsubscribe send an email to dillo-dev-leave-lx9mn2B4QYRWk0Htik3J/[email protected]
OpenPGP_0x84FF3612A9BF43F2.asc
(application/pgp-keys, 4.8 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 =Om+c -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc
(application/pgp-signature, 840 B)
-----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEL4wEMJP9YSkk8Lb8hP82Eqm/Q/IFAmbU2gEFAwAAAAAACgkQhP82Eqm/Q/Iz sxAAjcG+rjuJ+U3BOsCJGxVaGfE0XTnO4ueeWoJFXHiaBQhFeCClE0mwFiVDol19+v/SxLi8AzUv 3V4sX7sI8VyAh8EEfWGwd+gLRMKSa0h5VYzXajFkf52cC0JBpAw7UCF0C7Yp/GZ9ZGO6bed8GHyU 4ZP04FFi0QyGhKRzi+Q5zQAQmG+BY9yh3mPqx4PCj9hKUIildhwlN7ditH+zZnB+lv1waXnazWo4 4jN+CLZxmrpq7mM4LKlWHBbtKPlm9VfaiOg2lc7dLfLlj/e4EgZwV1cSvp3Med6p6Sp6dRsbV3GH z/oiyfkaJj+xDyFlBHX8r+0fOF/4QYOQg/rx0K/XVeZzdP5Xr9a0Sals5QRFx0akGBb9v+Gtk9az yyKVSJUO+Dbmix2b9YIfpT2qVSfIYyH1vnHj/HIbaewNLRRVU7yEXV+/gtxd6ekNluxVNV2RLuzV YNIKxq7USqgGBbreCx8xkYu3d2za8O4Ef1JcBDmwgAs8tINIlHGMADTa+bFf3ud04tpboWF4NA3n 01ClKEbVT2vtyZm4flmQX9e73lBPwE8jKGdekpdLYnXkb55aIF4LnNbxb7zABQFOIKvyerJe7GN2 hAYcLKZptQSxY48+jRzFR0qDSPBujOGHvf/rhKWGbVz6AkcjzmvoXuaeoTkyUMbsaFmvqvrbSMMt SYw= =yXV6 -----END PGP SIGNATURE-----