From a608637768ee84a32e4e64223fa9c75e5e2776dd Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 9 Jun 1998 17:13:06 +0000 Subject: [PATCH] Another for for exec() removal and finding binaries. --- src/backend/postmaster/postmaster.c | 8 ++--- src/backend/tcop/postgres.c | 6 ++-- src/backend/utils/init/findbe.c | 54 +++++++++++++++-------------- src/include/miscadmin.h | 6 ++-- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index b657a2a64a..c1757b1089 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.85 1998/06/09 04:06:12 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.86 1998/06/09 17:13:03 momjian Exp $ * * NOTES * @@ -324,7 +324,7 @@ PostmasterMain(int argc, char *argv[]) new_argv[i] = ""; new_argv[4] = NULL; - if (!Execfile[0] && FindExec(Execfile, argv[0]) < 0) + if (!Execfile[0] && FindExec(Execfile, argv[0], "postmaster") < 0) { fprintf(stderr, "%s: could not find postmaster to execute...\n", argv[0]); @@ -385,7 +385,7 @@ PostmasterMain(int argc, char *argv[]) break; case 'b': /* Set the backend executable file to use. */ - if (!ValidateBackend(optarg)) + if (!ValidateBinary(optarg)) strcpy(Execfile, optarg); else { @@ -479,7 +479,7 @@ PostmasterMain(int argc, char *argv[]) exit(2); } - if (!Execfile[0] && FindExec(Execfile, argv[0]) < 0) + if (!Execfile[0] && FindExec(Execfile, argv[0], "postgres") < 0) { fprintf(stderr, "%s: could not find backend to execute...\n", argv[0]); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index e2a778b491..e0d8599465 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.74 1998/06/08 22:28:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.75 1998/06/09 17:13:04 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1167,7 +1167,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) SetCharSet(); #endif - if (FindExec(pg_pathname, argv[0]) < 0) + if (FindExec(pg_pathname, argv[0], "postgres") < 0) elog(FATAL, "%s: could not locate executable, bailing out...", argv[0]); @@ -1314,7 +1314,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface"); - puts("$Revision: 1.74 $ $Date: 1998/06/08 22:28:27 $"); + puts("$Revision: 1.75 $ $Date: 1998/06/09 17:13:04 $"); } /* ---------------- diff --git a/src/backend/utils/init/findbe.c b/src/backend/utils/init/findbe.c index 74571ebc4a..e84256d6de 100644 --- a/src/backend/utils/init/findbe.c +++ b/src/backend/utils/init/findbe.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.8 1998/06/08 22:28:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.9 1998/06/09 17:13:05 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -34,14 +34,14 @@ #endif /* - * ValidateBackend -- validate "path" as a POSTGRES executable file + * ValidateBinary -- validate "path" as a POSTMASTER/POSTGRES executable file * * returns 0 if the file is found and no error is encountered. * -1 if the regular file "path" does not exist or cannot be executed. * -2 if the file is otherwise valid but cannot be read. */ int -ValidateBackend(char *path) +ValidateBinary(char *path) { struct stat buf; uid_t euid; @@ -61,7 +61,7 @@ ValidateBackend(char *path) if (strlen(path) >= MAXPGPATH) { if (DebugLvl > 1) - fprintf(stderr, "ValidateBackend: pathname \"%s\" is too long\n", + fprintf(stderr, "ValidateBinary: pathname \"%s\" is too long\n", path); return (-1); } @@ -69,14 +69,14 @@ ValidateBackend(char *path) if (stat(path, &buf) < 0) { if (DebugLvl > 1) - fprintf(stderr, "ValidateBackend: can't stat \"%s\"\n", + fprintf(stderr, "ValidateBinary: can't stat \"%s\"\n", path); return (-1); } if (!(buf.st_mode & S_IFREG)) { if (DebugLvl > 1) - fprintf(stderr, "ValidateBackend: \"%s\" is not a regular file\n", + fprintf(stderr, "ValidateBinary: \"%s\" is not a regular file\n", path); return (-1); } @@ -85,7 +85,7 @@ ValidateBackend(char *path) * Ensure that we are using an authorized backend. * * XXX I'm open to suggestions here. I would like to enforce ownership - * of backends by user "postgres" but people seem to like to run as + * of binaries by user "postgres" but people seem to like to run as * users other than "postgres"... */ @@ -102,7 +102,7 @@ ValidateBackend(char *path) is_r = buf.st_mode & S_IRUSR; is_x = buf.st_mode & S_IXUSR; if (DebugLvl > 1 && !(is_r && is_x)) - fprintf(stderr, "ValidateBackend: \"%s\" is not user read/execute\n", + fprintf(stderr, "ValidateBinary: \"%s\" is not user read/execute\n", path); return (is_x ? (is_r ? 0 : -2) : -1); } @@ -130,7 +130,7 @@ ValidateBackend(char *path) is_r = buf.st_mode & S_IRGRP; is_x = buf.st_mode & S_IXGRP; if (DebugLvl > 1 && !(is_r && is_x)) - fprintf(stderr, "ValidateBackend: \"%s\" is not group read/execute\n", + fprintf(stderr, "ValidateBinary: \"%s\" is not group read/execute\n", path); return (is_x ? (is_r ? 0 : -2) : -1); } @@ -138,7 +138,7 @@ ValidateBackend(char *path) is_r = buf.st_mode & S_IROTH; is_x = buf.st_mode & S_IXOTH; if (DebugLvl > 1 && !(is_r && is_x)) - fprintf(stderr, "ValidateBackend: \"%s\" is not other read/execute\n", + fprintf(stderr, "ValidateBinary: \"%s\" is not other read/execute\n", path); return (is_x ? (is_r ? 0 : -2) : -1); } @@ -147,11 +147,12 @@ ValidateBackend(char *path) * FindExec -- find an absolute path to a valid backend executable * * The reason we have to work so hard to find an absolute path is that - * we need to feed the backend server the location of its actual - * executable file -- otherwise, we can't do dynamic loading. + * we need to feed the binary the location of its actual executable file, + * otherwise, we can't do dynamic loading. It needs a full pathname because + * we change directories to the /data directory. */ int -FindExec(char *backend, char *argv0) +FindExec(char *full_path, char *argv0, char *binary_name) { char buf[MAXPGPATH + 2]; char *p; @@ -161,7 +162,7 @@ FindExec(char *backend, char *argv0) int pathlen; /* - * for the postmaster: First try: use the backend that's located in + * for the postmaster: First try: use the binary that's located in * the same directory as the postmaster, if it was invoked with an * explicit path. Presumably the user used an explicit path because it * wasn't in PATH, and we don't want to use incompatible executables. @@ -171,7 +172,7 @@ FindExec(char *backend, char *argv0) * trees (obj/post{master,gres}) because they all put the two binaries * in the same place. * - * for the backend server: First try: if we're given some kind of path, + * for the binary: First try: if we're given some kind of path, * use it (making sure that a relative path is made absolute before * returning it). */ @@ -183,16 +184,16 @@ FindExec(char *backend, char *argv0) strcat(buf, "/"); strcat(buf, argv0); p = strrchr(buf, '/'); - strcpy(++p, "postgres"); - if (!ValidateBackend(buf)) + strcpy(++p, binary_name); + if (!ValidateBinary(buf)) { - strncpy(backend, buf, MAXPGPATH); + strncpy(full_path, buf, MAXPGPATH); if (DebugLvl) fprintf(stderr, "FindExec: found \"%s\" using argv[0]\n", - backend); + full_path); return (0); } - fprintf(stderr, "FindExec: invalid backend \"%s\"\n", + fprintf(stderr, "FindExec: invalid binary \"%s\"\n", buf); return (-1); } @@ -219,20 +220,21 @@ FindExec(char *backend, char *argv0) if (*startp == '/' || !getcwd(buf, MAXPGPATH)) buf[0] = '\0'; strcat(buf, startp); - strcat(buf, "/postgres"); - switch (ValidateBackend(buf)) + strcat(buf, "/"); + strcat(buf, binary_name); + switch (ValidateBinary(buf)) { case 0: /* found ok */ - strncpy(backend, buf, MAXPGPATH); + strncpy(full_path, buf, MAXPGPATH); if (DebugLvl) fprintf(stderr, "FindExec: found \"%s\" using PATH\n", - backend); + full_path); free(path); return (0); case -1: /* wasn't even a candidate, keep looking */ break; case -2: /* found but disqualified */ - fprintf(stderr, "FindExec: could not read backend \"%s\"\n", + fprintf(stderr, "FindExec: could not read binary \"%s\"\n", buf); free(path); return (-1); @@ -243,6 +245,6 @@ FindExec(char *backend, char *argv0) free(path); } - fprintf(stderr, "FindExec: could not find a backend to execute...\n"); + fprintf(stderr, "FindExec: could not find a %s to execute...\n", binary_name); return (-1); } diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 0c6dcfaaf9..6f4d6f4028 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -11,7 +11,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: miscadmin.h,v 1.25 1998/06/08 22:28:30 momjian Exp $ + * $Id: miscadmin.h,v 1.26 1998/06/09 17:13:06 momjian Exp $ * * NOTES * some of the information in this file will be moved to @@ -125,8 +125,8 @@ extern char *getpgusername(void); extern void SetPgUserName(void); extern Oid GetUserId(void); extern void SetUserId(void); -extern int ValidateBackend(char *path); -extern int FindExec(char *backend, char *argv0); +extern int ValidateBinary(char *path); +extern int FindExec(char *backend, char *argv0, char *binary_name); extern int CheckPathAccess(char *path, char *name, int open_mode); /* lower case version for case-insensitive SQL referenced in pg_proc.h */ -- GitLab