All of lore.kernel.org
 help / color / mirror / Atom feed
From: Makan Pourzandi <Makan.Pourzandi@ericsson.com>
To: Chris Wright <chrisw@osdl.org>
Cc: "Serge E. Hallyn" <hallyn@CS.WM.EDU>,
	linux-kernel@vger.kernel.org,
	Axelle Apvrille <axelle.apvrille@trusted-logic.fr>,
	serue@us.ibm.com,
	"David Gordon (QB/EMC)" <David.Gordon@ericsson.com>,
	gaspoucho@yahoo.com
Subject: Re: [ANNOUNCE] Release Digsig 1.3.1: kernel module for run-time a uthentication of binaries
Date: Wed, 22 Sep 2004 11:28:44 -0400	[thread overview]
Message-ID: <41519A2C.2090705@ericsson.com> (raw)
In-Reply-To: <20040911125526.T1924@build.pdx.osdl.net>

Hi all,

We integrated Chris's patch to our cvs source code base. There is a new 
release 1.3.2 at our sourceforge site: 
http://sourceforge.net/projects/disec/.

Best Regards,
Makan


Chris Wright wrote:
> * Makan Pourzandi (QB/EMC) (makan.pourzandi@ericsson.com) wrote:
> 
>>Thanks a lot for your feedback. We'll work on the modifications in
>>the source code mentioned in your email and send out a new release
>>hopefully soon.
> 
> 
> Here's a patch with a bunch of cleanups:
> (sorry it's one big patch, just kept growing...)
> 
> - white space and braces cleanups
> - NULL pointer checks unified as (!ptr)
> - fixup confusion on ERR_PTR vs. NULL (fixes Oopsen)
> - cast on kmalloc is unecessary
> - make anyting static that can be
>   - functions
>   - variables (and remove redundany 0 initialization for static vars)
>   - use static initializers for things like semaphores, lists, locks
>   - remove set_digsig_ops/security_set_operations in favor of
>     statically initiaized digsig_security_ops
> - name change digsig_attribute_st -> digsig_attribute
> - introduce DIGSIG_ATTR macro, and use for attribute initialization
> - change names of sysfs files (in module, and hopefully supporting scripts
>   and programs)
>   - digsig_interface -> key
>   - digsig_revoke -> revoke
> - move extern defs to header files
> - get ifndef/define header bits correct
> - move towards single point of return (goto and error cleanup)
> - fixup memory leaks on error return paths
> - move towards use of error values rather than just -1
> - move ctx cleanup out of digsig_sign_verify_final so that caller is
>   responsible (less confusion and no chance of double free on error
>   cleanup)
> - mark init functions as __init
> - use security_initcall()
> - remove unneeded digsig_init_revocation (list statically initialized now)
> - remove inline on external functions
> - use list_for_each_entry
> - collapse 'n' and 'e' cases in digsig_key_store for raw_public_key allocation
> - remove redundant file->f_security = NULL after digsig_allow_write_access()
> - move list_add_tail() in dsi_sysfs for revoked key into digsig_revocation.c
>   under helper digsig_add_revoked_sig()
> - add revoked_list_lock (used in above helper) for proper list manipulation
> - s/SHA1_TFM/sha1_tfm/ ala CodingStyle
> - fix bogus ctx==NULL check in digsig_sign_verify_update()
> 
> It compiles, and I actually loaded it and ran some tests to make sure
> it still works.  Seems OK.  I didn't work at stressing any of the error
> paths, but I think they are cleaner than they were.
> 
> thanks,
> -chris
> 
> diff -paur digsig-1.3.1.orig/digsig.c digsig-1.3.1/digsig.c
> --- digsig-1.3.1.orig/digsig.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/digsig.c	2004-09-11 11:11:31.000000000 -0700
> @@ -60,18 +60,16 @@
>  #define get_file_security(file) ((unsigned long)(file->f_security))
>  #define set_file_security(file,val) (file->f_security = (void *)val)
>  
> -extern MPI digsig_public_key[2]; /* dsi_sig_verify.c */
> -
>  unsigned long int total_jiffies = 0;
>  
>  /* Allocate and free functions for each kind of security blob. */
> -static struct semaphore digsig_sem;
> +static DECLARE_MUTEX(digsig_sem);
>  
>  /* Indicate if module as key or not */
>  int g_init = 0;
>  
>  /* Keep track of how we are registered */
> -int secondary = 0;
> +static int secondary;
>  
>  #ifdef DIGSIG_LOG
>  int DigsigDebugLevel = DEBUG_INIT | DEBUG_SIGN;
> @@ -84,9 +82,6 @@ int digsig_max_cached_sigs = 512;
>  module_param(digsig_max_cached_sigs, int, 0);
>  MODULE_PARM_DESC(digsig_max_cached_sigs, "Number of signatures to keep cached\n");
>  
> -/* Number of signature validations cached so far */
> -int digsig_num_cached_sigs = 0;
> -
>  /******************************************************************************
>  Description : 
>   * For a file being opened for write, check:
> @@ -141,13 +136,6 @@ digsig_inode_unlink(struct inode *dir, s
>  	return 0;
>  }
>  
> -struct security_operations digsig_security_ops;
> -
> -#define set_digsig_ops(ops, function)				\
> -		if (!ops->function) {				\
> -			ops->function = digsig_##function;	\
> -                }
> -
>  static int
>  digsig_verify_signature(Elf32_Shdr * elf_shdata,
>  		     char *sig_orig, struct file *file, int sh_offset);
> @@ -195,7 +183,7 @@ static char *digsig_find_signature(struc
>  			return NULL;
>  		}
>  
> -		buffer = (char *) kmalloc(DIGSIG_ELF_SIG_SIZE, DIGSIG_SAFE_ALLOC);
> +		buffer = kmalloc(DIGSIG_ELF_SIG_SIZE, DIGSIG_SAFE_ALLOC);
>  		if (!buffer) {
>  			DSM_ERROR ("kmalloc failed in %s for buffer.\n", __FUNCTION__);
>  			return NULL;
> @@ -231,62 +219,50 @@ static int
>  digsig_verify_signature(Elf32_Shdr * elf_shdata,
>  		     char *sig_orig, struct file *file, int sh_offset)
>  {
> -	char *sig_result, *read_blocks;
> -	int retval, offset;
> -	unsigned int size;
> +	char *sig_result = NULL, *read_blocks = NULL;
> +	int retval = -EPERM, offset;
>  	unsigned int lower, upper;
> -	SIGCTX *ctx;
> +	loff_t i_size;
> +	SIGCTX *ctx = NULL;
>  
>  	down (&digsig_sem);
>  	if (digsig_is_revoked_sig(sig_orig)) {
>  		DSM_ERROR("%s: Refusing attempt to load an ELF file with"
>  			  " a revoked signature.\n", __FUNCTION__);
> -		up (&digsig_sem);
> -		return -EPERM;
> +		goto out;
>  	}
>  
> -	if ((ctx = digsig_sign_verify_init(HASH_SHA1, SIGN_RSA)) == NULL) {
> +	retval = -ENOMEM;
> +	ctx = digsig_sign_verify_init(HASH_SHA1, SIGN_RSA);
> +	if (!ctx ) {
>  		DSM_PRINT(DEBUG_SIGN,
>  			  "%s: Cannot allocate crypto context.\n", __FUNCTION__);
> -		up (&digsig_sem);
> -		return -ENOMEM;
> +		goto out;
>  	}
>  
> -	sig_result = (char *) kmalloc(DIGSIG_ELF_SIG_SIZE, DIGSIG_SAFE_ALLOC);
> +	sig_result = kmalloc(DIGSIG_ELF_SIG_SIZE, DIGSIG_SAFE_ALLOC);
>  	if (!sig_result) {
>  		DSM_ERROR ("kmalloc failed in %s for sig_result.\n", __FUNCTION__);
> -		kfree (ctx->tvmem);
> -		kfree (ctx);
> -		up (&digsig_sem);
> -		return -ENOMEM;
> +		goto out;
>  	}
> -	read_blocks = (char *) kmalloc(DIGSIG_ELF_READ_BLOCK_SIZE, DIGSIG_SAFE_ALLOC);
> +	read_blocks = kmalloc(DIGSIG_ELF_READ_BLOCK_SIZE, DIGSIG_SAFE_ALLOC);
>  	if (!read_blocks) {
>  		DSM_ERROR ("kmalloc failed in %s for read_block.\n", __FUNCTION__);
> -		kfree (ctx->tvmem);
> -		kfree (ctx);
> -		kfree (sig_result);
> -		up (&digsig_sem);
> -		return -ENOMEM;
> +		goto out;
>  	}
>  
>  	memset(sig_result, 0, DIGSIG_ELF_SIG_SIZE);
>  
> -	for (offset = 0; offset < file->f_dentry->d_inode->i_size;
> -	     offset += DIGSIG_ELF_READ_BLOCK_SIZE) {
> +	i_size = i_size_read(file->f_dentry->d_inode);
> +	for (offset = 0; offset < i_size; offset += DIGSIG_ELF_READ_BLOCK_SIZE){
>  
> -		size = kernel_read(file, offset, (char *) read_blocks,
> +		retval = kernel_read(file, offset, (char *) read_blocks,
>  				   DIGSIG_ELF_READ_BLOCK_SIZE);
> -		if (size <= 0) {
> +		if (retval <= 0) {
>  			DSM_PRINT(DEBUG_SIGN,
>  				  "%s: Unable to read signature in blocks: %d\n",
> -				  __FUNCTION__, size);
> -			kfree(sig_result);
> -			kfree(read_blocks);
> -			kfree(ctx->tvmem);
> -			kfree(ctx);
> -			up (&digsig_sem);
> -			return -1;
> +				  __FUNCTION__, retval);
> +			goto out;
>  		}
>  
>  		/* Makan: This is in order to avoid building a buffer
> @@ -308,31 +284,32 @@ digsig_verify_signature(Elf32_Shdr * elf
>  		}
>  
>  		/* continue verification loop */
> -		if (digsig_sign_verify_update(ctx, read_blocks, size) != 0) {
> +		retval = digsig_sign_verify_update(ctx, read_blocks, retval);
> +		if (retval < 0) {
>  			DSM_PRINT(DEBUG_SIGN,
>  				  "%s: Error updating crypto verification\n", __FUNCTION__);
> -			kfree(sig_result);
> -			kfree(read_blocks);
> -			kfree(ctx->tvmem);
> -			kfree(ctx);
> -			up (&digsig_sem);
> -			return -1;
> +			goto out;
>  		}
>  	}
>  
>  	/* A bit of bsign formatting else hashes won't match, works with bsign v0.4.4 */
> -	if ((retval = digsig_sign_verify_final(ctx, sig_result, DIGSIG_ELF_SIG_SIZE,
> -					    sig_orig + DIGSIG_BSIGN_INFOS)) < 0) {
> +	retval = digsig_sign_verify_final(ctx, sig_result, DIGSIG_ELF_SIG_SIZE,
> +					    sig_orig + DIGSIG_BSIGN_INFOS);
> +	if (retval < 0) {
>  		DSM_PRINT(DEBUG_SIGN,
>  			  "%s: Error calculating final crypto verification\n", __FUNCTION__);
> -		kfree(sig_result);
> -		kfree(read_blocks);
> -		up (&digsig_sem);
> -		return -1;
> +		goto out;
>  	}
>  
> +	retval = 0;
> +
> +out:
>  	kfree(sig_result);
>  	kfree(read_blocks);
> +	if (ctx) {
> +		kfree(ctx->tvmem);
> +		kfree(ctx);
> +	}
>  	up (&digsig_sem);
>  	return retval;
>  }
> @@ -382,7 +359,7 @@ static void digsig_allow_write_access(st
>   * file->f_security>0, and we decrement the inode usage count to
>   * show that we are done with it.
>   */
> -void digsig_file_free_security(struct file *file)
> +static void digsig_file_free_security(struct file *file)
>  {
>  	if (file->f_security) {
>  		digsig_allow_write_access(file);
> @@ -426,18 +403,17 @@ static inline struct elfhdr *read_elf_he
>  {
>  	struct elfhdr *elf_ex;
>  
> -	elf_ex =
> -	    (struct elfhdr *)kmalloc(sizeof(struct elfhdr), DIGSIG_SAFE_ALLOC);
> +	elf_ex = kmalloc(sizeof(struct elfhdr), DIGSIG_SAFE_ALLOC);
>  	if (!elf_ex) {
>  		DSM_ERROR ("%s: kmalloc failed for elf_ex\n", __FUNCTION__);
> -		return NULL;
> +		return ERR_PTR(-ENOMEM);
>  	}
>  
>  	kernel_read(file, 0, (char *)elf_ex, sizeof(struct elfhdr));
>  
>  	if (elf_sanity_check(elf_ex)) {
>  		kfree(elf_ex);
> -		return NULL;
> +		return ERR_PTR(-EINVAL);
>  	}
>  
>  	return elf_ex;
> @@ -449,7 +425,7 @@ read_section_header(struct file *file, i
>  	Elf32_Shdr *elf_shdata;
>  	int retval;
>  	
> -	elf_shdata = (Elf32_Shdr *) kmalloc(sh_size, DIGSIG_SAFE_ALLOC);
> +	elf_shdata = kmalloc(sh_size, DIGSIG_SAFE_ALLOC);
>  	if (!elf_shdata) {
>  		DSM_ERROR("%s: Cannot allocate memory to read Section Header\n",
>  			  __FUNCTION__);
> @@ -493,7 +469,7 @@ static inline int is_unprotected_file(st
>  			__FUNCTION__, file->f_dentry->d_name.name, exec_time); \
>  	}
>  	
> -int digsig_file_mmap(struct file * file, unsigned long prot, unsigned long flags)
> +static int digsig_file_mmap(struct file * file, unsigned long prot, unsigned long flags)
>  {
>  	struct elfhdr *elf_ex;
>  	int retval, sh_offset;
> @@ -566,7 +542,7 @@ int digsig_file_mmap(struct file * file,
>  	}
>  
>  	/* Verify binary's signature */
> -	retval = digsig_verify_signature (elf_shdata, sig_orig, file, sh_offset);
> +	retval = digsig_verify_signature(elf_shdata, sig_orig, file, sh_offset);
>  
>  	if (!retval) {
>  		DSM_PRINT(DEBUG_SIGN,
> @@ -587,71 +563,67 @@ int digsig_file_mmap(struct file * file,
>  	kfree (sig_orig);
>   out_free_shdata:
>  	kfree (elf_shdata);
> -
>   out_with_file:
>  	kfree (elf_ex);
>   out_file_no_buf:
> - 	if (allow_write_on_exit) {
> + 	if (allow_write_on_exit)
>  		digsig_allow_write_access(file);
> -		file->f_security = NULL;
> -	}
>  
>  	end_digsig_bench;
>  
>  	return retval;
>  }
>  
> -void security_set_operations(struct security_operations *ops)
> -{
> -	set_digsig_ops(ops, file_mmap);
> -	set_digsig_ops(ops, file_free_security);
> -	set_digsig_ops(ops, inode_permission);
> -	set_digsig_ops(ops, inode_unlink);
> -}
> +static struct security_operations digsig_security_ops = {
> +	.file_mmap		= digsig_file_mmap,
> +	.file_free_security	= digsig_file_free_security,
> +	.inode_permission	= digsig_inode_permission,
> +	.inode_unlink		= digsig_inode_unlink,
> +};
>  
>  static int __init digsig_init_module(void)
>  {
> +	int ret = -ENOMEM;
>  	DSM_PRINT(DEBUG_INIT, "Initializing module\n");
>  
>  	/* initialize caching mechanisms */ 
>  
> -	if (digsig_init_caching()){
> -	  return -ENOMEM;
> -	}
> -	digsig_init_revocation();
> +	if (digsig_init_caching())
> +		goto out;
>  
> -	/* initialize DigSig's hooks */
> -	security_set_operations(&digsig_security_ops);
> +	ret = -EINVAL;
> +	if (digsig_init_sysfs()) {
> +		DSM_ERROR("Error setting up sysfs for DigSig\n");
> +		goto out_cache;
> +	}
>  
>  	/* register */
> -	if (register_security (&digsig_security_ops)) {
> -		DSM_ERROR ("%s: Failure registering DigSig as primairy security module\n", __FUNCTION__);
> -		if (mod_reg_security ("digsig_verif", &digsig_security_ops)) {
> -			DSM_ERROR ("%s: Failure registering DigSig as secondary module\n", __FUNCTION__);
> -			return -EINVAL;
> +	if (register_security(&digsig_security_ops)) {
> +		DSM_ERROR("%s: Failure registering DigSig as primairy security module\n", __FUNCTION__);
> +		if (mod_reg_security("digsig_verif", &digsig_security_ops)) {
> +			DSM_ERROR("%s: Failure registering DigSig as secondary module\n", __FUNCTION__);
> +			goto out_sysfs;
>  		}
> -		DSM_PRINT (DEBUG_INIT, "Registered as secondary module\n");
> +		DSM_PRINT(DEBUG_INIT, "Registered as secondary module\n");
>  		secondary = 1;
>  	}
> -
> -	init_MUTEX (&digsig_sem);
> -
> -	if (digsig_init_sysfs()) {
> -		DSM_ERROR("Error setting up sysfs for DigSig\n");
> -		return -EINVAL;
> -	}
> -
>  	return 0;
> +out_sysfs:
> +	digsig_cleanup_sysfs();
> +out_cache:
> +	digsig_cache_cleanup();
> +out:
> +	return ret;
>  }
>  
>  static void __exit digsig_exit_module(void)
>  {
>  	DSM_PRINT (DEBUG_INIT, "Deinitializing module\n");
>  	g_init = 0;
> -	digsig_sign_verify_free ();
> -	digsig_cleanup_sysfs ();
> -	digsig_cleanup_revocation ();
> -	digsig_cache_cleanup ();
> +	digsig_sign_verify_free();
> +	digsig_cleanup_sysfs();
> +	digsig_cleanup_revocation();
> +	digsig_cache_cleanup();
>  	mpi_free(digsig_public_key[0]);
>  	mpi_free(digsig_public_key[1]);
>  	if (secondary) {
> @@ -666,7 +638,7 @@ static void __exit digsig_exit_module(vo
>  	}
>  }
>  
> -module_init(digsig_init_module);
> +security_initcall(digsig_init_module);
>  module_exit(digsig_exit_module);
>  
>  /* see linux/module.h */
> diff -paur digsig-1.3.1.orig/digsig_cache.c digsig-1.3.1/digsig_cache.c
> --- digsig-1.3.1.orig/digsig_cache.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/digsig_cache.c	2004-09-11 09:11:01.000000000 -0700
> @@ -33,10 +33,9 @@
>  #define DIGSIG_BENCH 0
>  #endif
>  
> -extern int DigsigDebugLevel;
> -
> -extern int digsig_max_cached_sigs, digsig_num_cached_sigs;
> -extern int g_init;
> +extern int digsig_max_cached_sigs;
> +/* Number of signature validations cached so far */
> +static int digsig_num_cached_sigs;
>  
>  /*
>   * digsig_hash_table:
> @@ -71,8 +70,8 @@ struct digsig_hash_table {
>  	struct digsig_hash_table *prev;  /* only set if dynamically alloced */
>  };
>  
> -static struct digsig_hash_table *sig_cache = NULL;
> -static struct list_head sig_cache_lru;
> +static struct digsig_hash_table *sig_cache;
> +static LIST_HEAD(sig_cache_lru);
>  static spinlock_t sig_cache_spinlock = SPIN_LOCK_UNLOCKED;
>  
>  /******************************************************************************
> @@ -177,7 +176,7 @@ Description : 
>  Parameters  : @num: number of cached sig validation entries to clear.
>  Return value: number of entries actually deleted.
>  ******************************************************************************/
> -int digsig_purge_cache(int num)
> +static int digsig_purge_cache(int num)
>  {			
>  	int i=0;
>  	struct digsig_hash_table *tmph, *del;
> @@ -313,7 +312,7 @@ Description : Initialize caching 
>  Parameters  : none
>  Return value: 0 on success, 1 on failure.
>  ******************************************************************************/
> -int digsig_init_caching(void)
> +int __init digsig_init_caching(void)
>  {
>          int tmp;
>          
> @@ -321,7 +320,7 @@ int digsig_init_caching(void)
>  				sizeof(struct digsig_hash_table), GFP_ATOMIC); 
>  				/* GFP_KERNEL); */ 
>  	
> -	if (IS_ERR(sig_cache)) {
> +	if (!sig_cache) {
>  	  DSM_PRINT(DEBUG_ERROR, "No memory to initialize digsig cache.\n");
>  		return 1;
>  	}
> @@ -333,10 +332,7 @@ int digsig_init_caching(void)
>  		sig_cache[tmp].orig = 1;
>  	}
>  
> -	INIT_LIST_HEAD(&sig_cache_lru);
> -
>  	return 0; 
> -
>  }
>  
>  /*
> diff -paur digsig-1.3.1.orig/digsig_cache.h digsig-1.3.1/digsig_cache.h
> --- digsig-1.3.1.orig/digsig_cache.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/digsig_cache.h	2004-09-11 10:53:49.000000000 -0700
> @@ -15,16 +15,17 @@
>   *         
>   */
>  
> -#ifndef __DSI_CACHE_H
> +#ifndef _DSI_CACHE_H
> +#define _DSI_CACHE_H
>  
>  #include <linux/fs.h>
>  #include "gnupg/mpi/mpi.h"
>  
>  int is_cached_signature(struct inode *inode);
>  void remove_signature(struct inode *inode);
> -int digsig_purge_cache(int num);
>  void digsig_cache_signature(struct inode *inode);
>  int digsig_init_caching(void);
>  void digsig_cache_cleanup(void);
>  
> -#endif
> +#endif /* _DSI_CACHE_H */
> +
> diff -paur digsig-1.3.1.orig/digsig.init digsig-1.3.1/digsig.init
> --- digsig-1.3.1.orig/digsig.init	2004-04-27 06:49:36.000000000 -0700
> +++ digsig-1.3.1/digsig.init	2004-09-11 11:55:40.000000000 -0700
> @@ -47,7 +47,7 @@ case "$1" in
>  	echo "Catting revoked sigs into revocation list"
>  	if [ -d $REVKEY_DIR ]; then
>  		for name in `/bin/ls $REVKEY_DIR`; do
> -			/bin/cat $REVKEY_DIR/$name > /sys/digsig/digsig_revoke
> +			/bin/cat $REVKEY_DIR/$name > /sys/digsig/revoke
>  		done
>  	fi
>  	echo "Loading public key."	
> diff -paur digsig-1.3.1.orig/digsig_revocation.c digsig-1.3.1/digsig_revocation.c
> --- digsig-1.3.1.orig/digsig_revocation.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/digsig_revocation.c	2004-09-11 12:09:25.558845224 -0700
> @@ -34,10 +34,8 @@
>  #define DIGSIG_BENCH 0
>  #endif
>  
> -extern int DigsigDebugLevel;
> -
> -extern int digsig_max_hashed_sigs, digsig_num_hashed_sigs;
> -struct list_head digsig_revoked_sigs;
> +static LIST_HEAD(digsig_revoked_sigs);
> +static spinlock_t revoked_list_lock = SPIN_LOCK_UNLOCKED;
>  
>  /*
>   * Description: Called at module unload to free the list of revoked
> @@ -48,6 +46,7 @@ void digsig_free_revoked_sigs(void)
>  	struct list_head *tmp;
>  	struct revoked_sig *rsig;
>  
> +	spin_lock(&revoked_list_lock);
>  	while (!list_empty(&digsig_revoked_sigs)) {
>  		tmp = digsig_revoked_sigs.next;
>  		if (tmp != &digsig_revoked_sigs) {
> @@ -57,9 +56,10 @@ void digsig_free_revoked_sigs(void)
>  			kfree(rsig);
>  		} else {
>  			DSM_ERROR("major list screwyness\n");
> -			return;
> +			break;
>  		}
>  	}
> +	spin_unlock(&revoked_list_lock);
>  }
>  
>  /*
> @@ -70,33 +70,34 @@ void digsig_free_revoked_sigs(void)
>  #ifdef DIGSIG_REVOCATION
>  int digsig_is_revoked_sig(char *buffer)
>  {
> -	struct list_head *tmp;
>  	struct revoked_sig *rsig;
>  	char *tmp1 = buffer + DIGSIG_BSIGN_INFOS + DIGSIG_RSA_DATA_OFFSET;
>  	int count = DIGSIG_ELF_SIG_SIZE - DIGSIG_BSIGN_INFOS - DIGSIG_RSA_DATA_OFFSET;
>  	int ret = 0;
>  	MPI file_sig = mpi_read_from_buffer(tmp1, &count, 0);
>  
> -	list_for_each(tmp, &digsig_revoked_sigs) {
> -		rsig = list_entry(tmp, struct revoked_sig, next);
> +	spin_lock(&revoked_list_lock);
> +	list_for_each_entry(rsig, &digsig_revoked_sigs, next) {
>  		if (mpi_cmp(file_sig, rsig->sig) == 0) {
>  			ret = 1;
>  			goto out;
>  		}
>  	}
> -
>  out:
> +	spin_unlock(&revoked_list_lock);
>  	mpi_free(file_sig);
>  	return ret;
>  }
>  #endif
>  
> -inline void digsig_init_revocation()
> +void digsig_add_revoked_sig(struct revoked_sig *sig)
>  {
> -	INIT_LIST_HEAD(&digsig_revoked_sigs);
> +	spin_lock(&revoked_list_lock);
> +        list_add_tail(&sig->next, &digsig_revoked_sigs);
> +	spin_unlock(&revoked_list_lock);
>  }
>  
> -inline void digsig_cleanup_revocation()
> +void digsig_cleanup_revocation(void)
>  {
>  	digsig_free_revoked_sigs();
>  }
> diff -paur digsig-1.3.1.orig/digsig_revocation.h digsig-1.3.1/digsig_revocation.h
> --- digsig-1.3.1.orig/digsig_revocation.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/digsig_revocation.h	2004-09-11 10:54:03.000000000 -0700
> @@ -15,19 +15,12 @@
>   *         
>   */
>  
> -#ifndef __DSI_REVOKE_H
> +#ifndef _DSI_REVOKE_H
> +#define _DSI_REVOKE_H
>  
>  #include <linux/fs.h>
>  #include "gnupg/mpi/mpi.h"
>  
> -void digsig_init_revocation(void);
> -void digsig_cleanup_revocation(void);
> -#ifdef DIGSIG_REVOCATION
> -int digsig_is_revoked_sig(char *buffer);
> -#else
> -#define digsig_is_revoked_sig(x) 0
> -#endif
> -
>  /*
>   * A linear array of revoked signatures.
>   *
> @@ -39,4 +32,14 @@ struct revoked_sig {
>  	MPI sig;
>  };
>  
> +void digsig_init_revocation(void);
> +void digsig_cleanup_revocation(void);
> +void digsig_add_revoked_sig(struct revoked_sig *sig);
> +#ifdef DIGSIG_REVOCATION
> +int digsig_is_revoked_sig(char *buffer);
> +#else
> +#define digsig_is_revoked_sig(x) 0
>  #endif
> +
> +#endif /* _DSI_REVOKE_H */
> +
> diff -paur digsig-1.3.1.orig/dsi_debug.h digsig-1.3.1/dsi_debug.h
> --- digsig-1.3.1.orig/dsi_debug.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi_debug.h	2004-09-11 10:56:06.000000000 -0700
> @@ -18,8 +18,8 @@
>   */
>  
>  
> -#ifndef __DSI_DEBUG_H
> -#define __DSI_DEBUG_H
> +#ifndef _DSI_DEBUG_H
> +#define _DSI_DEBUG_H
>  
>  #define DIGSIG_MODULE_NAME "DIGSIG MODULE"
>  
> @@ -63,4 +63,4 @@ extern int DigsigDebugLevel;
>  #define DSM_PRINT_NO_PREFIX(dbg,fmt,arg...) \
>      if (dbg & DigsigDebugLevel) printk(fmt,##arg)
>  
> -#endif				/* __DSI_DEBUG_H */
> +#endif /* _DSI_DEBUG_H */
> diff -paur digsig-1.3.1.orig/dsi.h digsig-1.3.1/dsi.h
> --- digsig-1.3.1.orig/dsi.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi.h	2004-09-11 10:56:12.000000000 -0700
> @@ -20,8 +20,8 @@
>   */
>  
>  
> -#ifndef __DSI_H
> -#define __DSI_H
> +#ifndef _DSI_H
> +#define _DSI_H
>  
>  #ifdef MODULE
>  #include <linux/kernel.h>
> @@ -49,4 +49,6 @@
>  
>  #endif				/* MODULE */
>  
> -#endif
> +extern int g_init;
> +
> +#endif /* _DSI_H */
> diff -paur digsig-1.3.1.orig/dsi_sig_verify.c digsig-1.3.1/dsi_sig_verify.c
> --- digsig-1.3.1.orig/dsi_sig_verify.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi_sig_verify.c	2004-09-11 11:21:59.000000000 -0700
> @@ -33,12 +33,10 @@
>   * n bytes: MPI (ie. 0x29)
>   */
>  
> -extern int DigsigDebugLevel;
> -
>  #define TVMEMSIZE	4096
>  
>  int gDigestLength[] = { /* SHA-1 */ 0x14 };
> -static struct crypto_tfm *SHA1_TFM = NULL;
> +static struct crypto_tfm *sha1_tfm;
>  MPI digsig_public_key[] = {MPI_NULL, MPI_NULL};
>  
>  
> @@ -70,17 +68,16 @@ SIGCTX *digsig_sign_verify_init(int hash
>  	SIGCTX *ctx;
>  
>  	/* allocating signature context */
> -	ctx = (SIGCTX *) kmalloc(sizeof(SIGCTX), GFP_KERNEL);
> -	if (ctx == NULL) {
> +	ctx = kmalloc(sizeof(SIGCTX), GFP_KERNEL);
> +	if (!ctx) {
>  		DSM_ERROR("Cannot allocate ctx\n");
> -		return NULL;
> +		goto err;
>  	}
>  
>  	ctx->tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
> -	if (ctx->tvmem == NULL) {
> -		kfree(ctx);
> +	if (!ctx->tvmem) {
>  		DSM_ERROR("Cannot allocate plaintext buffer\n");
> -		return NULL;
> +		goto err;
>  	}
>  
>  	/* checking hash algorithm is known */
> @@ -88,16 +85,12 @@ SIGCTX *digsig_sign_verify_init(int hash
>  	case HASH_SHA1:
>  		if (digsig_sha1_init(ctx)) {
>  			DSM_ERROR("Initializing SHA1 failed\n");
> -			kfree(ctx->tvmem);
> -			kfree(ctx);
> -			return NULL;
> +			goto err;
>  		}
>  		break;
>  	default:
>  		DSM_ERROR("Unknown hash algo\n");
> -		kfree(ctx->tvmem);
> -		kfree(ctx);
> -		return NULL;
> +		goto err;
>  	}
>  
>  	/* checking sign algo is known */
> @@ -106,13 +99,18 @@ SIGCTX *digsig_sign_verify_init(int hash
>  		break;
>  	default:
>  		DSM_ERROR("Unknown sign algo\n");
> -		kfree(ctx->tvmem);
> -		kfree(ctx);
> -		return NULL;
> +		goto err;
>  	}
>  	ctx->digestAlgo = hashalgo;
>  	ctx->signAlgo = signalgo;
>  	return ctx;
> +
> +err:
> +	if (ctx) {
> +		kfree(ctx->tvmem);
> +		kfree(ctx);
> +	}
> +	return NULL;
>  }
>  
>  /******************************************************************************
> @@ -125,17 +123,16 @@ Return value: 0 normally
>  ******************************************************************************/
>  int digsig_sign_verify_update(SIGCTX * ctx, char *buf, int buflen)
>  {
> +	if (ctx == NULL)
> +		return -EINVAL;
> +
>  	switch (ctx->digestAlgo) {
>  	case HASH_SHA1:
> -		if (ctx == NULL) {
> -			return -1;
> -		}
> -
>  		digsig_sha1_update(ctx, buf, buflen);
>  		break;
>  	default:
>  		DSM_ERROR("%s: Unknown hash algo\n", __FUNCTION__);
> -		return -1;
> +		return -EINVAL;
>  	}
>  
>  	return 0;
> @@ -151,30 +148,24 @@ digsig_sign_verify_final(SIGCTX * ctx, c
>  		      unsigned char *signed_hash)
>  {
>  	char *digest;
> -	int rc = -1;
> +	int rc = -ENOMEM;
>  
>  	digest = kmalloc (gDigestLength[ctx->digestAlgo], DIGSIG_SAFE_ALLOC);
>  	if (!digest) {
>  		DSM_ERROR ("kmalloc failed in %s for digest\n", __FUNCTION__);
> -		return -ENOMEM;
> +		goto err;
>  	}
>  	/* TO DO: check the length of the signature: it should be equal to the length
>  	   of the modulus */
>  	if ((rc = digsig_sha1_final(ctx, digest)) < 0) {
>  		DSM_ERROR
>  		    ("%s: Cannot finalize hash algorithm\n", __FUNCTION__);
> -		kfree(ctx->tvmem);
> -		kfree(ctx);
> -		kfree (digest);
> -		return rc;
> +		goto err;
>  	}
>  
> -	if (siglen < gDigestLength[ctx->digestAlgo]) {
> -		kfree(ctx->tvmem);
> -		kfree(ctx);
> -		kfree (digest);
> -		return -2;
> -	}
> +	rc = -EINVAL;
> +	if (siglen < gDigestLength[ctx->digestAlgo])
> +		goto err;
>  	memcpy(sig, digest, gDigestLength[ctx->digestAlgo]);
>  
>  	switch (ctx->digestAlgo) {
> @@ -190,8 +181,7 @@ digsig_sign_verify_final(SIGCTX * ctx, c
>  
>  	/* free everything */
>  	/* do not free SHA1-TFM. For optimization, we choose always to use the same one */
> -	kfree(ctx->tvmem);
> -	kfree(ctx);
> +err:
>  	kfree (digest);
>  	return rc;
>  }
> @@ -203,11 +193,11 @@ Description : 
>  Parameters  : 
>  Return value: 
>  ******************************************************************************/
> -void digsig_sign_verify_free()
> +void digsig_sign_verify_free(void)
>  {
> -	if (SHA1_TFM) {
> -		crypto_free_tfm(SHA1_TFM);
> -		SHA1_TFM = NULL;
> +	if (sha1_tfm) {
> +		crypto_free_tfm(sha1_tfm);
> +		sha1_tfm = NULL;
>  	}
>  	/* this might cause unpredictable behavior if structures are refering to this,
>  	   their pointer might suddenly become NULL, might need a usage count associated */
> @@ -252,7 +242,7 @@ Return value: 0 - RSA signature is valid
>                -1 - an error occured
>  ******************************************************************************/
>  
> -int digsig_rsa_bsign_verify(unsigned char *hash_format, int length,
> +static int digsig_rsa_bsign_verify(unsigned char *hash_format, int length,
>  			 unsigned char *signed_hash)
>  {
>  	int rc = 0;
> @@ -265,7 +255,7 @@ int digsig_rsa_bsign_verify(unsigned cha
>  	SIGCTX *ctx = NULL;
>  	unsigned char *new_sig;
>  
> -	new_sig = kmalloc (gDigestLength[HASH_SHA1], DIGSIG_SAFE_ALLOC);
> +	new_sig = kmalloc(gDigestLength[HASH_SHA1], DIGSIG_SAFE_ALLOC);
>  	if (!new_sig) {
>  		DSM_ERROR ("kmalloc failed in %s for new_sig\n", __FUNCTION__);
>  		return -ENOMEM;
> @@ -274,18 +264,20 @@ int digsig_rsa_bsign_verify(unsigned cha
>  	/* Get MPI of signed data from .sig file/section */
>  	nread = DIGSIG_ELF_SIG_SIZE;
>  
> -	data = mpi_read_from_buffer(signed_hash + DIGSIG_RSA_DATA_OFFSET, &nread,
> -				    0);
> -	if (!data)
> +	data = mpi_read_from_buffer(signed_hash + DIGSIG_RSA_DATA_OFFSET, 
> +				    &nread, 0);
> +	if (!data) {
> +		kfree(new_sig);
>  		return -EINVAL;
> +	}
>  
>  	/* Get MPI for hash */
>  	/* bsign modif - file hash - gpg modif */
>  	/* bsign modif: add bsign greet at beginning */
>  	/* gpg modif:   add class and timestamp at end */
>  
> -	ctx = (SIGCTX *) kmalloc(sizeof(SIGCTX), GFP_KERNEL);
> -	if (ctx == NULL) {
> +	ctx = kmalloc(sizeof(SIGCTX), GFP_KERNEL);
> +	if (!ctx) {
>  		DSM_ERROR("Cannot allocate ctx\n");
>  		mpi_free (data);
>  		kfree (new_sig);
> @@ -293,7 +285,7 @@ int digsig_rsa_bsign_verify(unsigned cha
>  	}
>  
>  	ctx->tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
> -	if (ctx->tvmem == NULL) {
> +	if (!ctx->tvmem) {
>  		kfree (ctx);
>  		mpi_free(data);
>  		kfree (new_sig);
> @@ -356,9 +348,9 @@ static int digsig_sha1_init(SIGCTX * ctx
>  	if (ctx == NULL)
>  		return -1;
>  
> -	if (SHA1_TFM == NULL)
> -		SHA1_TFM = crypto_alloc_tfm("sha1", 0);
> -	ctx->tfm = SHA1_TFM;
> +	if (sha1_tfm == NULL)
> +		sha1_tfm = crypto_alloc_tfm("sha1", 0);
> +	ctx->tfm = sha1_tfm;
>  	if (ctx->tfm == NULL) {
>  		DSM_ERROR("tfm allocation failed\n");
>  		return -1;
> @@ -392,7 +384,7 @@ static void digsig_sha1_update(SIGCTX * 
>  /******************************************************************************
>  Description : Portability layer function. 
>  Parameters  : 
> -Return value: 0 for successful allocation, -1 for failed
> +Return value: 0 for successful allocation, -EINVAL for failed
>  ******************************************************************************/
>  
>  static int digsig_sha1_final(SIGCTX * ctx, char *digest)
> @@ -401,7 +393,7 @@ static int digsig_sha1_final(SIGCTX * ct
>  	   of the modulus */
>  
>  	if (ctx == NULL)
> -		return -1;
> +		return -EINVAL;
>  
>  	crypto_digest_final(ctx->tfm, digest);
>  	return 0;
> diff -paur digsig-1.3.1.orig/dsi_sig_verify.h digsig-1.3.1/dsi_sig_verify.h
> --- digsig-1.3.1.orig/dsi_sig_verify.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi_sig_verify.h	2004-09-11 10:52:10.000000000 -0700
> @@ -14,8 +14,8 @@
>   *         David Gordon
>   */
>  
> -#ifndef _DSI_SIG_VERIFY_H_
> -#define _DSI_SIG_VERIFY_H_
> +#ifndef _DSI_SIG_VERIFY_H
> +#define _DSI_SIG_VERIFY_H
>  
>  #include <linux/crypto.h>
>  #include <asm/scatterlist.h>
> @@ -79,6 +79,7 @@ typedef struct sig_ctx_st {
>  } SIGCTX;
>  
>  extern int gDigestLength[1];
> +extern MPI digsig_public_key[];
>  
>  SIGCTX *digsig_sign_verify_init(int hashalgo, int signalgo);
>  int digsig_sign_verify_update(SIGCTX * ctx, char *buf, int buflen);
> @@ -90,4 +91,4 @@ int digsig_init_pkey(const char read_par
>  
>  
>  
> -#endif
> +#endif /* _DSI_SIG_VERIFY_H */
> diff -paur digsig-1.3.1.orig/dsi_sysfs.c digsig-1.3.1/dsi_sysfs.c
> --- digsig-1.3.1.orig/dsi_sysfs.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi_sysfs.c	2004-09-11 11:55:15.000000000 -0700
> @@ -47,31 +47,26 @@
>  #define DIGSIG_KEY_OFFSET 1
>  #endif
>  
> -extern int g_init; /* digsig.c */
>  extern long int total_jiffies; /* digsig.c */
> -extern MPI digsig_public_key[2]; /* dsi_sig_verify.c */
>  
> -extern struct list_head digsig_revoked_sigs; /* dsi_cache.c */
> -
> -struct digsig_attribute_st  {
> +struct digsig_attribute  {
>  	struct attribute attr;
>  	ssize_t (*show)(struct kobject *, struct attribute *attr, char *);
>  	ssize_t (*store)(struct kobject *, struct attribute *attr, const char *, size_t);
>  };
>  
> -/* from digsig_cache.c */
> -extern struct list_head digsig_revoked_sigs;
> +#define DIGSIG_ATTR(_name, _mode, _show, _store)	\
> +struct digsig_attribute digsig_attr_##_name = __ATTR(_name,_mode,_show,_store)
>  
>  /*
>   * These are the show/hide prototypes and attribute for the
> - * /sys/digsig/digsig_interface file, which is used to tell digsig the
> + * /sys/digsig/key file, which is used to tell digsig the
>   * public key to use to verify ELF file signatures.
>   */
>  static ssize_t digsig_key_show (struct kobject *obj, struct attribute *attr,
>  	char *buff);
>  static ssize_t digsig_key_store (struct kobject *obj, struct attribute *attr,
>  	const char *buff, size_t count);
> -char digsig_file_name[] = "digsig_interface";
>  /*
>   * For the curious, notice what's going on:  We create a structure which
>   * contains  .attr .  This  .attr  is what we pass into  sysfs_create_file
> @@ -82,39 +77,26 @@ char digsig_file_name[] = "digsig_interf
>   * subtracting that from the address we were sent, which is what container_of
>   * in  digsig_store  and  digsig_show  (just a few definitions below) do.
>   */
> -static struct digsig_attribute_st digsig_attribute = {
> -	.attr = {.name = digsig_file_name,
> -		 .owner = THIS_MODULE,
> -		 .mode = S_IRUSR | S_IWUSR},
> -	.show = digsig_key_show,
> -	.store = digsig_key_store
> -};
> +static DIGSIG_ATTR(key, 0600, digsig_key_show, digsig_key_store);
>  
>  /*
>   * These are the show/hide prototypes and attribute for the
> - * /sys/digsig/digsig_revoke file, which is used to tell digsig the
> + * /sys/digsig/revoke file, which is used to tell digsig the
>   * ELF file signatures which are revoked.  Digsig will not allow
>   * loading any files which carry one of these signatures.
>   */
> -static ssize_t digsig_revoked_list_show (struct kobject *obj,
> +static ssize_t digsig_revoked_show (struct kobject *obj,
>  	struct attribute *attr, char *buff);
> -static ssize_t digsig_revoked_list_store (struct kobject *obj,
> +static ssize_t digsig_revoked_store (struct kobject *obj,
>  	struct attribute *attr, const char *buff, size_t count);
> -char digsig_r_file_name[] = "digsig_revoke";
> -static struct digsig_attribute_st digsig_r_attribute = {
> -	.attr = {.name = digsig_r_file_name,
> -		 .owner = THIS_MODULE,
> -		 .mode = S_IRUSR | S_IWUSR},
> -	.show = digsig_revoked_list_show,
> -	.store = digsig_revoked_list_store
> -};
> +static DIGSIG_ATTR(revoke, 0600, digsig_revoked_show, digsig_revoked_store);
>  
>  /*
>   * Next are the digsig sysfs file operations.  These are assigned to
> - * the files under /sys/digsig.  They will use the digsig_attribute_st
> + * the files under /sys/digsig.  They will use the digsig_attribute
>   * struct defined above to find the function which should actually be
>   * called for read/write.  The attr argument to these functions is a
> - * member of the digsig_attribute_st struct we defined, so we use its
> + * member of the digsig_attribute struct we defined, so we use its
>   * offset to find our structure, which in turn contains the read and
>   * write operations we actually want to perform.
>   */
> @@ -122,8 +104,8 @@ static ssize_t
>  digsig_store(struct kobject *kobj, struct attribute *attr, const char *buf,
>  	size_t len)
>  {
> -	struct digsig_attribute_st *attribute = container_of(attr,
> -		struct digsig_attribute_st, attr);
> +	struct digsig_attribute *attribute = container_of(attr,
> +		struct digsig_attribute, attr);
>  
>  	return attribute->store ? attribute->store(kobj, attr, buf, len) : 0;
>  }
> @@ -131,8 +113,8 @@ digsig_store(struct kobject *kobj, struc
>  static ssize_t
>  digsig_show(struct kobject *kobj, struct attribute *attr, char *buf)
>  {
> -	struct digsig_attribute_st *attribute = container_of(attr,
> -		struct digsig_attribute_st, attr);
> +	struct digsig_attribute *attribute = container_of(attr,
> +		struct digsig_attribute, attr);
>  
>  	return attribute->show ? attribute->show(kobj, attr, buf) : 0;
>  }
> @@ -161,28 +143,34 @@ static struct kobject digsig_kobject = {
>  /*
>   * init and cleanup functions for the /sys/digsig directory.
>   */
> -int digsig_init_sysfs(void)
> +int __init digsig_init_sysfs(void)
>  {
>  	if (kobject_register (&digsig_kobject) != 0) {
>  		DSM_ERROR ("Digsig key failed to register properly\n");
> -		return -1;
> +		goto err;
>  	}
> -	if (sysfs_create_file(&digsig_kobject, &digsig_attribute.attr) != 0) {
> +	if (sysfs_create_file(&digsig_kobject, &digsig_attr_key.attr) != 0) {
>  		DSM_ERROR ("Create file failed\n");
> -		return -1;
> +		goto create_key;
>  	}
> -	if (sysfs_create_file(&digsig_kobject, &digsig_r_attribute.attr) != 0) {
> +	if (sysfs_create_file(&digsig_kobject, &digsig_attr_revoke.attr) != 0) {
>  		DSM_ERROR ("Create revocation file failed\n");
> -		return -1;
> +		goto create_revoke;
>  	}
> -
>  	return 0;
> +
> +create_revoke:
> +	sysfs_remove_file (&digsig_kobject, &digsig_attr_key.attr);
> +create_key:
> +	kobject_unregister (&digsig_kobject);
> +err:
> +	return -1;
>  }
>  
>  void digsig_cleanup_sysfs(void)
>  {
> -	sysfs_remove_file (&digsig_kobject, &digsig_attribute.attr);
> -	sysfs_remove_file (&digsig_kobject, &digsig_r_attribute.attr);
> +	sysfs_remove_file (&digsig_kobject, &digsig_attr_key.attr);
> +	sysfs_remove_file (&digsig_kobject, &digsig_attr_revoke.attr);
>  	kobject_unregister (&digsig_kobject);
>  }
>  
> @@ -219,28 +207,17 @@ digsig_key_store (struct kobject *obj, s
>  		return -1;
>  
>  	switch (buff[0]) {
> -
>  	case 'n':
> -		raw_public_key =
> -			(unsigned char *) kmalloc(count - DIGSIG_KEY_OFFSET, DIGSIG_SAFE_ALLOC);
> -		if (!raw_public_key) {
> -			DSM_ERROR("kmalloc fail for n in %s\n", __FUNCTION__);
> -			return -ENOMEM;
> -		}
> -		memcpy(raw_public_key, &buff[DIGSIG_KEY_OFFSET], count - DIGSIG_KEY_OFFSET);
> -		mpi_size = count - DIGSIG_KEY_OFFSET;
> -		DSM_PRINT(DEBUG_DEV, "pkey->n size is %i\n", mpi_size);
> -		break;
>  	case 'e':
>  		raw_public_key =
> -			(unsigned char *) kmalloc(count - DIGSIG_KEY_OFFSET, DIGSIG_SAFE_ALLOC);
> +			kmalloc(count - DIGSIG_KEY_OFFSET, DIGSIG_SAFE_ALLOC);
>  		if (!raw_public_key) {
> -			DSM_ERROR("kmalloc fail for e in %s\n", __FUNCTION__);
> +			DSM_ERROR("kmalloc fail for %c in %s\n", buff[0], __FUNCTION__);
>  			return -ENOMEM;
>  		}
>  		memcpy(raw_public_key, &buff[DIGSIG_KEY_OFFSET], count - DIGSIG_KEY_OFFSET);
>  		mpi_size = count - DIGSIG_KEY_OFFSET;
> -		DSM_PRINT(DEBUG_DEV, "pkey->e size is %i\n", mpi_size);
> +		DSM_PRINT(DEBUG_DEV, "pkey->%c size is %i\n", buff[0], mpi_size);
>  		break;
>  	default:
>  		return -EINVAL;
> @@ -265,12 +242,12 @@ digsig_key_show (struct kobject *obj, st
>  }
>  
>  /*
> - * callbacks for read/write to /sys/digsig/digsig_revoke file
> + * callbacks for read/write to /sys/digsig/revoke file
>   */
>  static ssize_t
> -digsig_revoked_list_store (struct kobject *obj, struct attribute *attr, const char *buff, size_t count)
> +digsig_revoked_store (struct kobject *obj, struct attribute *attr, const char *buff, size_t count)
>  {
> -        struct revoked_sig *tmp;
> +        struct revoked_sig *sig;
>          int rcount = DIGSIG_ELF_SIG_SIZE - DIGSIG_BSIGN_INFOS - DIGSIG_RSA_DATA_OFFSET;
>  
>          if (g_init)
> @@ -282,22 +259,22 @@ digsig_revoked_list_store (struct kobjec
>                  return -EINVAL;
>          }
>  
> -        tmp = kmalloc(sizeof(struct revoked_sig), GFP_KERNEL);
> -        if (!tmp)
> +        sig = kmalloc(sizeof(struct revoked_sig), GFP_KERNEL);
> +        if (!sig)
>                  return -ENOMEM;
> -        memset(tmp, 0, sizeof(struct revoked_sig));
> -        tmp->sig = mpi_read_from_buffer(
> +        memset(sig, 0, sizeof(struct revoked_sig));
> +        sig->sig = mpi_read_from_buffer(
>  		buff + DIGSIG_BSIGN_INFOS + DIGSIG_RSA_DATA_OFFSET,
>  		&rcount, 0);
>  
> -        list_add_tail(&tmp->next, &digsig_revoked_sigs);
> +	digsig_add_revoked_sig(sig);
>  
>          DSM_PRINT(DEBUG_SIGN, "Added a revoked sig.\n");
>          return count;
>  }
>  
>  static ssize_t
> -digsig_revoked_list_show (struct kobject *obj, struct attribute *attr, char *buff)
> +digsig_revoked_show (struct kobject *obj, struct attribute *attr, char *buff)
>  {
>  
>          return 0;
> diff -paur digsig-1.3.1.orig/dsi_sysfs.h digsig-1.3.1/dsi_sysfs.h
> --- digsig-1.3.1.orig/dsi_sysfs.h	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/dsi_sysfs.h	2004-09-11 10:55:08.000000000 -0700
> @@ -14,8 +14,8 @@
>   * 
>   * Vincent Roy
>   */
> -#ifndef __DSI_SYSFS_H
> -#define __DSI_SYSFS_H
> +#ifndef _DSI_SYSFS_H
> +#define _DSI_SYSFS_H
>  
>  ssize_t	digsig_store (struct kobject *obj, struct attribute *attr, const char *buff, size_t count);
>  ssize_t	digsig_show (struct kobject *obj, struct attribute *attr, char *buff);
> @@ -26,4 +26,4 @@ ssize_t digsig_rev_list_show (struct kob
>  int digsig_init_sysfs(void);
>  void digsig_cleanup_sysfs(void);
>  
> -#endif
> +#endif /* _DSI_SYSFS_H */
> diff -paur digsig-1.3.1.orig/tools/extract_pkey.c digsig-1.3.1/tools/extract_pkey.c
> --- digsig-1.3.1.orig/tools/extract_pkey.c	2004-09-03 05:31:19.000000000 -0700
> +++ digsig-1.3.1/tools/extract_pkey.c	2004-09-11 11:53:37.000000000 -0700
> @@ -53,7 +53,7 @@ int main(int argc, char **argv)
>  		printf ("Unable to open pkey_file %s %s\n", argv[1], strerror(errno));
>  		return -1;
>  	}
> -	module_file = open ("/sys/digsig/digsig_interface", O_WRONLY);
> +	module_file = open ("/sys/digsig/key", O_WRONLY);
>  	if (!module_file) {
>  		printf ("Unable to open module char device %s\n", strerror(errno));
>  		return -1;

-- 

Makan Pourzandi, Open Systems Lab
Ericsson Research, Montreal, Canada
*This email does not represent or express the opinions of Ericsson Inc.*

      parent reply	other threads:[~2004-09-22 15:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <21A5F45EFF209A44B3057E35CE1FE6E4BC415F@eammlex037.lmc.ericsson.se>
2004-09-11 19:55 ` [ANNOUNCE] Release Digsig 1.3.1: kernel module for run-time a uthentication of binaries Chris Wright
2004-09-13 11:58   ` Makan Pourzandi
2004-09-22 15:28   ` Makan Pourzandi [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41519A2C.2090705@ericsson.com \
    --to=makan.pourzandi@ericsson.com \
    --cc=David.Gordon@ericsson.com \
    --cc=axelle.apvrille@trusted-logic.fr \
    --cc=chrisw@osdl.org \
    --cc=gaspoucho@yahoo.com \
    --cc=hallyn@CS.WM.EDU \
    --cc=linux-kernel@vger.kernel.org \
    --cc=serue@us.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.