Skip to content

Commit

Permalink
move alloca() definition from all *.h files to one new header file
Browse files Browse the repository at this point in the history
  • Loading branch information
sysprg committed Mar 7, 2023
1 parent b1646d0 commit 1e58b8a
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 32 deletions.
1 change: 1 addition & 0 deletions debian/libmariadb-dev.install
Expand Up @@ -14,6 +14,7 @@ usr/include/mariadb/mariadb_version.h
usr/include/mariadb/my_config.h
usr/include/mariadb/my_global.h
usr/include/mariadb/my_sys.h
usr/include/mariadb/my_alloca.h
usr/include/mariadb/mysql.h
usr/include/mariadb/mysql/
usr/include/mariadb/mysql/client_plugin.h
Expand Down
3 changes: 3 additions & 0 deletions include/CMakeLists.txt
Expand Up @@ -37,6 +37,7 @@ SET(HEADERS
ma_dyncol.h
my_list.h
my_alloc.h
my_alloca.h
typelib.h
my_dbug.h
m_string.h
Expand Down Expand Up @@ -111,7 +112,9 @@ ${footer}
ENDMACRO()

INSTALL_COMPAT_HEADER(my_global.h "")
INSTALL_COMPAT_HEADER(my_alloca.h "")
INSTALL_COMPAT_HEADER(my_config.h "")
INSTALL_COMPAT_HEADER(my_alloca.h "")
INSTALL_COMPAT_HEADER(my_sys.h "")
INSTALL_COMPAT_HEADER(mysql_version.h "
#include <mariadb_version.h>
Expand Down
45 changes: 45 additions & 0 deletions include/my_alloca.h
@@ -0,0 +1,45 @@
/* Copyright (c) 2023, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */

#ifndef MY_ALLOCA_INCLUDED
#define MY_ALLOCA_INCLUDED

#ifdef _WIN32
#include <malloc.h> /*for alloca*/
/*
MSVC may define "alloca" when compiling in /Ze mode
(with extensions from Microsoft), but otherwise only
the _alloca function is defined:
*/
#ifndef alloca
#define alloca _alloca
#endif
#else
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#endif

#if defined(HAVE_ALLOCA)
/*
If the GCC/LLVM compiler from the MinGW is used,
alloca may not be defined when using the MSVC CRT:
*/
#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && !defined(alloca)
#define alloca __builtin_alloca
#endif /* GNUC */
#endif

#endif /* MY_ALLOCA_INCLUDED */
8 changes: 1 addition & 7 deletions include/my_global.h
Expand Up @@ -318,13 +318,6 @@ C_MODE_END
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA)
#undef HAVE_ALLOCA
#undef HAVE_ALLOCA_H
#endif
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif

#include <errno.h> /* Recommended by debian */
/* We need the following to go around a problem with openssl on solaris */
Expand Down Expand Up @@ -481,6 +474,7 @@ typedef unsigned short ushort;
#endif

#include <my_compiler.h>
#include <my_alloca.h>

/*
Wen using the embedded library, users might run into link problems,
Expand Down
14 changes: 1 addition & 13 deletions include/my_sys.h
Expand Up @@ -28,9 +28,7 @@ C_MODE_START
#include <m_ctype.h> /* for CHARSET_INFO */
#include <stdarg.h>
#include <typelib.h>
#ifdef _WIN32
#include <malloc.h> /*for alloca*/
#endif
#include <my_alloca.h>
#include <mysql/plugin.h>
#include <mysql/service_my_print_error.h>

Expand Down Expand Up @@ -185,16 +183,6 @@ my_bool my_test_if_atomic_write(File handle, int pagesize);
extern my_bool my_may_have_atomic_write;

#if defined(HAVE_ALLOCA) && !defined(HAVE_valgrind)
#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43)
#pragma alloca
#endif /* _AIX */
#if defined(__MWERKS__)
#undef alloca
#define alloca _alloca
#endif /* __MWERKS__ */
#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
#define alloca __builtin_alloca
#endif /* GNUC */
#define my_alloca(SZ) alloca((size_t) (SZ))
#define my_afree(PTR) ((void)0)
#define MAX_ALLOCA_SZ 4096
Expand Down
11 changes: 4 additions & 7 deletions include/mysql/service_encryption.h
Expand Up @@ -24,22 +24,19 @@
*provider* (encryption plugin).
*/

#ifdef __cplusplus
extern "C" {
#endif

#ifndef MYSQL_ABI_CHECK
#include <my_alloca.h>
#ifdef _WIN32
#include <malloc.h>
#ifndef __cplusplus
#define inline __inline
#endif
#else
#include <stdlib.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* returned from encryption_key_get_latest_version() */
Expand Down
2 changes: 1 addition & 1 deletion plugin/cracklib_password_check/cracklib_password_check.c
Expand Up @@ -13,7 +13,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */

#include <my_global.h>
#include <my_alloca.h>
#include <mysql/plugin_password_validation.h>
#include <crack.h>
#include <string.h>
Expand Down
5 changes: 1 addition & 4 deletions plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp
Expand Up @@ -6,7 +6,7 @@
* See COPYRIGHT.txt for details.
*/

#include <my_global.h>
#include <my_alloca.h>
#include <netinet/in.h>
#include <errno.h>
#include <poll.h>
Expand All @@ -17,9 +17,6 @@
#if __linux__
#include <sys/epoll.h>
#endif
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif

#include "hstcpsvr_worker.hpp"
#include "string_buffer.hpp"
Expand Down
1 change: 1 addition & 0 deletions plugin/handler_socket/libhsclient/allocator.hpp
Expand Up @@ -11,6 +11,7 @@

#include <stdlib.h>
#include <string.h>
#include <my_alloca.h>

#if 0
extern "C" {
Expand Down

2 comments on commit 1e58b8a

@Vaibhav992
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alloca.h is not a standard header file, it may not be available on all platforms and compilers. In addition, the use of alloca is generally discouraged because it can lead to stack overflow or other memory-related issues.

@grooverdan
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alloca.h is not a standard header file, it may not be available on all platforms and compilers.

yes, covered by #ifdef HAVE_ALLOCA_H check.

In addition, the use of alloca is generally discouraged because it can lead to stack overflow or other memory-related issues.

The use of alloca in the server is rather limited for this reason. ref: #2321 (comment)

Please sign in to comment.