Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Dec 2002 18:37:31 -0500 (EST)
From:      Tony Gogoi <tgogoi@cse.Buffalo.EDU>
To:        <freebsd-fs@freebsd.org>
Subject:   Question on the NULLFS file-system
Message-ID:  <Pine.SOL.4.30.0212231823330.24955-100000@pollux.cse.buffalo.edu>

next in thread | raw e-mail | index | archive | help
Hi everyone,

I was referred by someone to post my question here. Will be very grateful
if someone would respond....

I modified sys/miscfs/nullfs/null_vnops.c so that it now includes a
null_write and a null_read system call. The purpose is simple encryption.
Any file that has its first 3 characters as "---" would be encrpted such
that whats stored in the lowest layer (ufs) would be one ascii character
higher. Example if I do "vi N" and then store ---ABCD in the file, it gets
stored as ---BCDE ( i don't encrypt the -'s). This works when I use 'vi'

BUT when I write a simple program which has something like
/* start of test program */
#include <stdio.h>
#include <fcntl.h>

int main()
{

        int fd = 0;
        char buff[100];
        fd = open("N",O_RDWR|O_CREAT);

        if(fd < 0)
        {
                perror("open failed\n");
                exit(1);
        }

        write(fd,"---Tony\nabcdefg",17);
        close(fd);
        return 0;
}
/* end of test program */
/***************************************.

Then the kernel crashes. It crashes whenever the first 3 characters of the
file are "---" sa then encryption needs to be performed.

Why does null_write system call work properly when I use "vi" but crashes
when i write such a simple test program ?

Below if the code I worte for null_write :
/***************************************************************************/
static int null_write(ap)
 struct vop_write_args /* {
                struct vnode *a_vp;
                struct uio *a_uio;
                int  a_ioflag;
                struct ucred *a_cred;
        } */ *ap;
{

        int error;

        char *ptr_buffer;
        int i, j, Limit, Flag ;

        ptr_buffer = ap->a_uio->uio_iov[0].iov_base;

        if(ap->a_uio->uio_iovcnt > 1)
        {
                Limit = 3;
        }
        else
        {
                if(ap->a_uio->uio_iov[0].iov_len > 3)
                        Limit = 3;
                else    Limit = ap->a_uio->uio_iov[0].iov_len;
        }

        Flag = 1;

/*************************************************************************/
        /* check if encryption requested */
        if(Limit==3)
        {
                if(ptr_buffer[0]=='-' && ptr_buffer[1]=='-' && ptr_buffer[2]=='-')
                {
                        Flag = 0;
                }
        }

/*************************************************************************/

        if(Flag==0)
        {
                for(i=0;i<ap->a_uio->uio_iovcnt;i++)
                {
                        ptr_buffer = ap->a_uio->uio_iov[i].iov_base;
                        for(j=0;j<ap->a_uio->uio_iov[i].iov_len;j++)
                        {
                                if((ptr_buffer[j] != '-') && (ptr_buffer[j] != '\n'))
                                {
                                        ptr_buffer[j] = ptr_buffer[j] + 1;

                                }

                        }

                }
        }
        if ((error = null_bypass((struct vop_generic_args *)ap)) != 0)
                return (error);


	return(0);
}

/* end of null_write code */
/*****************************************************************************************/


thanks for your time.

Tony Gogoi



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SOL.4.30.0212231823330.24955-100000>