[v3] nss: Get rid of alloca usage in db-XXX

Message ID 20230928130548.1203408-1-josimmon@redhat.com
State New
Headers
Series [v3] nss: Get rid of alloca usage in db-XXX |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed

Commit Message

Joe Simmons-Talbott Sept. 28, 2023, 1:05 p.m. UTC
  Replace alloca usage with a scratch_buffer.
---
Changes to v2:
 * fix '\' alignment.
 * set errnop to errno rather than ENOMEM

 nss/nss_db/db-XXX.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
  

Comments

Joe Simmons-Talbott Oct. 6, 2023, 3:01 p.m. UTC | #1
On Thu, Sep 28, 2023 at 09:05:37AM -0400, Joe Simmons-Talbott wrote:
> Replace alloca usage with a scratch_buffer.

Ping.

> ---
> Changes to v2:
>  * fix '\' alignment.
>  * set errnop to errno rather than ENOMEM
> 
>  nss/nss_db/db-XXX.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c
> index 0ce730db5a..8f174fc8ea 100644
> --- a/nss/nss_db/db-XXX.c
> +++ b/nss/nss_db/db-XXX.c
> @@ -18,6 +18,7 @@
>  
>  #include <dlfcn.h>
>  #include <fcntl.h>
> +#include <scratch_buffer.h>
>  #include <stdint.h>
>  #include <sys/mman.h>
>  #include <libc-lock.h>
> @@ -126,6 +127,8 @@ enum nss_status								      \
>  			char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)\
>  {									      \
>    struct parser_data *data = (void *) buffer;				      \
> +  struct scratch_buffer sbuf;						      \
> +  scratch_buffer_init (&sbuf);						      \
>  									      \
>    if (buflen < sizeof *data)						      \
>      {									      \
> @@ -160,7 +163,14 @@ enum nss_status								      \
>    else									      \
>      {									      \
>        const size_t size = (keysize) + 1;				      \
> -      key = alloca (size);						      \
> +      if (!scratch_buffer_set_array_size (&sbuf, 1, size))		      \
> +	{								      \
> +	  *errnop = errno;						      \
> +	  H_ERRNO_SET (NETDB_INTERNAL);					      \
> +	  status = NSS_STATUS_TRYAGAIN;					      \
> +	  goto out;							      \
> +	}								      \
> +      key = sbuf.data;							      \
>  									      \
>        KEYPRINTF keypattern;						      \
>      }									      \
> @@ -216,6 +226,7 @@ enum nss_status								      \
>  									      \
>   out:									      \
>    internal_endent (&state);						      \
> +  scratch_buffer_free (&sbuf);						      \
>  									      \
>    return status;							      \
>  }
> -- 
> 2.39.2
>
  

Patch

diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c
index 0ce730db5a..8f174fc8ea 100644
--- a/nss/nss_db/db-XXX.c
+++ b/nss/nss_db/db-XXX.c
@@ -18,6 +18,7 @@ 
 
 #include <dlfcn.h>
 #include <fcntl.h>
+#include <scratch_buffer.h>
 #include <stdint.h>
 #include <sys/mman.h>
 #include <libc-lock.h>
@@ -126,6 +127,8 @@  enum nss_status								      \
 			char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)\
 {									      \
   struct parser_data *data = (void *) buffer;				      \
+  struct scratch_buffer sbuf;						      \
+  scratch_buffer_init (&sbuf);						      \
 									      \
   if (buflen < sizeof *data)						      \
     {									      \
@@ -160,7 +163,14 @@  enum nss_status								      \
   else									      \
     {									      \
       const size_t size = (keysize) + 1;				      \
-      key = alloca (size);						      \
+      if (!scratch_buffer_set_array_size (&sbuf, 1, size))		      \
+	{								      \
+	  *errnop = errno;						      \
+	  H_ERRNO_SET (NETDB_INTERNAL);					      \
+	  status = NSS_STATUS_TRYAGAIN;					      \
+	  goto out;							      \
+	}								      \
+      key = sbuf.data;							      \
 									      \
       KEYPRINTF keypattern;						      \
     }									      \
@@ -216,6 +226,7 @@  enum nss_status								      \
 									      \
  out:									      \
   internal_endent (&state);						      \
+  scratch_buffer_free (&sbuf);						      \
 									      \
   return status;							      \
 }