# [PATCH] win32: check for NULL when creating thread

7 messages from 2023-01-31 to 2023-02-01. Participants: Rose via GitGitGadget, Johannes Sixt, Junio C Hamano.
Thread: https://gitlist.dev/t/59165

## Rose via GitGitGadget, 2023-01-31 14:49

Subject: [PATCH] win32: check for NULL when creating thread
Message-ID: <pull.1445.git.git.1675176581433.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1445.git.git.1675176581433.gitgitgadget%40gmail.com

```
From: Seija Kijin <doremylover123@gmail.com>

Check for NULL handles, not "INVALID_HANDLE,"
as CreateThread guarantees a valid handle in most cases.

The return value for failed thread creation is NULL,
not INVALID_HANDLE_VALUE, unlike other Windows
API functions.

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
---
    win32: check for NULL when creating thread
    
    Check for NULL handles, not "INVALID_HANDLE," as CreateThread guarantees
    a valid handle in most cases.
    
    The return value for failed thread creation is NULL, not
    INVALID_HANDLE_VALUE, unlike other Windows API functions.
    
    Signed-off-by: Seija Kijin doremylover123@gmail.com

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1445%2FAtariDreams%2FhThread-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1445/AtariDreams/hThread-v1
Pull-Request: https://github.com/git/git/pull/1445

 compat/winansi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compat/winansi.c b/compat/winansi.c
index 3abe8dd5a27..f83610f684d 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -644,7 +644,7 @@ void winansi_init(void)
 
 	/* start console spool thread on the pipe's read end */
 	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
-	if (hthread == INVALID_HANDLE_VALUE)
+	if (!hthread)
 		die_lasterr("CreateThread(console_thread) failed");
 
 	/* schedule cleanup routine */

base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473
-- 
gitgitgadget

```

## Rose via GitGitGadget, 2023-01-31 14:53

Subject: [PATCH v2] win32: check for NULL after creating thread
Message-ID: <pull.1445.v2.git.git.1675176818033.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1445.v2.git.git.1675176818033.gitgitgadget%40gmail.com
In-Reply-To: <pull.1445.git.git.1675176581433.gitgitgadget@gmail.com>

```
From: Seija Kijin <doremylover123@gmail.com>

Check for NULL handles, not "INVALID_HANDLE,"
as CreateThread guarantees a valid handle in most cases.

The return value for failed thread creation is NULL,
not INVALID_HANDLE_VALUE, unlike other Windows
API functions.

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
---
    win32: check for NULL after creating thread
    
    Check for NULL handles, not "INVALID_HANDLE," as CreateThread guarantees
    a valid handle in most cases.
    
    The return value for failed thread creation is NULL, not
    INVALID_HANDLE_VALUE, unlike other Windows API functions.
    
    Signed-off-by: Seija Kijin doremylover123@gmail.com

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1445%2FAtariDreams%2FhThread-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1445/AtariDreams/hThread-v2
Pull-Request: https://github.com/git/git/pull/1445

Range-diff vs v1:

 1:  e75d15e42f4 ! 1:  c956cafdec9 win32: check for NULL when creating thread
     @@ Metadata
      Author: Seija Kijin <doremylover123@gmail.com>
      
       ## Commit message ##
     -    win32: check for NULL when creating thread
     +    win32: check for NULL after creating thread
      
          Check for NULL handles, not "INVALID_HANDLE,"
          as CreateThread guarantees a valid handle in most cases.


 compat/winansi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compat/winansi.c b/compat/winansi.c
index 3abe8dd5a27..f83610f684d 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -644,7 +644,7 @@ void winansi_init(void)
 
 	/* start console spool thread on the pipe's read end */
 	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
-	if (hthread == INVALID_HANDLE_VALUE)
+	if (!hthread)
 		die_lasterr("CreateThread(console_thread) failed");
 
 	/* schedule cleanup routine */

base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473
-- 
gitgitgadget

```

## Rose via GitGitGadget, 2023-02-01 14:40

Subject: [PATCH v3] win32: check for NULL after creating thread
Message-ID: <pull.1445.v3.git.git.1675262454817.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1445.v3.git.git.1675262454817.gitgitgadget%40gmail.com
In-Reply-To: <pull.1445.v2.git.git.1675176818033.gitgitgadget@gmail.com>

```
From: Seija Kijin <doremylover123@gmail.com>

Check for NULL handles, not "INVALID_HANDLE,"
as CreateThread guarantees a valid handle in most cases.

The return value for failed thread creation is NULL,
not INVALID_HANDLE_VALUE, unlike other Windows API functions.

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
---
    win32: check for NULL after creating thread
    
    Check for NULL handles, not "INVALID_HANDLE," as CreateThread guarantees
    a valid handle in most cases.
    
    The return value for failed thread creation is NULL, not
    INVALID_HANDLE_VALUE, unlike other Windows API functions.
    
    Signed-off-by: Seija Kijin doremylover123@gmail.com

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1445%2FAtariDreams%2FhThread-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1445/AtariDreams/hThread-v3
Pull-Request: https://github.com/git/git/pull/1445

Range-diff vs v2:

 1:  c956cafdec9 ! 1:  1cbc43e0d82 win32: check for NULL after creating thread
     @@ Commit message
          as CreateThread guarantees a valid handle in most cases.
      
          The return value for failed thread creation is NULL,
     -    not INVALID_HANDLE_VALUE, unlike other Windows
     -    API functions.
     +    not INVALID_HANDLE_VALUE, unlike other Windows API functions.
      
          Signed-off-by: Seija Kijin <doremylover123@gmail.com>
      


 compat/winansi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compat/winansi.c b/compat/winansi.c
index 3abe8dd5a27..f83610f684d 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -644,7 +644,7 @@ void winansi_init(void)
 
 	/* start console spool thread on the pipe's read end */
 	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
-	if (hthread == INVALID_HANDLE_VALUE)
+	if (!hthread)
 		die_lasterr("CreateThread(console_thread) failed");
 
 	/* schedule cleanup routine */

base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473
-- 
gitgitgadget

```

## Johannes Sixt, 2023-02-01 21:51

Subject: Re: [PATCH v3] win32: check for NULL after creating thread
Message-ID: <f3de2ca3-167e-365c-8124-d6ba9bba920d@kdbg.org>
URL: https://gitlist.dev/e/f3de2ca3-167e-365c-8124-d6ba9bba920d%40kdbg.org
In-Reply-To: <pull.1445.v3.git.git.1675262454817.gitgitgadget@gmail.com>

```
Am 01.02.23 um 15:40 schrieb Rose via GitGitGadget:
> From: Seija Kijin <doremylover123@gmail.com>
> 
> Check for NULL handles, not "INVALID_HANDLE,"
> as CreateThread guarantees a valid handle in most cases.
> 
> The return value for failed thread creation is NULL,
> not INVALID_HANDLE_VALUE, unlike other Windows API functions.

Nice catch!

The subject line sounds as if an error check was missing, but that is
not true. I'd phrase it

	compat/winansi: check for errors of CreateThread() correctly

Then drop the first sentence of the message body as it is very handwavy:
talking about "most cases" is not helpful if the few other cases are not
enumerated. And the subsequent sentence is to the point and very helpful
(substitute "CreateThread" for "thread creation").

>  compat/winansi.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/compat/winansi.c b/compat/winansi.c
> index 3abe8dd5a27..f83610f684d 100644
> --- a/compat/winansi.c
> +++ b/compat/winansi.c
> @@ -644,7 +644,7 @@ void winansi_init(void)
>  
>  	/* start console spool thread on the pipe's read end */
>  	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
> -	if (hthread == INVALID_HANDLE_VALUE)
> +	if (!hthread)
>  		die_lasterr("CreateThread(console_thread) failed");
>  
>  	/* schedule cleanup routine */
> 
> base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473

Acked-by: Johannes Sixt <j6t@kdbg.org>

-- Hannes


```

## Rose via GitGitGadget, 2023-02-01 22:20

Subject: [PATCH v4] compat/winansi: check for errors of CreateThread() correctly
Message-ID: <pull.1445.v4.git.git.1675290034144.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1445.v4.git.git.1675290034144.gitgitgadget%40gmail.com
In-Reply-To: <pull.1445.v3.git.git.1675262454817.gitgitgadget@gmail.com>

```
From: Seija Kijin <doremylover123@gmail.com>

The return value for failed thread creation is NULL,
not INVALID_HANDLE_VALUE, unlike other Windows API functions.

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
---
    win32: check for NULL after creating thread
    
    Check for NULL handles, not "INVALID_HANDLE," as CreateThread guarantees
    a valid handle in most cases.
    
    The return value for failed thread creation is NULL, not
    INVALID_HANDLE_VALUE, unlike other Windows API functions.
    
    Signed-off-by: Seija Kijin doremylover123@gmail.com

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1445%2FAtariDreams%2FhThread-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1445/AtariDreams/hThread-v4
Pull-Request: https://github.com/git/git/pull/1445

Range-diff vs v3:

 1:  1cbc43e0d82 ! 1:  6c4188977e8 win32: check for NULL after creating thread
     @@ Metadata
      Author: Seija Kijin <doremylover123@gmail.com>
      
       ## Commit message ##
     -    win32: check for NULL after creating thread
     -
     -    Check for NULL handles, not "INVALID_HANDLE,"
     -    as CreateThread guarantees a valid handle in most cases.
     +    compat/winansi: check for errors of CreateThread() correctly
      
          The return value for failed thread creation is NULL,
          not INVALID_HANDLE_VALUE, unlike other Windows API functions.


 compat/winansi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compat/winansi.c b/compat/winansi.c
index 3abe8dd5a27..f83610f684d 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -644,7 +644,7 @@ void winansi_init(void)
 
 	/* start console spool thread on the pipe's read end */
 	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
-	if (hthread == INVALID_HANDLE_VALUE)
+	if (!hthread)
 		die_lasterr("CreateThread(console_thread) failed");
 
 	/* schedule cleanup routine */

base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473
-- 
gitgitgadget

```

## Junio C Hamano, 2023-02-01 22:37

Subject: Re: [PATCH v4] compat/winansi: check for errors of CreateThread() correctly
Message-ID: <xmqq357pyptu.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqq357pyptu.fsf%40gitster.g
In-Reply-To: <pull.1445.v4.git.git.1675290034144.gitgitgadget@gmail.com>

```
"Rose via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Seija Kijin <doremylover123@gmail.com>
>
> The return value for failed thread creation is NULL,
> not INVALID_HANDLE_VALUE, unlike other Windows API functions.
>
> Signed-off-by: Seija Kijin <doremylover123@gmail.com>
> ---

Thanks.  Will queue with the Ack by j6t given earlier.

```

## Johannes Sixt, 2023-02-01 22:39

Subject: Re: [PATCH v4] compat/winansi: check for errors of CreateThread() correctly
Message-ID: <e6fa3452-6d82-bf40-ddb2-44dc686a2e29@kdbg.org>
URL: https://gitlist.dev/e/e6fa3452-6d82-bf40-ddb2-44dc686a2e29%40kdbg.org
In-Reply-To: <pull.1445.v4.git.git.1675290034144.gitgitgadget@gmail.com>

```
Am 01.02.23 um 23:20 schrieb Rose via GitGitGadget:
> From: Seija Kijin <doremylover123@gmail.com>
> 
> The return value for failed thread creation is NULL,
> not INVALID_HANDLE_VALUE, unlike other Windows API functions.
> 
> Signed-off-by: Seija Kijin <doremylover123@gmail.com>
> ---
>     win32: check for NULL after creating thread
>     
>     Check for NULL handles, not "INVALID_HANDLE," as CreateThread guarantees
>     a valid handle in most cases.
>     
>     The return value for failed thread creation is NULL, not
>     INVALID_HANDLE_VALUE, unlike other Windows API functions.
>     
>     Signed-off-by: Seija Kijin doremylover123@gmail.com
> 
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1445%2FAtariDreams%2FhThread-v4
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1445/AtariDreams/hThread-v4
> Pull-Request: https://github.com/git/git/pull/1445
> 
> Range-diff vs v3:
> 
>  1:  1cbc43e0d82 ! 1:  6c4188977e8 win32: check for NULL after creating thread
>      @@ Metadata
>       Author: Seija Kijin <doremylover123@gmail.com>
>       
>        ## Commit message ##
>      -    win32: check for NULL after creating thread
>      -
>      -    Check for NULL handles, not "INVALID_HANDLE,"
>      -    as CreateThread guarantees a valid handle in most cases.
>      +    compat/winansi: check for errors of CreateThread() correctly
>       
>           The return value for failed thread creation is NULL,
>           not INVALID_HANDLE_VALUE, unlike other Windows API functions.
> 
> 
>  compat/winansi.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/compat/winansi.c b/compat/winansi.c
> index 3abe8dd5a27..f83610f684d 100644
> --- a/compat/winansi.c
> +++ b/compat/winansi.c
> @@ -644,7 +644,7 @@ void winansi_init(void)
>  
>  	/* start console spool thread on the pipe's read end */
>  	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
> -	if (hthread == INVALID_HANDLE_VALUE)
> +	if (!hthread)
>  		die_lasterr("CreateThread(console_thread) failed");
>  
>  	/* schedule cleanup routine */
> 
> base-commit: 2fc9e9ca3c7505bc60069f11e7ef09b1aeeee473

This iteration looks good, thank you!

Acked-by: Johannes Sixt <j6t@kdbg.org>

-- Hannes


```
