diff options
author | Andrew Morgan <morgan@kernel.org> | 2007-07-10 20:58:05 -0700 |
---|---|---|
committer | Andrew Morgan <morgan@kernel.org> | 2007-07-10 20:58:05 -0700 |
commit | f2e0a44e65728acc17d6d11d8988be8fdc36574b (patch) | |
tree | 7d7b9acdc1a22b387897d8440eba0c5d0c20ceeb | |
parent | a65a7364c9a3b0ef862cb46aad3855d826247ecd (diff) | |
download | libcap-f2e0a44e65728acc17d6d11d8988be8fdc36574b.tar.gz |
This is libcap-1.10libcap-1.10
http://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/libcap-1.10.tar.gz
-rw-r--r-- | CHANGELOG | 11 | ||||
-rw-r--r-- | Make.Rules | 4 | ||||
-rw-r--r-- | libcap/cap_alloc.c | 106 | ||||
-rw-r--r-- | libcap/cap_text.c | 9 | ||||
-rw-r--r-- | libcap/include/sys/capability.h | 3 | ||||
-rw-r--r-- | libcap/libcap.h | 24 | ||||
-rw-r--r-- | progs/getpcaps.c | 7 | ||||
-rw-r--r-- | progs/setpcaps.c | 7 |
8 files changed, 127 insertions, 44 deletions
@@ -1,3 +1,14 @@ +libcap 1.10 + +* fixed cap_free to abide by correct documention - use it to free + strings returned by cap_to_text(). + +libcap 1.03 + +* Fix from Chris Evans relating to not seeing all of the capabilities + in the automatically generated cap_names.h file (fix in + _makenames.c) + libcap 1.02 * fixed kernel version matching to always fail when attempting to @@ -1,5 +1,5 @@ # -# $Id: Make.Rules,v 1.4 1999/05/14 04:36:47 morgan Exp $ +# $Id: Make.Rules,v 1.5 1999/11/18 06:06:02 morgan Exp $ # # @@ -36,7 +36,7 @@ LIBDIR=$(FAKEROOT)$(lib_prefix)/lib # common defines for libcap (suitable for 2.2.1+ Linux kernels) VERSION=1 -MINOR=03 +MINOR=10 # # Compilation specifics diff --git a/libcap/cap_alloc.c b/libcap/cap_alloc.c index 58cdb81..3d3168e 100644 --- a/libcap/cap_alloc.c +++ b/libcap/cap_alloc.c @@ -1,5 +1,5 @@ /* - * $Id: cap_alloc.c,v 1.1.1.1 1999/04/17 22:16:31 morgan Exp $ + * $Id: cap_alloc.c,v 1.3 1999/11/18 07:23:24 morgan Exp $ * * Copyright (c) 1997-8 Andrew G Morgan <morgan@linux.kernel.org> * @@ -12,7 +12,59 @@ #include "libcap.h" /* - * This function duplicates an internal capability set (x3) with + * Obtain a blank set of capabilities + */ + +cap_t cap_init(void) +{ + __u32 *raw_data; + cap_t result; + + raw_data = malloc( sizeof(__u32) + sizeof(*result) ); + + if (raw_data == NULL) { + _cap_debug("out of memory"); + errno = ENOMEM; + return NULL; + } + + *raw_data = CAP_T_MAGIC; + result = (cap_t) (raw_data + 1); + memset(result, 0, sizeof(*result)); + + result->head.version = _LINUX_CAPABILITY_VERSION; + + return result; +} + +/* + * This is an internal library function to duplicate a string and + * tag the result as something cap_free can handle. + */ + +char *_libcap_strdup(const char *old) +{ + __u32 *raw_data; + + if (old == NULL) { + errno = EINVAL; + return NULL; + } + + raw_data = malloc( sizeof(__u32) + strlen(old) + 1 ); + if (raw_data == NULL) { + errno = ENOMEM; + return NULL; + } + + *(raw_data++) = CAP_S_MAGIC; + strcpy((char *) raw_data, old); + + return ((char *) raw_data); +} + +/* + * This function duplicates an internal capability set with * malloc()'d memory. It is the responsibility of the user to call * cap_free() to liberate it. */ @@ -27,10 +79,9 @@ cap_t cap_dup(cap_t cap_d) return NULL; } - result = (cap_t) malloc( sizeof(*cap_d) ); + result = cap_init(); if (result == NULL) { _cap_debug("out of memory"); - errno = ENOMEM; return NULL; } @@ -44,40 +95,39 @@ cap_t cap_dup(cap_t cap_d) * Scrub and then liberate an internal capability set. */ -int cap_free(cap_t *cap_d_p) +int cap_free(void *data_p) { - if ( cap_d_p && good_cap_t(*cap_d_p) ) { - memset(*cap_d_p, 0, sizeof(**cap_d_p)); - free(*cap_d_p); - *cap_d_p = NULL; + if ( good_cap_t(data_p) ) { + data_p = -1 + (__u32 *) data_p; + memset(data_p, 0, sizeof(__u32) + sizeof(struct _cap_struct)); + free(data_p); + data_p = NULL; return 0; - } else { - _cap_debug("no capability to liberate"); - errno = EINVAL; - return -1; } -} -/* - * Obtain a blank set of capabilities - */ - -cap_t cap_init(void) -{ - cap_t result = (cap_t) calloc( 1, sizeof(*result) ); - - if (result) { - result->magic = CAP_T_MAGIC; - result->head.version = _LINUX_CAPABILITY_VERSION; - } else { - errno = ENOMEM; + if ( good_cap_string(data_p) ) { + int length = strlen(data_p) + sizeof(__u32); + data_p = -1 + (__u32 *) data_p; + memset(data_p, 0, length); + free(data_p); + data_p = NULL; + return 0; } - return result; + + _cap_debug("don't recognize what we're supposed to liberate"); + errno = EINVAL; + return -1; } /* * $Log: cap_alloc.c,v $ + * Revision 1.3 1999/11/18 07:23:24 morgan + * final fixes tested on a RH6.0 system for release-1.10 + * + * Revision 1.2 1999/11/18 06:03:26 morgan + * fixed cap_free to work as indicated in manuals + * * Revision 1.1.1.1 1999/04/17 22:16:31 morgan * release 1.0 of libcap * diff --git a/libcap/cap_text.c b/libcap/cap_text.c index c17f89f..c69e89b 100644 --- a/libcap/cap_text.c +++ b/libcap/cap_text.c @@ -1,5 +1,5 @@ /* - * $Id: cap_text.c,v 1.2 1999/04/17 23:25:09 morgan Exp $ + * $Id: cap_text.c,v 1.3 1999/11/18 06:03:26 morgan Exp $ * * Copyright (c) 1997-8 Andrew G Morgan <morgan@linux.kernel.org> * Copyright (c) 1997 Andrew Main <zefram@dcs.warwick.ac.uk> @@ -16,8 +16,6 @@ #include <ctype.h> #include <stdio.h> -char *strdup(const char *s); - /* Maximum output text length (16 per cap) */ #define CAP_TEXT_SIZE (16*__CAP_BITS) @@ -306,11 +304,14 @@ char *cap_to_text(cap_t caps, ssize_t *length_p) *length_p = p - buf; } - return (strdup(buf)); + return (_libcap_strdup(buf)); } /* * $Log: cap_text.c,v $ + * Revision 1.3 1999/11/18 06:03:26 morgan + * fixed cap_free to work as indicated in manuals + * * Revision 1.2 1999/04/17 23:25:09 morgan * fixes from peeterj * diff --git a/libcap/include/sys/capability.h b/libcap/include/sys/capability.h index 219ad2a..5afd3b0 100644 --- a/libcap/include/sys/capability.h +++ b/libcap/include/sys/capability.h @@ -20,6 +20,7 @@ extern "C" { * information for the user library. */ +#include <sys/types.h> #include <linux/capability.h> /* @@ -63,7 +64,7 @@ typedef enum { /* libcap/cap_alloc.c */ cap_t cap_dup(cap_t); -int cap_free(cap_t *); +int cap_free(void *); cap_t cap_init(void); /* libcap/cap_flag.c */ diff --git a/libcap/libcap.h b/libcap/libcap.h index f206090..eff5f8b 100644 --- a/libcap/libcap.h +++ b/libcap/libcap.h @@ -1,5 +1,5 @@ /* - * $Id: libcap.h,v 1.2 1999/04/17 23:25:10 morgan Exp $ + * $Id: libcap.h,v 1.5 1999/11/18 07:23:24 morgan Exp $ * * Copyright (c) 1997 Andrew G Morgan <morgan@linux.kernel.org> * @@ -12,7 +12,6 @@ #ifndef LIBCAP_H #define LIBCAP_H -#include <sys/types.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -41,11 +40,13 @@ #define CAP_T_MAGIC 0xCA90D0 struct _cap_struct { - int magic; struct __user_cap_header_struct head; struct __user_cap_data_struct set; }; +/* string magic for cap_free */ +#define CAP_S_MAGIC 0xCA95D0 + /* * Do we match the local kernel? */ @@ -76,7 +77,9 @@ typedef struct { * Private definitions for internal use by the library. */ -#define good_cap_t(c) ((c) && (c)->magic == CAP_T_MAGIC) +#define __libcap_check_magic(c,magic) ((c) && *(-1+(__u32 *)(c)) == (magic)) +#define good_cap_t(c) __libcap_check_magic(c, CAP_T_MAGIC) +#define good_cap_string(c) __libcap_check_magic(c, CAP_S_MAGIC) /* * library debugging @@ -91,7 +94,7 @@ typedef struct { } # define _cap_debugcap(s, c) \ fprintf(stderr, __FUNCTION__ "(" __FILE__ ":%d): " s \ - "%08x\n", __LINE__, c) + "%08x\n", __LINE__, *(c)) #else /* !DEBUG */ @@ -100,6 +103,8 @@ typedef struct { #endif /* DEBUG */ +extern char *_libcap_strdup(const char *text); + /* * These are semi-public prototypes, they will only be defined in * <sys/capability.h> if _POSIX_SOURCE is not #define'd, so we @@ -115,6 +120,15 @@ extern int capsetp(pid_t pid, cap_t cap_d); /* * $Log: libcap.h,v $ + * Revision 1.5 1999/11/18 07:23:24 morgan + * final fixes tested on a RH6.0 system for release-1.10 + * + * Revision 1.4 1999/11/18 06:25:02 morgan + * added prototype for _libcap_strdup + * + * Revision 1.3 1999/11/18 06:03:26 morgan + * fixed cap_free to work as indicated in manuals + * * Revision 1.2 1999/04/17 23:25:10 morgan * fixes from peeterj * diff --git a/progs/getpcaps.c b/progs/getpcaps.c index a831547..cb3c9d7 100644 --- a/progs/getpcaps.c +++ b/progs/getpcaps.c @@ -1,5 +1,5 @@ /* - * $Id: getpcaps.c,v 1.1.1.1 1999/04/17 22:16:31 morgan Exp $ + * $Id: getpcaps.c,v 1.2 1999/11/18 06:04:25 morgan Exp $ * * Copyright (c) 1997 Andrew G. Morgan <morgan@linux.kernel.org> * @@ -53,7 +53,7 @@ int main(int argc, char **argv) } else { char *result = cap_to_text(cap_d, &length); fprintf(stderr, "Capabilities for `%s': %s\n", *argv, result); - free(result); + cap_free(result); result = NULL; } } @@ -63,6 +63,9 @@ int main(int argc, char **argv) /* * $Log: getpcaps.c,v $ + * Revision 1.2 1999/11/18 06:04:25 morgan + * use cap_free and not free for string from cap_to_text() + * * Revision 1.1.1.1 1999/04/17 22:16:31 morgan * release 1.0 of libcap * diff --git a/progs/setpcaps.c b/progs/setpcaps.c index 9ec3d5f..7441420 100644 --- a/progs/setpcaps.c +++ b/progs/setpcaps.c @@ -1,5 +1,5 @@ /* - * $Id: setpcaps.c,v 1.1.1.1 1999/04/17 22:16:31 morgan Exp $ + * $Id: setpcaps.c,v 1.2 1999/11/18 06:04:26 morgan Exp $ * * Copyright (c) 1997-8 Andrew G. Morgan <morgan@linux.kernel.org> * @@ -101,7 +101,7 @@ int main(int argc, char **argv) result = cap_to_text(cap_d, &length); fprintf(stderr, "[caps set to:\n%s\n]\n", result); - free(result); + cap_free(result); result = NULL; } #endif @@ -127,6 +127,9 @@ int main(int argc, char **argv) /* * $Log: setpcaps.c,v $ + * Revision 1.2 1999/11/18 06:04:26 morgan + * use cap_free and not free for string from cap_to_text() + * * Revision 1.1.1.1 1999/04/17 22:16:31 morgan * release 1.0 of libcap * |