Re:

Samuel Thibault <[email protected]> Sat, 25 Jul 2026 00:01:53 +0200
Newsgroups gmane.os.hurd.bugs
Organization I am not organized
Message-ID <amPg0ZXkJapByY7E@end>
Hello,

> diff --git a/gnumach/ipc/ipc_mqueue.c b/gnumach/ipc/ipc_mqueue.c
> index f770afb..834eb16 100644
> --- a/gnumach/ipc/ipc_mqueue.c
> +++ b/gnumach/ipc/ipc_mqueue.c
> @@ -28,11 +27,11 @@
>   * the rights to redistribute these changes.
>   */
>  /*
> - *	File:	ipc/ipc_mqueue.c
> - *	Author:	Rich Draves
> - *	Date:	2026 
> + *  File:   ipc/ipc_mqueue.c
> + *  Author: Rich Draves / Alperen ERKAN 
> + *  Date:   2026 
> @@ -156,6 +159,8 @@ ipc_mqueue_changed(
>  
>  /*
>   *	Routine:	ipc_mqueue_send
> + *  Author :    Alperen ERKAN 
> + * 						 2026
>   *	Purpose:
>   *		Send a message to a port.  The message holds a reference
>   *		for the destination port in the msgh_remote_port field.

A couple lines is not copyrightable and does make you sole author of
the function.

> @@ -52,6 +51,10 @@
>  #include <ipc/ipc_space.h>
>  #include <ipc/ipc_marequest.h>
>  
> +/* 
> + * An absolute message queue upper limit to prevent OOM and memory exhaustion.
> + */
> +#define IPC_MQUEUE_HARD_LIMIT 65536

If we start adding absolute constraints on sizes etc. we'd want to put
that into a header dedicated for that, so people know where to tune
them.

> @@ -180,8 +185,16 @@ ipc_mqueue_send(
>  {
>  	ipc_port_t port;
>  
> +	/* Defensive C: Checking the incoming message object and destination port */
> +	if (kmsg == IKM_NULL) {
> +    	return MACH_SEND_INVALID_DATA;
> +	}

Again, hiding bugs.

>  	port = (ipc_port_t) kmsg->ikm_header.msgh_remote_port;
> -	assert(IP_VALID(port));
> +
> +	if (!IP_VALID(port)) {
> +   	   return MACH_SEND_INVALID_DEST;
> +	}

If userland passed a bogus port it should have been tested way before
this.

> @@ -230,17 +243,17 @@ ipc_mqueue_send(
>  		}
>  
>  		/*
> -		 *  Don't block if:
> -		 *	1) We're under the queue limit.
> -		 *	2) Caller used the MACH_SEND_ALWAYS internal option.
> -		 *	3) Message is sent to a send-once right.
> -		 */
> -
> -		if ((port->ip_msgcount < port->ip_qlimit) ||
> -		    (option & MACH_SEND_ALWAYS) ||
> -		    (MACH_MSGH_BITS_REMOTE(kmsg->ikm_header.msgh_bits) ==
> -						MACH_MSG_TYPE_PORT_SEND_ONCE))
> -			break;
> +         *  Don't block if:
> +         *  1) We're under the queue limit.
> +         *  2) Caller used MACH_SEND_ALWAYS but we are under the hard safety limit.
> +         *  3) Message is sent to a send-once right.
> +         */

Avoid mangling the existing content.

> +
> +        if ((port->ip_msgcount < port->ip_qlimit) ||
> +            ((option & MACH_SEND_ALWAYS) && (port->ip_msgcount < IPC_MQUEUE_HARD_LIMIT)) ||

? No, you are making ipc_mqueue_send ignore the port->ip_qlimit.

> +            (MACH_MSGH_BITS_REMOTE(kmsg->ikm_header.msgh_bits) ==
> +                        MACH_MSG_TYPE_PORT_SEND_ONCE))
> +            break;
>  
>  		/* must block waiting for queue to clear */
>  
> @@ -263,45 +276,49 @@ ipc_mqueue_send(
>  		counter(c_ipc_mqueue_send_block++);
>  		thread_block(thread_no_continuation);
>  		ip_lock(port);
> -
> +  
>  		/* why did we wake up? */
>  
> -		if (self->ith_state == MACH_MSG_SUCCESS)
> -			continue;
> -		assert(self->ith_state == MACH_SEND_IN_PROGRESS);
> +        if (self->ith_state == MACH_MSG_SUCCESS) {
> +            self->ith_state = MACH_MSG_SUCCESS; // veya temiz durum sıfırlaması

Always English, please. And this does not do anything.

> +            continue;
> +        }
> +        assert(self->ith_state == MACH_SEND_IN_PROGRESS);

Again avoid mangling the indentation.

>  
> -		/* take ourselves off blocked queue */
> +        /* take ourselves off blocked queue under port lock */
> +        ipc_thread_rmqueue(&port->ip_blocked, self);
> +        
> +        /* [DEFENSIVE]: Clear state to prevent stale status reuse */
> +        self->ith_state = MACH_MSG_SUCCESS;
>  
> -		ipc_thread_rmqueue(&port->ip_blocked, self);
> +        /*
> +         *  Thread wakeup-reason field tells us why
> +         *  the wait was interrupted.
> +         */
>  
> -		/*
> -		 *	Thread wakeup-reason field tells us why
> -		 *	the wait was interrupted.
> -		 */
> +        switch (self->ith_wait_result) {
> +            case THREAD_INTERRUPTED:
> +            /* send was interrupted - give up */

This is completely mangled. No idea if there is anything to read here.

Samuel