Thank you, merged your patch :)

Regards, Tim

On 9/10/26 07:15, Nigko Yerden wrote:
Hello,

I found [1] the following 11 tests from `testenv` directory||fails when run on GNU Hurd:

1. Test-hsts.py
2. Test-https-k.py
3. Test--https.py
4. Test--https-crl.py
5. Test-pinnedpubkey-der-https.py
6. Test-pinnedpubkey-der-no-check-https.py
7. Test-pinnedpubkey-hash-https.py
8. Test-pinnedpubkey-hash-no-check-fail-https.py
9. Test-pinnedpubkey-pem-fail-https.py
10. Test-pinnedpubkey-pem-https.py
11. Test-k.py

Here is what happens when I run 'Test--https.py' in Python debugger:

```sh
env SSL_TESTS=1 python3 -m pdb ./Test--https.py
> /tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/Test-- https.py(2)<module>()
-> from sys import exit
(Pdb) cont
Running Test Test--https.py
Traceback (most recent call last):
  File "/gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/pdb.py", line 1960, in main
     pdb._run(target)
  File "/gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/pdb.py", line 1754, in _run
     self.run(target.code)
  File "/gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/bdb.py", line 627, in run
     exec(cmd, globals, locals)
   File "<string>", line 1, in <module>
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/Test-- https.py", line 54, in <module>
     ).begin ()
       ^^^^^^^^
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/test/ http_test.py", line 35, in begin
     self.setup()
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/test/ http_test.py", line 28, in setup
     self.server_setup()
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/test/ base_test.py", line 88, in server_setup
     instance = self.instantiate_server_by(protocol)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/test/ http_test.py", line 48, in instantiate_server_by
     server = {HTTP: HTTPd,
              ^^^^^^^^^^^^^
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/server/ http/http_server.py", line 478, in __init__
     self.server_inst = self.server_class(addr, self.handler)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/guix-build-wget-1.25.0.drv-0/wget-1.25.0/testenv/server/ http/http_server.py", line 56, in __init__
     self.server_bind()
  File "/gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/http/server.py", line 136, in server_bind
     socketserver.TCPServer.server_bind(self)
  File "/gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/socketserver.py", line 478, in server_bind
     self.socket.bind(self.server_address)
OSError: [Errno 1073741846] Invalid argument
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /gnu/store/gsv7f12nhzvq6dchdw5hyg603y92b8di-python-3.12.12/lib/ python3.12/socketserver.py(478)server_bind()
-> self.socket.bind(self.server_address)
(Pdb)
```

Tests 1-10 have very similar behavior: all their backtraces lead to
this piece of code in testenv/server/http/http_server.py:

```Python
class HTTPSServer(StoppableHTTPServer):
     """ The HTTPSServer class extends the StoppableHTTPServer class with
     additional support for secure connections through SSL. """

     def __init__(self, address, handler):
         import ssl
         BaseServer.__init__(self, address, handler)
        # step one up because test suite change directory away from $srcdir
         # (don't do that !!!)
         CERTFILE = os.path.abspath(os.path.join('..',
os.getenv('srcdir', '.'),
                                                 'certs',
'server-cert.pem'))
         KEYFILE = os.path.abspath(os.path.join('..',
  os.getenv('srcdir', '.'),
                                                'certs',
  'server-key.pem'))
         ctx = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER)
         ctx.load_cert_chain(CERTFILE, KEYFILE)
         self.socket = ctx.wrap_socket(
             sock=socket.socket(self.address_family, self.socket_type),
             server_side=True
         )
-->     self.server_bind()
         self.server_activate()
```

According to Python documentation on "TLS/SSL wrapper for socket objects' [2],
a socket.socket object that is wrapped with wrap_socket is assumed to be an
already listening socket (i.e binded and activated), but here it is not:
instead self.server_bind() and self.server_activate() bind and activate an already
wrapped socket (self.socket).

I rewrote this piece of code as follows:

```Python
class HTTPSServer(StoppableHTTPServer):
     """ The HTTPSServer class extends the StoppableHTTPServer class with
     additional support for secure connections through SSL. """

     def __init__(self, address, handler):
         import ssl
         # This also calls self.server_bind() and self.server_activate()
         # due to bind_and_activate=True default argument so that
         # self.socket becomes a listening socket:
         TCPServer.__init__(self, address, handler)
        # step one up because test suite change directory away from $srcdir
         # (don't do that !!!)
         CERTFILE = os.path.abspath(os.path.join('..',
os.getenv('srcdir', '.'),
                                                 'certs',
'server-cert.pem'))
         KEYFILE = os.path.abspath(os.path.join('..',
  os.getenv('srcdir', '.'),
                                                'certs',
  'server-key.pem'))
         ctx = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER)
         ctx.load_cert_chain(CERTFILE, KEYFILE)
         self.socket = ctx.wrap_socket(self.socket, server_side=True)
```

and it fixed tests 1-10.

Test 11 fails simply because `Test-k.py` is not aware that 'GNU' platform is also 'unix'.
It was easy to fix.

See also PR [3] that was submitted to the GNU Guix repo to fix these failing tests.

[1] https://codeberg.org/guix/guix/issues/11124
[2] https://docs.python.org/3.7/library/ssl.html#ssl.SSLContext.wrap_socket
[3] https://codeberg.org/guix/guix/pulls/11127

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

Reply via email to