[apparmor] [RFC] libapparmor: Don't expose a value-result param in aa_getpeercon_raw()

Tyler Hicks tyhicks at canonical.com
Tue Jun 25 20:19:17 UTC 2013


Unify aa_getprocattr_raw() and aa_getpeercon_raw() function prototypes
by hiding the len value-result parameter.

Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
Cc: Seth Arnold <seth.arnold at canonical.com>
Cc: John Johansen <john.johansen at canonical.com>
---

Code speaks louder and more clearly than my poor explanation, so here's an RFC
patch on the idea.

I think that this addresses Seth's distaste of the len parameter. It makes the
libapparmor API a little more predictable, but hides a useful feature of the
getsockopt() syscall which will make external callers guess at buffer
reallocation sizes (but they already do that with aa_getprocattr_raw()).

I'm fine with or without this patch, as I don't expect (m)any applications to
use aa_getpeercon_raw().

Tyler

 libraries/libapparmor/doc/aa_getcon.pod       |  8 +-------
 libraries/libapparmor/src/apparmor.h          |  2 +-
 libraries/libapparmor/src/kernel_interface.c  | 23 ++++++++++++++++++++---
 libraries/libapparmor/swig/SWIG/libapparmor.i |  2 +-
 4 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/libraries/libapparmor/doc/aa_getcon.pod b/libraries/libapparmor/doc/aa_getcon.pod
index d7f2ba6..e0a97e5 100644
--- a/libraries/libapparmor/doc/aa_getcon.pod
+++ b/libraries/libapparmor/doc/aa_getcon.pod
@@ -41,7 +41,7 @@ B<int aa_gettaskcon(pid_t target, char **con, char **mode);>
 
 B<int aa_getcon(char **con, char **mode);>
 
-B<int aa_getpeercon_raw(int fd, char *buf, int *len, char **mode);>
+B<int aa_getpeercon_raw(int fd, char *buf, int len, char **mode);>
 
 B<int aa_getpeercon(int fd, char **con, char **mode);>
 
@@ -105,12 +105,6 @@ The confinement data is too large to fit in the supplied buffer.
 
 =back
 
-=head1 NOTES
-
-If aa_getpeercon_raw returns -1 and errno is ERANGE, the value of size can be
-used to reallocate buf so that it is sufficiently large enough to store the
-confinement data.
-
 =head1 BUGS
 
 None known. If you find any, please report them at
diff --git a/libraries/libapparmor/src/apparmor.h b/libraries/libapparmor/src/apparmor.h
index 79bc69c..f781fb7 100644
--- a/libraries/libapparmor/src/apparmor.h
+++ b/libraries/libapparmor/src/apparmor.h
@@ -48,7 +48,7 @@ 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 *buf, int *len, char **mode);
+extern int aa_getpeercon_raw(int fd, char *buf, int len, char **mode);
 extern int aa_getpeercon(int fd, char **con, char **mode);
 
 #define __macroarg_counter(Y...) __macroarg_count1 ( , ##Y)
diff --git a/libraries/libapparmor/src/kernel_interface.c b/libraries/libapparmor/src/kernel_interface.c
index 7524188..59e6c82 100644
--- a/libraries/libapparmor/src/kernel_interface.c
+++ b/libraries/libapparmor/src/kernel_interface.c
@@ -559,7 +559,7 @@ int aa_getcon(char **con, char **mode)
 #endif
 
 /**
- * aa_getpeercon_raw - get the confinement of the socket's peer (other end)
+ * getpeercon_raw - get the confinement of the socket's peer (other end)
  * @fd: socket to get peer confinement for
  * @buf: buffer to store the result in
  * @len: initially contains size of the buffer, returns size of data read
@@ -568,7 +568,7 @@ int aa_getcon(char **con, char **mode)
  * Returns: length of confinement data including null termination or -1 on error
  *          if errno == ERANGE then @len will hold the size needed
  */
-int aa_getpeercon_raw(int fd, char *buf, int *len, char **mode)
+static int getpeercon_raw(int fd, char *buf, int *len, char **mode)
 {
 	socklen_t optlen = *len;
 	char *mode_str;
@@ -608,6 +608,23 @@ out:
 }
 
 /**
+ * aa_getpeercon_raw - get the confinement of the socket's peer (other end)
+ * @fd: socket to get peer confinement for
+ * @buf: buffer to store the result in
+ * @len: the size of the buffer
+ * @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
+ */
+
+int aa_getpeercon_raw(int fd, char *buf, int len, char **mode)
+{
+	int l = len;
+
+	return getpeercon_raw(fd, buf, &l, mode);
+}
+
+/**
  * 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
@@ -634,7 +651,7 @@ int aa_getpeercon(int fd, char **con, char **mode)
 			return -1;
 		memset(buffer, 0, size);
 
-		rc = aa_getpeercon_raw(fd, buffer, &size, mode);
+		rc = getpeercon_raw(fd, buffer, &size, mode);
 		/* size should contain actual size needed if errno == ERANGE */
 	} while (rc == -1 && errno == ERANGE && size > last_size);
 
diff --git a/libraries/libapparmor/swig/SWIG/libapparmor.i b/libraries/libapparmor/swig/SWIG/libapparmor.i
index 1d3ca07..a65dd28 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 *buf, int *len, char **mode);
+extern int aa_getpeercon_raw(int fd, char *buf, int len, char **mode);
 extern int aa_getpeercon(int fd, char **con, char **mode);
-- 
1.8.1.2




More information about the AppArmor mailing list