From: "Eric W. Biederman" <ebied...@xmission.com>

This allows concentrating all of the conversion to and from kuids and
kgids into the format needed by the 9p protocol into one location.

Cc: Eric Van Hensbergen <eri...@gmail.com>
Cc: Ron Minnich <rminn...@gmail.com>
Cc: Latchesar Ionkov <lu...@ionkov.net>
Signed-off-by: "Eric W. Biederman" <ebied...@xmission.com>
---
 net/9p/protocol.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/net/9p/protocol.c b/net/9p/protocol.c
index 3d33ecf..c289c6c 100644
--- a/net/9p/protocol.c
+++ b/net/9p/protocol.c
@@ -85,6 +85,8 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, 
size_t size)
        d - int32_t
        q - int64_t
        s - string
+       u - numeric uid
+       g - numeric gid
        S - stat
        Q - qid
        D - data blob (int32_t size followed by void *, results are not freed)
@@ -163,6 +165,26 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, 
const char *fmt,
                                        (*sptr)[len] = 0;
                        }
                        break;
+               case 'u': {
+                               kuid_t *uid = va_arg(ap, kuid_t *);
+                               __le32 le_val;
+                               if (pdu_read(pdu, &le_val, sizeof(le_val))) {
+                                       errcode = -EFAULT;
+                                       break;
+                               }
+                               *uid = make_kuid(&init_user_ns,
+                                                le32_to_cpu(le_val));
+                       } break;
+               case 'g': {
+                               kgid_t *gid = va_arg(ap, kgid_t *);
+                               __le32 le_val;
+                               if (pdu_read(pdu, &le_val, sizeof(le_val))) {
+                                       errcode = -EFAULT;
+                                       break;
+                               }
+                               *gid = make_kgid(&init_user_ns,
+                                                le32_to_cpu(le_val));
+                       } break;
                case 'Q':{
                                struct p9_qid *qid =
                                    va_arg(ap, struct p9_qid *);
@@ -377,6 +399,20 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, 
const char *fmt,
                                        errcode = -EFAULT;
                        }
                        break;
+               case 'u': {
+                               kuid_t uid = va_arg(ap, kuid_t);
+                               __le32 val = cpu_to_le32(
+                                               from_kuid(&init_user_ns, uid));
+                               if (pdu_write(pdu, &val, sizeof(val)))
+                                       errcode = -EFAULT;
+                       } break;
+               case 'g': {
+                               kgid_t gid = va_arg(ap, kgid_t);
+                               __le32 val = cpu_to_le32(
+                                               from_kgid(&init_user_ns, gid));
+                               if (pdu_write(pdu, &val, sizeof(val)))
+                                       errcode = -EFAULT;
+                       } break;
                case 'Q':{
                                const struct p9_qid *qid =
                                    va_arg(ap, const struct p9_qid *);
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to