[LIBTIRPC] Fix CVE-2017-8779 by backporting its fix
[reactos.git] / dll / 3rdparty / libtirpc / src / rpcb_prot.c
index 0b762d1..da4c2d9 100644 (file)
@@ -42,6 +42,9 @@
 #include <rpc/types.h>
 #include <rpc/xdr.h>
 #include <rpc/rpcb_prot.h>
+#ifdef __REACTOS__ // CVE-2017-8779
+#include "rpc_com.h"
+#endif
 
 bool_t
 xdr_rpcb(xdrs, objp)
@@ -54,6 +57,7 @@ xdr_rpcb(xdrs, objp)
        if (!xdr_u_int32_t(xdrs, &objp->r_vers)) {
                return (FALSE);
        }
+#ifndef __REACTOS__ // CVE-2017-8779
        if (!xdr_string(xdrs, &objp->r_netid, (u_int)~0)) {
                return (FALSE);
        }
@@ -63,6 +67,17 @@ xdr_rpcb(xdrs, objp)
        if (!xdr_string(xdrs, &objp->r_owner, (u_int)~0)) {
                return (FALSE);
        }
+#else
+       if (!xdr_string(xdrs, &objp->r_netid, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+       if (!xdr_string(xdrs, &objp->r_addr, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+       if (!xdr_string(xdrs, &objp->r_owner, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+#endif
        return (TRUE);
 }
 
@@ -160,21 +175,39 @@ xdr_rpcb_entry(xdrs, objp)
        XDR *xdrs;
        rpcb_entry *objp;
 {
+#ifndef __REACTOS__ // CVE-2017-8779
        if (!xdr_string(xdrs, &objp->r_maddr, (u_int)~0)) {
                return (FALSE);
        }
        if (!xdr_string(xdrs, &objp->r_nc_netid, (u_int)~0)) {
                return (FALSE);
        }
+#else
+       if (!xdr_string(xdrs, &objp->r_maddr, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+       if (!xdr_string(xdrs, &objp->r_nc_netid, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+#endif
        if (!xdr_u_int32_t(xdrs, &objp->r_nc_semantics)) {
                return (FALSE);
        }
+#ifndef __REACTOS__ // CVE-2017-8779
        if (!xdr_string(xdrs, &objp->r_nc_protofmly, (u_int)~0)) {
                return (FALSE);
        }
        if (!xdr_string(xdrs, &objp->r_nc_proto, (u_int)~0)) {
                return (FALSE);
        }
+#else
+       if (!xdr_string(xdrs, &objp->r_nc_protofmly, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+       if (!xdr_string(xdrs, &objp->r_nc_proto, RPC_MAXDATASIZE)) {
+               return (FALSE);
+       }
+#endif
        return (TRUE);
 }
 
@@ -293,7 +326,11 @@ xdr_rpcb_rmtcallres(xdrs, p)
        bool_t dummy;
        struct r_rpcb_rmtcallres *objp = (struct r_rpcb_rmtcallres *)(void *)p;
 
+#ifdef __REACTOS__ // CVE-2017-8779
+       if (!xdr_string(xdrs, &objp->addr, RPC_MAXDATASIZE)) {
+#else
        if (!xdr_string(xdrs, &objp->addr, (u_int)~0)) {
+#endif
                return (FALSE);
        }
        if (!xdr_u_int(xdrs, &objp->results.results_len)) {
@@ -313,6 +350,13 @@ xdr_netbuf(xdrs, objp)
        if (!xdr_u_int32_t(xdrs, (u_int32_t *) &objp->maxlen)) {
                return (FALSE);
        }
+#ifdef __REACTOS__ // CVE-2017-8779
+
+       if (objp->maxlen > RPC_MAXDATASIZE) {
+               return (FALSE);
+       }
+
+#endif
        dummy = xdr_bytes(xdrs, (char **)&(objp->buf),
                        (u_int *)&(objp->len), objp->maxlen);
        return (dummy);