upstream: Use strtonum() instead of severely non-idomatic

strtoul() In particular this will now reject trailing garbage, ie.
'12garbage'. ok djm

OpenBSD-Commit-ID: c82d95e3ccbfedfc91a8041c2f8bf0cf987d1501
This commit is contained in:
deraadt@openbsd.org 2024-04-02 09:29:31 +00:00 committed by Damien Miller
parent 8231ca046f
commit 019a5f483b
No known key found for this signature in database
1 changed files with 7 additions and 5 deletions

12
addr.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: addr.c,v 1.7 2023/03/27 03:31:05 djm Exp $ */ /* $OpenBSD: addr.c,v 1.8 2024/04/02 09:29:31 deraadt Exp $ */
/* /*
* Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org> * Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org>
@ -27,6 +27,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <limits.h>
#include "addr.h" #include "addr.h"
@ -457,8 +458,9 @@ int
addr_pton_cidr(const char *p, struct xaddr *n, u_int *l) addr_pton_cidr(const char *p, struct xaddr *n, u_int *l)
{ {
struct xaddr tmp; struct xaddr tmp;
long unsigned int masklen = 999; u_int masklen = 999;
char addrbuf[64], *mp, *cp; char addrbuf[64], *mp;
const char *errstr;
/* Don't modify argument */ /* Don't modify argument */
if (p == NULL || strlcpy(addrbuf, p, sizeof(addrbuf)) >= sizeof(addrbuf)) if (p == NULL || strlcpy(addrbuf, p, sizeof(addrbuf)) >= sizeof(addrbuf))
@ -467,8 +469,8 @@ addr_pton_cidr(const char *p, struct xaddr *n, u_int *l)
if ((mp = strchr(addrbuf, '/')) != NULL) { if ((mp = strchr(addrbuf, '/')) != NULL) {
*mp = '\0'; *mp = '\0';
mp++; mp++;
masklen = strtoul(mp, &cp, 10); masklen = (u_int)strtonum(mp, 0, INT_MAX, &errstr);
if (*mp < '0' || *mp > '9' || *cp != '\0' || masklen > 128) if (errstr)
return -1; return -1;
} }