Ошибка сегментации в этой оболочке C

Я новичок в C, и это простая оболочка (rootsetuidwrapper.c), написанная для выполнения сценариев от имени другого пользователя. Сценарий, который я хочу выполнить, - это ubuntu-server-secure.sh по пути (/home/neehar) от имени пользователя root. Моя операционная система Ubuntu 12.04.03 LTS. Может кто-нибудь помочь мне исправить эти ошибки? Я скомпилировал с помощью gcc и вызвал скомпилированный код как rootuidwrap, выполнив gcc -o rootsuidwrap rootsetuidwrapper.c, Когда я запустил его в терминале, выполнив./rootsuidwrap ubuntu-server-secure.sh [0]. Это правильный способ назвать это? Часть использования в коде говорит сделать это таким образом. Он говорит: Segmentation Fault (core dumped), Должно ли это быть с этим разделом кода: *user=cuserid(NULL);, Это может быть жульнический указатель. Если так, что бы исправить и как бы это выглядело?

Было бы хорошо, если бы кто-то мог исправить эти ошибки и дать мне рабочий код. Кроме того, я хотел бы знать, что я сделал не так.

 * This program must be run as root to work.
 */

#if !defined(lint) && !defined(SABER) || defined(RCS_HDRS)
#endif /* !lint && !SABER || RCS_HDRS */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/stat.h>

#define TRUSTED_GROUP "trusted"

typedef enum { false = 0, true } bool;

#ifdef __STDC__
bool trusted(char *whoami)
#else
bool trusted(whoami)
  char *whoami;
#endif /* __STDC__ */
{
    char *user;
    char host[BUFSIZ + 1];
    char domain[BUFSIZ + 1];
    struct hostent *hp;

    /* 
     * Figure out whether this user on this host in this domain is
     * trusted.
     */

    /* 
     * Determine our domain name
     */
    memset (domain, '\0', sizeof domain );
    getdomainname (domain, sizeof domain - 1);

    /* 
     * Figure out our fully canonicalized hostname
     */

    memset (host, '\0', sizeof host );
    gethostname (host, sizeof host - 1);
    if ((hp = gethostbyname (host)) == NULL) {
      strcat (host, ".");
      strcat (host, domain);
      fprintf (stderr, 
               "%s: WARNING: can't canonlicalize hostname; assuming %s.\n",
               whoami, host);
    } else {
      strcpy (host, hp->h_name);
    }

    /* 
     * Get login name of current user
     */
    *user = cuserid (NULL);        
    if (user == NULL) {
      fprintf (stderr, " %s: You do not seem to be in the passwd file!\n",
               whoami);
      return false;
    }

    /* 
     * Look this triple up in the trusted netgroup 
     */

    return (innetgr (TRUSTED_GROUP, host, user, domain) == 1) ? true : false;
}


#ifdef __STDC__
main(int argc, char *argv[])
#else
main(argc, argv)
  int argc;
  char *argv[];
#endif /* __STDC__ */
{
    char *whoami;
    int ouruid;         /* uid we set to run chown and chmod */
    int proguid;        /* uid we are chowning program to */
    char *filename;
    struct stat statbuf;
    int error = 0;

    if (whoami = strrchr(argv[0], '/')) 
      whoami++;
    else
      whoami = argv[0];

    if (argc == 3)
      proguid = atoi(argv[2]);
    else if (argc == 2)
      proguid = 0;
    else {
      fprintf (stderr, "usage: %s filename [proguid]\n", whoami);
      exit(1);
    }

    filename = argv[1];

    if (trusted(whoami)) 
      ouruid = 0;
    else
      ouruid = getuid ();

    if (setuid (ouruid) == -1) {
      fprintf (stderr, "%s: Warning: setuid(%d) failed: ", whoami, ouruid);
      perror (NULL);
      exit (1);
    }

    if (stat (filename, &statbuf, sizeof(struct stat)) == -1) {
      fprintf(stderr, "%s: failure statting %s: ", whoami, filename);
      perror(NULL);
      exit(1);
    }

    if (chown (filename, proguid, -1) == -1) {
      error++;
      fprintf (stderr, "%s: chown %d %s failed: ", whoami, proguid, filename);
      perror (NULL);
      fprintf (stderr, "continuing...\n");
    }

    if (chmod (filename, statbuf.st_mode | S_ISUID)) {
      error++;
      fprintf (stderr, "%s: chmod u+s %s failed: ", whoami, filename);
      perror (NULL);
    }

    return(error);
}

Помощь приветствуется,

1 ответ

Решение

Пытаться,

user = cuserid (NULL);

Вместо

*user = cuserid (NULL);

Пока программа компилировалась, компилятор, вероятно, отображал предупреждение, относящееся к этой строке. Я изучил бы любые другие предупреждения, которые вы получаете при компиляции программы, и работал бы над их удалением.

Другие вопросы по тегам