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

Tyler Hicks tyhicks at canonical.com
Tue Jun 25 21:02:54 UTC 2013


On 2013-06-25 13:58:19, John Johansen wrote:
> On 06/25/2013 01:19 PM, Tyler Hicks wrote:
> > 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().
> > 
> NAK
> 
> aa_getpeercon_raw is a shipped interface, we are not changing it with out a real
> good reason.
> 
> Taking away a useful feature because its a little odd isn't a good enough reason.
> 
> Nor is this patch correct as aa_getpeercon actually reallies on *len being
> set in the error case to do its buffer dynamic buffer allocation. With this
> patch it tries once and if it fails that is it even if it could have the
> proper size.

This is incorrect. This patch changes aa_getpeercon() to use the
internal getpeercon(), which does set *len upon error.

However, I'm not arguing for this patch. I'm just trying to get
sarnold's ack so I can move forward with this patch set (with or without
this RFC patch). :)

Tyler

> 
> 
> > 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);
> > 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20130625/1cd8eab3/attachment-0001.pgp>


More information about the AppArmor mailing list