[apparmor] [PATCH 4/7] libapparmor: Parse mode from confinement string in getpeercon functions
Tyler Hicks
tyhicks at canonical.com
Sun Jun 23 23:23:16 UTC 2013
The functions that return the confinement information of a peer socket
connection should parse and return the mode like the task-based
functions.
Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
---
libraries/libapparmor/src/apparmor.h | 4 ++--
libraries/libapparmor/src/kernel_interface.c | 16 +++++++++++++---
libraries/libapparmor/swig/SWIG/libapparmor.i | 4 ++--
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/libraries/libapparmor/src/apparmor.h b/libraries/libapparmor/src/apparmor.h
index c93bee8..142d1e1 100644
--- a/libraries/libapparmor/src/apparmor.h
+++ b/libraries/libapparmor/src/apparmor.h
@@ -48,8 +48,8 @@ extern int aa_getprocattr_raw(pid_t tid, const char *attr, char *buf, int len,
extern int aa_getprocattr(pid_t tid, const char *attr, char **buf, char **mode);
extern int aa_gettaskcon(pid_t target, char **con, char **mode);
extern int aa_getcon(char **con, char **mode);
-extern int aa_getpeercon_raw(int fd, char *buffer, int *size);
-extern int aa_getpeercon(int fd, char **con);
+extern int aa_getpeercon_raw(int fd, char *buffer, int *size, char **mode);
+extern int aa_getpeercon(int fd, char **con, char **mode);
#define __macroarg_counter(Y...) __macroarg_count1 ( , ##Y)
#define __macroarg_count1(Y...) __macroarg_count2 (Y, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
diff --git a/libraries/libapparmor/src/kernel_interface.c b/libraries/libapparmor/src/kernel_interface.c
index afb51b5..0c02d15 100644
--- a/libraries/libapparmor/src/kernel_interface.c
+++ b/libraries/libapparmor/src/kernel_interface.c
@@ -563,13 +563,15 @@ int aa_getcon(char **con, char **mode)
* @fd: socket to get peer confinement for
* @con: pointer to buffer to store confinement string
* @size: initially contains size of the buffer, returns size of data read
+ * @mode: if set will point to mode string within buffer if it is present
*
* Returns: length of confinement data including null termination or -1 on error
* if errno == ERANGE then @size will hold the size needed
*/
-int aa_getpeercon_raw(int fd, char *buffer, int *size)
+int aa_getpeercon_raw(int fd, char *buffer, int *size, char **mode)
{
socklen_t optlen = *size;
+ char *mode_str;
int rc;
if (optlen <= 0 || buffer == NULL) {
@@ -591,9 +593,14 @@ int aa_getpeercon_raw(int fd, char *buffer, int *size)
rc = -1;
errno = ERANGE;
optlen++;
+ goto out;
}
}
+ mode_str = parse_confinement_mode(buffer, optlen);
+ if (mode)
+ *mode = mode_str;
+
rc = optlen;
out:
*size = optlen;
@@ -604,12 +611,13 @@ out:
* aa_getpeercon - get the confinement of the socket's peer (other end)
* @fd: socket to get peer confinement for
* @con: pointer to allocated buffer with the confinement string
+ * @mode: if provided will point to the mode string in @con if present
*
* Returns: length of confinement data including null termination or -1 on error
*
* Caller is responsible for freeing the buffer returned.
*/
-int aa_getpeercon(int fd, char **con)
+int aa_getpeercon(int fd, char **con, char **mode)
{
int rc, last_size, size = INITIAL_GUESS_SIZE;
char *buffer = NULL;
@@ -626,13 +634,15 @@ int aa_getpeercon(int fd, char **con)
return -1;
memset(buffer, 0, size);
- rc = aa_getpeercon_raw(fd, buffer, &size);
+ rc = aa_getpeercon_raw(fd, buffer, &size, mode);
/* size should contain actual size needed if errno == ERANGE */
} while (rc == -1 && errno == ERANGE && size > last_size);
if (rc == -1) {
free(buffer);
*con = NULL;
+ if (mode)
+ *mode = NULL;
size = -1;
} else
*con = buffer;
diff --git a/libraries/libapparmor/swig/SWIG/libapparmor.i b/libraries/libapparmor/swig/SWIG/libapparmor.i
index f0ebf5a..13b86b8 100644
--- a/libraries/libapparmor/swig/SWIG/libapparmor.i
+++ b/libraries/libapparmor/swig/SWIG/libapparmor.i
@@ -25,5 +25,5 @@ extern int aa_getprocattr_raw(pid_t tid, const char *attr, char *buf, int len,
extern int aa_getprocattr(pid_t tid, const char *attr, char **buf, char **mode);
extern int aa_gettaskcon(pid_t target, char **con, char **mode);
extern int aa_getcon(char **con, char **mode);
-extern int aa_getpeercon_raw(int fd, char *buffer, int *size);
-extern int aa_getpeercon(int fd, char **con);
+extern int aa_getpeercon_raw(int fd, char *buffer, int *size, char **mode);
+extern int aa_getpeercon(int fd, char **con, char **mode);
--
1.8.1.2
More information about the AppArmor
mailing list