Skip to content

Commit

Permalink
Avoid including <pwd.h> in C++ code (bug #64709).
Browse files Browse the repository at this point in the history
* liboctave/wrappers/pwd-wrappers.c, pwd-wrappers.h: Add wrappers for functions
from <pwd.h>.
* liboctave/warppers/module.mk: Add new files to build rules.
* liboctave/system/oct-password.cc: Use new wrappers instead of directly
including <pwd.h>.
  • Loading branch information
mmuetzel committed Sep 27, 2023
1 parent 313c171 commit c41e140
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 18 deletions.
34 changes: 16 additions & 18 deletions liboctave/system/oct-password.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,9 @@

#include <sys/types.h>

#if defined (HAVE_PWD_H)
# include <pwd.h>
#endif

#include "lo-error.h"
#include "oct-password.h"
#include "pwd-wrappers.h"

#define NOT_SUPPORTED(nm) \
nm ": not supported on this system"
Expand Down Expand Up @@ -125,7 +122,7 @@ password::getpwent (std::string& msg)
{
#if defined HAVE_GETPWENT
msg = "";
return password (::getpwent (), msg);
return password (octave_getpwent_wrapper (), msg);
#else
msg = NOT_SUPPORTED ("getpwent");
return password ();
Expand All @@ -144,7 +141,7 @@ password::getpwuid (uid_t uid, std::string& msg)
{
#if defined (HAVE_GETPWUID)
msg = "";
return password (::getpwuid (uid), msg);
return password (octave_getpwuid_wrapper (uid), msg);
#else
octave_unused_parameter (uid);

Expand All @@ -165,7 +162,7 @@ password::getpwnam (const std::string& nm, std::string& msg)
{
#if defined (HAVE_GETPWNAM)
msg = "";
return password (::getpwnam (nm.c_str ()), msg);
return password (octave_getpwnam_wrapper (nm.c_str ()), msg);
#else
octave_unused_parameter (nm);

Expand All @@ -186,7 +183,7 @@ password::setpwent (std::string& msg)
{
#if defined (HAVE_SETPWENT)
msg = "";
::setpwent ();
octave_setpwent_wrapper ();
return 0;
#else
msg = NOT_SUPPORTED ("setpwent");
Expand All @@ -206,7 +203,7 @@ password::endpwent (std::string& msg)
{
#if defined (HAVE_ENDPWENT)
msg = "";
::endpwent ();
octave_endpwent_wrapper ();
return 0;
#else
msg = NOT_SUPPORTED ("endpwent");
Expand All @@ -223,15 +220,16 @@ password::password (void *p, std::string& msg)

if (p)
{
struct ::passwd *pw = static_cast<struct ::passwd *> (p);

m_name = pw->pw_name;
m_passwd = pw->pw_passwd;
m_uid = pw->pw_uid;
m_gid = pw->pw_gid;
m_gecos = pw->pw_gecos;
m_dir = pw->pw_dir;
m_shell = pw->pw_shell;
struct octave_passwd_wrapper pw;
octave_from_passwd (static_cast<struct ::passwd *> (p), &pw);

m_name = pw.pw_name;
m_passwd = pw.pw_passwd;
m_uid = pw.pw_uid;
m_gid = pw.pw_gid;
m_gecos = pw.pw_gecos;
m_dir = pw.pw_dir;
m_shell = pw.pw_shell;

m_valid = true;
}
Expand Down
2 changes: 2 additions & 0 deletions liboctave/wrappers/module.mk
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ NOINSTALL_WRAPPERS_INC = \
%reldir%/nproc-wrapper.h \
%reldir%/octave-popen2.h \
%reldir%/putenv-wrapper.h \
%reldir%/pwd-wrappers.h \
%reldir%/set-program-name-wrapper.h \
%reldir%/signal-wrappers.h \
%reldir%/stat-wrappers.h \
Expand Down Expand Up @@ -65,6 +66,7 @@ WRAPPERS_SRC = \
%reldir%/nproc-wrapper.c \
%reldir%/octave-popen2.c \
%reldir%/putenv-wrapper.c \
%reldir%/pwd-wrappers.c \
%reldir%/set-program-name-wrapper.c \
%reldir%/signal-wrappers.c \
%reldir%/stat-wrappers.c \
Expand Down
102 changes: 102 additions & 0 deletions liboctave/wrappers/pwd-wrappers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2023 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave 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, either version 3 of the License, or
// (at your option) any later version.
//
// Octave 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 Octave; see the file COPYING. If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

// pwd.h might set some preprocessor definitions that replace Octave functions
// in compilation units where it is included. Use these wrappers to avoid that.

#if defined (HAVE_CONFIG_H)
# include "config.h"
#endif

#if defined (HAVE_PWD_H)
# include <pwd.h>
#endif

#include "pwd-wrappers.h"

struct passwd *octave_getpwent_wrapper (void)
{
#if defined HAVE_GETPWENT
return getpwent ();
#else
return NULL;
#endif
}

struct passwd *octave_getpwuid_wrapper (uid_t uid)
{
#if defined (HAVE_GETPWUID)
return getpwuid (uid);
#else
octave_unused_parameter (uid);

return NULL;
#endif
}

struct passwd *octave_getpwnam_wrapper (const char *nam)
{
#if defined (HAVE_GETPWNAM)
return getpwnam (nam);
#else
octave_unused_parameter (nam);

return NULL;
#endif
}

void octave_setpwent_wrapper (void)
{
#if defined (HAVE_SETPWENT)
setpwent ();
#endif
return;
}

void octave_endpwent_wrapper (void)
{
#if defined (HAVE_ENDPWENT)
endpwent ();
#endif
return;
}

void octave_from_passwd (const struct passwd *pw,
struct octave_passwd_wrapper *oct_pw)
{
#if defined (HAVE_PWD_H)
oct_pw->pw_name = pw->pw_name;
oct_pw->pw_passwd = pw->pw_passwd;
oct_pw->pw_uid = pw->pw_uid;
oct_pw->pw_gid = pw->pw_gid;
oct_pw->pw_gecos = pw->pw_gecos;
oct_pw->pw_dir = pw->pw_dir;
oct_pw->pw_shell = pw->pw_shell;
#else
octave_unused_parameter (pw);
octave_unused_parameter (oct_pw);
#endif
return;
}
71 changes: 71 additions & 0 deletions liboctave/wrappers/pwd-wrappers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2023 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave 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, either version 3 of the License, or
// (at your option) any later version.
//
// Octave 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 Octave; see the file COPYING. If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

#if ! defined (octave_pwd_wrappers_h)
#define octave_pwd_wrappers_h 1

#include <sys/types.h>

#if defined __cplusplus
extern "C" {
#endif

struct passwd;

// We can't include <pwd.h> without the risk of overwriting function names
// with preprocessor deinitions. Define a struct that can hold the needed
// fields, and use a function to convert from struct passwd to it.
struct octave_passwd_wrapper
{
char *pw_name;
char *pw_passwd;
uid_t pw_uid;
gid_t pw_gid;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};

extern OCTAVE_API struct passwd *octave_getpwent_wrapper (void);

extern OCTAVE_API struct passwd *octave_getpwuid_wrapper (uid_t uid);

extern OCTAVE_API struct passwd *octave_getpwnam_wrapper (const char *nam);

extern OCTAVE_API void octave_setpwent_wrapper (void);

extern OCTAVE_API void octave_endpwent_wrapper (void);

extern OCTAVE_API void octave_endpwent_wrapper (void);

extern OCTAVE_API void
octave_from_passwd (const struct passwd *pw,
struct octave_passwd_wrapper *oct_pw);

#if defined __cplusplus
}
#endif

#endif

0 comments on commit c41e140

Please sign in to comment.