Module Name:    src
Committed By:   yamaguchi
Date:           Fri Sep 25 06:22:33 UTC 2020

Modified Files:
        src/sys/net: if_pppoe.c

Log Message:
Add a function to copy AC-Name and Service-Name


To generate a diff of this commit:
cvs rdiff -u -r1.152 -r1.153 src/sys/net/if_pppoe.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_pppoe.c
diff -u src/sys/net/if_pppoe.c:1.152 src/sys/net/if_pppoe.c:1.153
--- src/sys/net/if_pppoe.c:1.152	Fri Sep 25 06:12:33 2020
+++ src/sys/net/if_pppoe.c	Fri Sep 25 06:22:33 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_pppoe.c,v 1.152 2020/09/25 06:12:33 yamaguchi Exp $ */
+/* $NetBSD: if_pppoe.c,v 1.153 2020/09/25 06:22:33 yamaguchi Exp $ */
 
 /*
  * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.152 2020/09/25 06:12:33 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.153 2020/09/25 06:22:33 yamaguchi Exp $");
 
 #ifdef _KERNEL_OPT
 #include "pppoe.h"
@@ -1192,6 +1192,52 @@ pppoe_output(struct pppoe_softc *sc, str
 }
 
 static int
+pppoe_parm_cpyinstr(struct pppoe_softc *sc,
+    char **dst, const void *src, size_t len)
+{
+	int error = 0;
+	char *next = NULL;
+	size_t bufsiz, cpysiz, strsiz;
+
+	bufsiz = len + 1;
+
+	if (src == NULL)
+		goto out;
+
+	bufsiz = len + 1;
+	next = malloc(bufsiz, M_DEVBUF, M_WAITOK);
+	if (next == NULL)
+		return ENOMEM;
+
+	error = copyinstr(src, next, bufsiz, &cpysiz);
+	if (error != 0)
+		goto fail;
+	if (cpysiz != bufsiz) {
+		error = EINVAL;
+		goto fail;
+	}
+
+	strsiz = strnlen(next, bufsiz);
+	if (strsiz == bufsiz) {
+		error = EINVAL;
+		goto fail;
+	}
+
+out:
+	PPPOE_LOCK(sc, RW_WRITER);
+	if (*dst != NULL)
+		free(*dst, M_DEVBUF);
+	*dst = next;
+	next = NULL;
+	PPPOE_UNLOCK(sc);
+fail:
+	if (next != NULL)
+		free(next, M_DEVBUF);
+
+	return error;
+}
+
+static int
 pppoe_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
 {
 	struct lwp *l = curlwp;	/* XXX */
@@ -1226,60 +1272,16 @@ pppoe_ioctl(struct ifnet *ifp, unsigned 
 			sc->sc_eth_if = eth_if;
 			PPPOE_UNLOCK(sc);
 		}
-		if (parms->ac_name != NULL) {
-			size_t s;
-			char *b = malloc(parms->ac_name_len + 1, M_DEVBUF,
-			    M_WAITOK);
-			if (b == NULL)
-				return ENOMEM;
-			error = copyinstr(parms->ac_name, b,
-			    parms->ac_name_len+1, &s);
-			if (error != 0) {
-				free(b, M_DEVBUF);
-				return error;
-			}
-			if (s != parms->ac_name_len+1) {
-				free(b, M_DEVBUF);
-				return EINVAL;
-			}
 
-			PPPOE_LOCK(sc, RW_WRITER);
-			if (sc->sc_concentrator_name)
-				free(sc->sc_concentrator_name, M_DEVBUF);
-			sc->sc_concentrator_name = b;
-			PPPOE_UNLOCK(sc);
-		} else {
-			if (sc->sc_concentrator_name)
-				free(sc->sc_concentrator_name, M_DEVBUF);
-			sc->sc_concentrator_name = NULL;
-		}
-		if (parms->service_name != NULL) {
-			size_t s;
-			char *b = malloc(parms->service_name_len + 1, M_DEVBUF,
-			    M_WAITOK);
-			if (b == NULL)
-				return ENOMEM;
-			error = copyinstr(parms->service_name, b,
-			    parms->service_name_len+1, &s);
-			if (error != 0) {
-				free(b, M_DEVBUF);
-				return error;
-			}
-			if (s != parms->service_name_len+1) {
-				free(b, M_DEVBUF);
-				return EINVAL;
-			}
-
-			PPPOE_LOCK(sc, RW_WRITER);
-			if (sc->sc_service_name)
-				free(sc->sc_service_name, M_DEVBUF);
-			sc->sc_service_name = b;
-			PPPOE_UNLOCK(sc);
-		} else {
-			if (sc->sc_service_name)
-				free(sc->sc_service_name, M_DEVBUF);
-			sc->sc_service_name = NULL;
-		}
+		error = pppoe_parm_cpyinstr(sc, &sc->sc_concentrator_name,
+		    parms->ac_name, parms->ac_name_len);
+		if (error != 0)
+			return error;
+
+		error = pppoe_parm_cpyinstr(sc, &sc->sc_service_name,
+		    parms->service_name, parms->service_name_len);
+		if (error != 0)
+			return error;
 		return 0;
 	}
 	break;

Reply via email to