discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Q] NSS(Name Service Switch) Problem with GNUstep(Revisited)


From: Sungjin Chun
Subject: Re: [Q] NSS(Name Service Switch) Problem with GNUstep(Revisited)
Date: Mon, 05 Apr 2004 17:39:42 +0900

I think why sshd/su etc., does exit, I do not know why this occurs but during
forking (maybe shell ?) it receives SIGSEGV. Here's revised nss.m and
su.strace file. I hope someone can help me :-)

<nss.m>
<su.strace>

On 2004-04-05 17:22:58 +0900 Sungjin Chun <chunsj@embian.com> wrote:

Hi,
As some of you might already know, I'm currently trying to develop authentication service with GNUstep (But very in early stage, so not push me hard :-). I also want to use GNUstep for developing NSS module. But as I said my old previous mail, if I link nss module with GNUstep, it does not work well with other services. For example, simply linking gnustep-base, the sshd service does not let me login, I can just pass the authentication process, then disconnected.

So, here comes the question, what is the real difference or what kind of operation occurs when the nss module is linked with gnustep-base ? Attached file is used for testing. If it just is compiled with

gcc -I/System/Library/Headers -fconstant-string-class=NSConstantString -shared -o libnss_objc.so nss.m \
-lpthread -L/System/Library/Libraries -lobjc

then, every thing just works (also works with basic libobjc class libraries, I've test it with NXConstantString)

but if you append -lgnustep-base before -lobjc, then the problem I descrived above occurs.

Thanks in advance.

<nss.m>
#include <errno.h>
#include <nss.h>
#include <pwd.h>
#include <grp.h>
#include <shadow.h>
#include <string.h>
#include <sys/types.h>
#include <syslog.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
//#include <Foundation/Foundation.h>

#define align(ptr, blen, TYPE) \
    do { \
        char *qtr = ptr; \
        ptr += sizeof(TYPE) - 1; \
        ptr -= ((ptr - (char *)NULL) % sizeof(TYPE)); \
        blen -= (ptr - qtr); \
    } while (0)

static int gnIdxPwd = 0;
static int gnIdxSpw = 0;
static int gnIdxGrp = 0;

//static NSAutoreleasePool* mainPool = nil;

int _nss_objc_getpwuid_r (uid_t, struct passwd *, char *, size_t, int *);
int _nss_objc_setpwent (void);
int _nss_objc_getpwent_r (struct passwd *, char *, size_t, int *);
int _nss_objc_endpwent (void);
int _nss_objc_getpwnam_r (const char *, struct passwd *, char *, size_t, int *);

int _nss_objc_getspnam_r (const char *, struct spwd *, char *, size_t, int *);
int _nss_objc_setspend (void);
int _nss_objc_getspent_r (struct spwd *, char *buffer, size_t, int *);
int _nss_objc_endspent (void);

int _nss_objc_initgroups (const char *user, gid_t group, long *start,
        long int *size, gid_t *groups, long int limit, int *errnop);
int _nss_objc_setgrent (void);
int _nss_objc_endgrent (void);
int _nss_objc_getgrent_r (struct group *gr,
        char *buffer, size_t buflen, int *erronp);
int _nss_objc_getgrnam_r (const char *name, struct group *gr,
        char *buffer, size_t buflen, int *errnop);
int _nss_objc_getgrgid_r (const gid_t gid, struct group *gr,
        char *buffer, size_t buflen, int *errnop);

static int _nss_objc_client_initialize (void);
static char *_nss_objc_copy_to_buffer (char **buffer, size_t *buflen,
        const char *string);
static void _nss_objc_log (int err, const char *format, ...);

static int _nss_objc_account_to_pwd (struct passwd *, void *, int *,
        char *, size_t);
static int _nss_objc_account_to_spw (struct spwd *, void *, int *,
        char *, size_t);

static int _nss_objc_group_to_grp (struct group *, void *, int *,
        char *, size_t);

int
_nss_objc_getpwuid_r (uid_t uid, struct passwd *pw, char *buffer,
        size_t buflen, int *errnop)
{
    uid_t nUID = uid;
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

    if (uid == 10000)
status = _nss_objc_account_to_pwd(pw, NULL, errnop, buffer, buflen);
    else
        status = NSS_STATUS_NOTFOUND;

    return status;
}

int
_nss_objc_setpwent (void)
{
    gnIdxPwd = 0;
    return NSS_STATUS_SUCCESS;
}

int
_nss_objc_getpwent_r (struct passwd *pw, char *buffer, size_t buflen,
        int *errnop)
{
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

    if (gnIdxPwd == 0) {
status = _nss_objc_account_to_pwd(pw, NULL, errnop, buffer, buflen);
        gnIdxPwd++;
    }
    else
        status = NSS_STATUS_NOTFOUND;

    return status;
}

int
_nss_objc_endpwent (void)
{
    gnIdxPwd = 0;
    return NSS_STATUS_SUCCESS;
}

int
_nss_objc_getpwnam_r (const char *name, struct passwd *pw, char *buffer,
        size_t buflen, int *errnop)
{
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

    if (strcmp(name, "testuser") == 0)
status = _nss_objc_account_to_pwd(pw, NULL, errnop, buffer, buflen);
    else
        status = NSS_STATUS_NOTFOUND;

    return status;
}

int
_nss_objc_getspnam_r (const char *name, struct spwd *spw, char *buffer,
        size_t buflen, int *errnop)
{
    int status;

    if (getuid() != 0) {
        return NSS_STATUS_NOTFOUND;
    }

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

    if (strcmp(name, "testuser") == 0)
status = _nss_objc_account_to_spw(spw, NULL, errnop, buffer, buflen);
    else
        status = NSS_STATUS_NOTFOUND;

    return status;
}

int
_nss_objc_setspent (void)
{
    gnIdxSpw = 0;
    return NSS_STATUS_SUCCESS;
}

int
_nss_objc_getspent_r (struct spwd *spw, char *buffer, size_t buflen,
        int *errnop)
{
    int status;

    if (getuid() != 0) {
        return NSS_STATUS_NOTFOUND;
    }

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

    if (gnIdxSpw == 0) {
status = _nss_objc_account_to_spw(spw, NULL, errnop, buffer, buflen);
        gnIdxSpw++;
    }
    else
        status = NSS_STATUS_NOTFOUND;

    return status;
}

int
_nss_objc_endspent (void)
{
    gnIdxSpw = 0;
    return NSS_STATUS_SUCCESS;
}

static int
_nss_objc_client_initialize (void)
{
    static int bInitialized = 0;
    if (!bInitialized) {
        //mainPool = [[NSAutoreleasePool alloc] init];
        bInitialized = 1;
    }
    return 0;
}

static char *
_nss_objc_copy_to_buffer (char **buffer, size_t *buflen, const char *string)
{
    size_t len = strlen(string) + 1;
    char *ptr;

    if (buflen && len > (*buflen)) {
        return NULL;
    }

    memcpy(*buffer, string, len);
    if (buflen)
        *buflen -= len;
    ptr = *buffer;
    (*buffer) += len;

    return ptr;
}

static void _nss_objc_log (int err, const char *format, ...)
{
    static int openlog_ac = 0;
    va_list ap;

    va_start(ap, format);
    if (!openlog_ac) {
        ++openlog_ac;
        openlog("nss-objc", LOG_PID, LOG_AUTH);
    }

    vsyslog(err, format, ap);
    va_end(ap);

    closelog();
    openlog_ac--;
}

static int
_nss_objc_account_to_pwd (struct passwd *pw, void *pacnt,
        int *errnop, char *buffer, size_t buflen)
{
    *errnop = ENOENT;

pw->pw_name = _nss_objc_copy_to_buffer(&buffer, &buflen, "testuser");
    if (!pw->pw_name) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }

    pw->pw_passwd = _nss_objc_copy_to_buffer(&buffer, &buflen, "x");
    if (!pw->pw_passwd) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }

    pw->pw_uid = 10000;
    pw->pw_gid = 100;

pw->pw_gecos = _nss_objc_copy_to_buffer(&buffer, &buflen, "Gecos");
    if (!pw->pw_gecos) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }
pw->pw_dir = _nss_objc_copy_to_buffer(&buffer, &buflen, "/tmp");
    if (!pw->pw_dir) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }
pw->pw_shell = _nss_objc_copy_to_buffer(&buffer, &buflen, "/bin/bash");
    if (!pw->pw_shell) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }

    *errnop = 0;
    return NSS_STATUS_SUCCESS;
}

static int
_nss_objc_account_to_spw (struct spwd *spw, void *pacnt, int *errnop,
        char *buffer, size_t buflen)
{
    *errnop = ENOENT;

spw->sp_namp = _nss_objc_copy_to_buffer(&buffer, &buflen, "testuser");
    if (!spw->sp_namp) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }
spw->sp_pwdp = _nss_objc_copy_to_buffer(&buffer, &buflen, "8ws.Mm8zU6fbU");
    if (!spw->sp_pwdp) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }

    spw->sp_lstchg = 12459;
    spw->sp_min = 0;
    spw->sp_max = 99999;
    spw->sp_warn = 7;
    spw->sp_inact = -1;
    spw->sp_expire = -1;
    spw->sp_flag = -1;
*errnop = 0;
    return NSS_STATUS_SUCCESS;
}

int _nss_objc_initgroups (const char *user, gid_t group, long *start,
        long int *size, gid_t *groups, long int limit, int *errnop)
{
    return NSS_STATUS_SUCCESS;
}

int _nss_objc_setgrent (void)
{
    gnIdxGrp = 0;
    return NSS_STATUS_SUCCESS;
}

int _nss_objc_endgrent (void)
{
    gnIdxGrp = 0;
    return NSS_STATUS_SUCCESS;
}

int _nss_objc_getgrent_r (struct group *gr,
        char *buffer, size_t buflen, int *errnop)
{
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

status = _nss_objc_group_to_grp(gr, NULL, errnop, buffer, buflen);

    return status;
}

int _nss_objc_getgrnam_r (const char *name, struct group *gr,
        char *buffer, size_t buflen, int *errnop)
{
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

status = _nss_objc_group_to_grp(gr, NULL, errnop, buffer, buflen);

    return status;
}

int _nss_objc_getgrgid_r (const gid_t gid, struct group *gr,
        char *buffer, size_t buflen, int *errnop)
{
    gid_t nGID = gid;
    int status;

    if (_nss_objc_client_initialize()) {
        return NSS_STATUS_NOTFOUND;
    }

status = _nss_objc_group_to_grp(gr, NULL, errnop, buffer, buflen);

    return status;
}

static int _nss_objc_group_to_grp (struct group *gr, void *pgrp, int *errnop,
        char *buffer, size_t buflen)
{
    char *pszMembers;
    char **members;
    char *pszMember;
    int n, i;
    char *pch;
    int stringOffset;

    *errnop = ENOENT;

    if (1) {
        return NSS_STATUS_NOTFOUND;
    }
*errnop = 0;
    return NSS_STATUS_SUCCESS;
}

_______________________________________________
Discuss-gnustep mailing list
Discuss-gnustep@gnu.org
http://mail.gnu.org/mailman/listinfo/discuss-gnustep

Attachment: nss.m
Description: Text document

Attachment: su.strace
Description: Binary data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]